【问题标题】:Use of javax.tools to compile java source at Runtime?在运行时使用 javax.tools 编译 java 源?
【发布时间】:2012-11-21 18:21:16
【问题描述】:

所以,java 有一个专门用于将 java 源代码编译成 .class 文件的内置库,它位于javax.tools。所以,我想知道你是如何让它工作的。我已经阅读了 javadoc,其中给出了一些示例,但是当我使用这些示例时,我得到了错误。

JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
DiagnosticCollector<JavaFileObject> diagnostics = new DiagnosticCollector<JavaFileObject>();
StandardJavaFileManager fileManager = compiler.getStandardFileManager(diagnostics, null, null);

这是 oracle 给出的示例,用于获取 StandardJavaFileManager 类的实例,您可以从中做更多的事情。但是,我对该代码的第一行有一些问题。当我尝试做ToolProvider.getSystemJavaCompiler(); 时,它总是返回null。在该方法的 javadocs 中,它说,“返回随此平台提供的编译器,如果没有提供编译器,则返回 null。”但他们从未展示过任何其他获取JavaCompiler 实例的方法。我尝试了许多其他方法,例如使用ServiceLoader 找到我可以找到的任何参考,但没有占上风。我怎样才能让它发挥作用?

【问题讨论】:

标签: java compilation


【解决方案1】:

编译通常是直接调用javac编译器,需要安装Java Development Kit (JDK)或者调用com.sun.tools.javac.Main,可以找到在 Sun 的 tools.jar 中。 Sun 的许可允许使用完整的 Java 运行时环境 (JRE) 重新分发 tools.jar。实现此类动态功能的其他方法包括使用与应用程序的实现语言(请参阅参考资料)集成的现有动态脚本语言(例如 JavaScript 或 Groovy)或编写特定领域的语言和相关的语言解释器或编译器。

【讨论】:

    【解决方案2】:

    您可能是从 JRE 目录而不是 JDK 目录运行 Java - 您需要运行“知道”Java 编译器所在位置的版本。

    例如,在我的 Windows 拳击上,运行一个像这样的小型测试应用程序:

    import javax.tools.*;
    
    class Test {
        public static void main(String[] args) {
            JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
            System.out.println(compiler);
        }
    }
    

    结果是:

    c:\Users\Jon\Test>"\Program Files\Java\jdk1.7.0_09"\bin\java Test
    com.sun.tools.javac.api.JavacTool@1e0f2f6
    
    c:\Users\Jon\Test>"\Program Files\Java\jre7\bin\java" Test
    null
    

    如您所见,当我专门运行 JDK 版本时很好,但运行 JRE 版本时我得到 null。检查您是如何启动 Java 的。

    【讨论】:

    • 好吧,那么,使用 Eclipse,我如何将其更改为使用我的 JDK 而不是我的 JRE?
    • @StevenFontaine:查看您的项目属性 - 这将显示您正在构建和运行的环境。 (您可能可以为运行配置单独更改它,但您可能只想为项目更改一个......甚至您的工作区默认值。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多