Mein Anwendungsfall kompiliert generierte Quelldateien aus einem Java-Programm mit den Klassen ToolProvider und JavaCompiler in JDK 6. Die Quelldateien enthalten Verweise auf Klassen im Context Classloader (es läuft in einem J2EE-Container), aber nicht im System Klassenlader. Nach meinem Verständnis erstellt der ToolProvider standardmäßig die JavaCompiler-Instanz mit dem System-Classloader.Wie verwende ich JDK6 ToolProvider und JavaCompiler mit dem Context Classloader?
Gibt es eine Möglichkeit, einen Klassenlader für JavaCompiler zu spezifizieren?
habe ich versucht, diesen Ansatz, von etwas auf IBM Developerworks geändert:
FileManagerImpl fm =
new FileManagerImpl(compiler.getStandardFileManager(null, null, null););
mit FileManagerImpl wie folgt definiert:
static final class FileManagerImpl
extends ForwardingJavaFileManager<JavaFileManager> {
public FileManagerImpl(JavaFileManager fileManager) {
super(fileManager);
}
@Override
public ClassLoader getClassLoader(JavaFileManager.Location location) {
new Exception().printStackTrace();
return Thread.currentThread().getContextClassLoader();
}
}
Der Stacktrace gibt es nur einmal während Annotation Verarbeitung aufgerufen wird. Ich habe überprüft, dass die Klasse, auf die in der Quelldatei verwiesen wird, die kompiliert werden soll, nicht auf dem Systemklassenpfad liegt, sondern aus dem Kontextklassenlader verfügbar ist.
Es scheint nicht, dass JCI Ihnen erlaubt, einen Klassenlader nur in Pfaden zu übergeben, genau wie es die JDK6-Unterstützung erlaubt. – Phil
Wo haben Sie gesucht? Sicher tut es. – tcurdt