2009-10-14 12 views

Antwort

36

Die javax.tools.JavaCompiler#getTask()-Methode verwendet einen options-Parameter, mit dem Compileroptionen festgelegt werden können. Die folgende message beschreibt eine einfache Möglichkeit, sie zu setzen, um das aufrufende Programm des Classpath zuzugreifen:

Sie benötigen die Standard Java-Datei-Manager zu konfigurieren, über die JAR-Dateien kennen (en) - Sie verwenden den Compiler Optionen Argument dafür zu tun.

standardmäßig das Java-Compiler Objekt nur über den Standard Standorte für bootclasspath scheint zu wissen, extdirs und endorseddirs Verzeichnisse in Bezug seines Classpath.

Sie müssen das rufende Programm des aktuellen Classpath an den Java-Compiler Instanz hinzuzufügen, die auf dem den Standard-Dateimanager übergeben wird, das wird dann Klassen in den JAR-Dateien finden.

Hier ist, wie ich es tun in the compiler wrapper I wrote

List<String> optionList = new ArrayList<String>(); 
// set compiler's classpath to be same as the runtime's 
optionList.addAll(Arrays.asList("-classpath",System.getProperty("java.class.path"))); 

// any other options you want 
optionList.addAll(Arrays.asList(options)); 

JavaCompiler.CompilationTask task = compiler.getTask(out,jfm,diagnostics,optionList,null,jfos); 

Alles, was Sie dann brauchen, ist die richtige Classpath-Set zu erhalten, wenn das aufrufende Programm läuft.

+0

Satheesh geschrieben dies als eine Antwort, "Würden Sie in der Lage sein, Ihre Compiler-Wrapper (Link funktioniert nicht) Dank im Voraus." –

+0

Vielen Dank eine Mühle für diesen Beitrag, ich habe mit diesem seit Ewigkeiten gekämpft und das war die Antwort ... Prost :) – flexinIT

+2

BTW, "Classpath" -Option von 'JavaCompiler'" versteht "keine Platzhalter. Also muss jedes "Jar" ​​direkt in diese Zeichenfolge eingefügt werden. – Andremoniy

2

Das gleiche Problem trat vor kurzem auf, schließlich fand ich zwei Problemumgehungen. Sie können den Klassenpfad setzen entweder aufrufen, indem StandardJavaFileManager.setLocation (StandardLocation.CLASS_PATH "YOUR_CLASS_PATH") oder Compiler.getTask (ARG_0, Arg_1, ARG_2, CLASS_PATH_OPTIONS, als nur die erste Antwort gepostet hier sagt.

+0

Um dies zum Laufen zu bringen, musste ich 'StandardJavaFileManager.setLocation (StandardLocation.CLASS_PATH, Arrays.asList (neue Datei (Klassenpfad)));' –