我的使用情况是使用JDK 6中提供的ToolProvider和JavaCompiler类编译由Java程序生成的源文件。这些源文件包含对上下文类加载器(它在J2EE容器中运行)中的类的引用,但不包含系统类加载器中的类。据我了解,默认情况下,ToolProvider将使用系统类加载器创建JavaCompiler实例。
有没有办法指定JavaCompiler要使用的类加载器?
我尝试了这种方法,它是从IBM DeveloperWorks上的某个内容修改而来:
有没有办法指定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();
}
}
堆栈跟踪表明,它只在注释处理期间被调用一次。我验证了源文件中引用的类不在系统类路径上,但可以从上下文类加载器中获取。