我的用例是使用JDK 6中提供的ToolProvider和JavaCompiler類從Java程序編譯生成的源文件。源文件包含上下文classloader中的類的引用(它運行在J2EE容器中),但不包含在系統中類加載器。我的理解是,默認情況下,ToolProvider將使用系統類加載器創建JavaCompiler實例。如何在上下文類加載器中使用JDK6 ToolProvider和JavaCompiler?
有沒有辦法指定JavaCompiler的類加載器使用?
我試過這種方法,從修改的東西在IBM developerWorks上:
FileManagerImpl fm =
new FileManagerImpl(compiler.getStandardFileManager(null, null, null););
與FileManagerImpl定義爲:
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();
}
}
堆棧跟蹤表明它註釋處理過程中的唯一調用一次。我驗證了要編譯的源文件中引用的類不在系統類路徑中,但可從上下文類加載器中獲得。
JCI不允許您像JDK6支持允許的那樣僅在路徑中傳遞類加載器。 – Phil 2008-12-29 18:50:47