使用javax.tools在运行时编译java源代码?

时间:2012-12-04 06:53:58

标签: java compilation

因此,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。在该方法的javadoc中,它表示“返回此平台提供的编译器,如果没有提供编译器,则返回null。”但他们从未表现出获得JavaCompiler实例的任何其他方式。我已经尝试了许多其他方法,例如使用ServiceLoader来找到我能够提供的任何参考,但不会占上风。我怎么能让这个工作?

2 个答案:

答案 0 :(得分:8)

您可能正在从 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的。

答案 1 :(得分:3)

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