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

史蒂文:

因此,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我尝试了许多其他方式,例如使用a ServiceLoader可以找到它的任何引用,但绝不占优势。我如何才能使它正常工作?

乔恩·斯基特(Jon Skeet):

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

就是Java泛型代码在运行时复制所使用的各类型或Java使用的类型转换?

如何获得访问javax.annotation.Resource在运行时的Java 9

使用Java 8在运行时选择具体的实现

使用Java在运行时编译Groovy类

在运行时为使用wsimport生成的代码重写或设置Web服务端点

使用Java在运行时创建按钮

有什么方法可以在运行时使用C或C ++编译其他代码吗?

使用javax.tools.JavaCompiler编译源代码时如何设置类路径?

Java-让用户编写自己的代码,然后进行编译,然后在同一运行时使用它

在运行时使用Eclipse编译外部Java文件

使用Java的Runtime.getRuntime()。exec()运行时,从源代码构建Go失败使测试失败

使用Java在运行时确定AWS Lambda名称

使用Java在运行时加载CA根证书

在运行时运行编译的Java代码

使用MSVC编译的多线程应用程序在运行时失败

如何在运行时编译和使用Kotlin代码?

使用Serialize.Linq在运行时编译表达式

在运行时使用ODEProblem的结果

C ++默认构造函数在运行时不使用,但在编译时必需

C#-使用自定义配置在运行时编译c#代码

如何在运行时编译的C#代码中使用“ UnityEngine”?

MKL示例代码可以使用cmake正常编译,但是在运行时崩溃

在运行时使用继承的代码选择器

Scala代码运行时无需使用scalac进行编译?

如何在运行时使用scala.tools.reflect.ToolBox评估xml文字?

在Ubuntu Linux 16.04桌面上运行的C#可执行文件在哪里使用DLLImport共享对象在运行时寻找它们的源代码?

使用Java在运行时编译jasperreport子报表

编辑源代码并在C#中的运行时使用它

使用Dart在运行时/编译时生成类