按照Ant或Webstart的要求,从自定义类加载器使用javax.tools.ToolProvider似乎是不可能的:http://bugs.sun.com/view_bug.do?bug_id=6548428
javax.tools.ToolProvider.getSystemJavaCompiler()javax.tools.JavaCompiler加载到URLClassLoader中,该URLClassLoader的父级是系统类加载器。该API似乎不允许用户指定父类加载器。

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

例如:

  • Ant加载MyParserTask
  • MyParserTask解析Java源代码
  • MyParserTask由代表系统类加载器
  • AntClassLoader加载。
  • javax.tools.JavaCompiler加载到系统类加载器


  • 稍后,URLClassLoader调用:
    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
    
  • 看到两个类如何驻留在单独的类加载器上,似乎没有一种方法使MyParserTaskMyParserTask交互而不会出现JavacTask错误。

  • 有任何想法吗?

    最佳答案

    我有完全一样的问题。我正在使用一个自定义ant任务来扫描AST,以查找某些类型的方法调用。我的解决方案(可能不适合您)是自己实例化编译器,而不是使用ToolProvider。

    我更换了
    JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();

    JavaCompiler compiler = (JavaCompiler)Class.forName("com.sun.tools.javac.api.JavacTool").newInstance();
    当然,这并不是在所有环境中都适用于 future ,也不是安全的,但是可以根据您的需要选择。如果其他人有更好的方法在自定义Ant任务中使用ToolProvider,请分享。

    10-07 12:03