从自定义类装载器使用javax.tools.ToolProvider? [英] Using javax.tools.ToolProvider from a custom classloader?

查看:1092
本文介绍了从自定义类装载器使用javax.tools.ToolProvider?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

似乎不可能使用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-code
  • MyParserTask is loaded by AntClassLoader that delegates to the system classloader
  • javax.tools.JavaCompiler is loaded by URLClassLoader 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 with JavacTask without getting ClassCastException 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆