从自定义类装载器使用javax.tools.ToolProvider? [英] Using javax.tools.ToolProvider from a custom classloader?
问题描述
似乎不可能使用Ant或Webstart所需的自定义类加载器中的 javax.tools.ToolProvider
: http://bugs.sun.com/view_bug.do?bug_id=6548428
It seems to be impossible to use javax.tools.ToolProvider
from a custom classloader as required by Ant or Webstart: http://bugs.sun.com/view_bug.do?bug_id=6548428
javax.tools.ToolProvider.getSystemJavaCompiler()
将 javax.tools.JavaCompiler
载入URLClassLoader parent是系统类加载器。 API似乎不允许用户指定父类加载器。
javax.tools.ToolProvider.getSystemJavaCompiler()
loads javax.tools.JavaCompiler
into a URLClassLoader whose parent is the system classloader. The API does not seem to allow users to specify a parent classloader.
如何使用 javax.tools.JavaCompiler
来自自定义类加载器?
How can one use javax.tools.JavaCompiler
from a custom classloader?
例如:
- Ant加载
MyParserTask
-
MyParserTask
解析Java源代码 -
由委托给系统类加载器的
>AntClassLoader
加载MyParserTask
-
javax.tools.JavaCompiler
由URLClassLoader
加载到系统classloader
- Ant loads
MyParserTask
MyParserTask
parses Java source-codeMyParserTask
is loaded byAntClassLoader
that delegates to the system classloaderjavax.tools.JavaCompiler
is loaded byURLClassLoader
thast delegates to the system classloader
稍后, 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
- 查看两个类如何驻留在单独的类加载器,似乎没有办法
MyParserTask
与JavacTask
交互,而不会得到ClassCastException
错误。 - Seeing how the two classes reside on separate classloaders, there doesn't seem to be a way for
MyParserTask
to interact withJavacTask
without gettingClassCastException
errors.
任何想法?
推荐答案
我有同样的问题。我使用自定义ant任务来扫描AST的某些种类的方法调用。
I had exactly the same problem. I'm using a custom ant task to scan the AST for certain kinds of method invocations. My solution, which may not be appropriate for you, was to instantiate the compiler myself instead of using the ToolProvider.
我替换了
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
与
JavaCompiler compiler =(JavaCompiler)Class.forName(com.sun.tools.javac.api.JavacTool)。newInstance();
这当然不是未来的证明或在所有环境中的安全,但它是一个选项,根据您的需要。如果别人在自定义Ant任务中使用ToolProvider有更好的方法,请分享。
This certainly isn't future proof or safe in all environments, but it is an option depending on your needs. If someone else has a better way around using ToolProvider in custom Ant tasks please share.
这篇关于从自定义类装载器使用javax.tools.ToolProvider?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!