2012-04-02 17 views
1

mein JavaCompiler gibt einen Nullzeiger, wenn sie aus einer JAR-Datei bezeichnet.JavaCompiler von innen ein Glas

Alles funktioniert gut, wenn ich mein Programm mit dem JavaCompiler von der Kommandozeile ausgeführt werden. Also das JDK richtig auf meinem Betriebssystem installiert.

Warum funktioniert es nicht?

Code:

JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); 
StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null); 
Iterable<String> options = Arrays.asList(new String[] { "-d", currentDir+"/cache/","-sourcepath",currentDir+"/srcss/"}); 
Iterable<? extends JavaFileObject> compUnits = fileManager.getJavaFileObjects(fRun); 
Boolean compRes = compiler.getTask(null, fileManager, null, options, null, compUnits).call(); 

Antwort

2

Sie müssen sicherstellen, dass Sie die gleiche Laufzeit verwenden, wenn die Anwendung als ein Glas zu starten.

Wenn Sie es als eigenständige Anwendung starten, verwenden Sie wahrscheinlich aus einer einfachen JRE-Installation. Wenn Sie es von einer IDE aus ausführen, verwenden Sie höchstwahrscheinlich eine aus dem JDK.

Sie könnten System.out.println(System.getProperty("java.home")); tun dies zu debuggen.

+0

Aber mein System ist auf das JDK eingestellt. Wenn ich mein Programm über die Befehlszeile starte, startet es vom JDK. Wie setze ich das JAR auf JDK? – ctekk

+0

Drucken Sie die von 'System.getProperty (" java.home ")' zurückgegebene Zeichenfolge in Ihrer Anwendung und prüfen Sie, ob sie sich unterscheidet. – aioobe

0

Es ist Ihre eigene Bereitstellung (auf Ihrem eigenen Computer), das Problem kann durch explizites Hinzufügen der tools.jar des SDK zum Laufzeitklassenpfad Ihrer Anwendung gelöst werden (z. B. im Manifest).

Alternative Strategien können im STBC configuration gesehen (oder zumindest angedeutet) werden. Wenn Sie mehr Informationen benötigen. Auf diese, lass es mich wissen.

0

Nach meinem Verständnis, JavaCompiler Compiler = ToolProvider.getSystemJavaCompiler(); Gibt den Griff zu Java-Compiler nur dann, wenn seine beign unter und JDK Verteilung ausgeführt.

, wenn Sie es unter JRE verwenden (wie wir normalerweise nur unter JRE ausführen), es würde null zurück, könnten Sie bitte bestätigen, dass wir es von JDK anrufen oder es enthält die entsprechende JAR-Datei anstelle

Verwandte Themen