5

因此,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。” 但他们从未展示过任何其他方式来获取 a 的实例JavaCompiler。我尝试了许多其他方法,例如使用 aServiceLoader找到我可以找到的任何参考,但没有占上风。我怎样才能让它发挥作用?

4

2 回答 2

9

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

于 2012-12-04T06:58:20.407 回答
2

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

于 2012-12-04T06:59:29.137 回答