相关疑难解决方法(0)

如何将JDK6 ToolProvider和JavaCompiler与上下文类加载器一起使用?

我的用例是使用JDK 6中提供的ToolProvider和JavaCompiler类从java程序编译生成的源文件.源文件包含对上下文类加载器中的类的引用(它在J2EE容器中运行),但不包含在系统类加载器中.我的理解是,默认情况下,ToolProvider将使用系统类加载器创建JavaCompiler实例.

有没有办法为JavaCompiler指定一个类加载器?

我尝试了这种方法,从IBM DeveloperWorks上的某些东西进行了修改:

FileManagerImpl fm = 
    new FileManagerImpl(compiler.getStandardFileManager(null, null, null););
Run Code Online (Sandbox Code Playgroud)

将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();
   }

}
Run Code Online (Sandbox Code Playgroud)

堆栈跟踪表明它仅在注释处理期间调用一次.我验证了要编译的源文件中引用的类不在系统类路径中,但可以从上下文类加载器中获得.

java javac classloader java-compiler-api

6
推荐指数
2
解决办法
6288
查看次数

使用自定义类加载器中的javax.tools.ToolProvider?

似乎无法使用javax.tools.ToolProviderAnt或Webstart所需的自定义类加载器:http://bugs.sun.com/view_bug.do?video_id = 6548428

javax.tools.ToolProvider.getSystemJavaCompiler()加载javax.tools.JavaCompiler到URLClassLoader中,其父级是系统类加载器.API似乎不允许用户指定父类加载器.

如何使用javax.tools.JavaCompiler自定义类加载器?

例如:

  • Ant加载 MyParserTask
  • MyParserTask 解析Java源代码
  • MyParserTaskAntClassLoader该委托加载到系统类加载器
  • javax.tools.JavaCompilerURLClassLoader代理加载到系统类加载器

稍后,MyParserTask调用:

javax.tools.CompilationTask task = compiler.getTask(...);
com.sun.source.util.JavacTask javacTask = (com.sun.source.util.JavacTask) task;
javacTask.parse().next().accept(visitor, unused); // parsing happens here
Run Code Online (Sandbox Code Playgroud)
  • 看到这两个类如何驻留在不同的类加载器上,似乎没有一种方法可以MyParserTaskJavacTaskClassCastException出错的情况下进行交互.

有任何想法吗?

java compiler-construction casting classloader

6
推荐指数
1
解决办法
2681
查看次数