ToolProvider.getSystemJavaCompiler()返回null – 仅在安装了JRE时可用?

我正在尝试使用JavaCompiler类:

  • http://docs.oracle.com/javase/6/docs/api/javax/tools/JavaCompiler.html

当我调用ToolProvider.getSystemJavaCompiler()时,它返回null。

我想这是因为我使用的是JRE而不是JDK。

问题是我希望它在所有平台上运行,无论用户使用JRE还是JDK的天气如何。

如果有人知道如何解决这个问题,或者使用其他方法请注释。

任何帮助,将不胜感激。

ToolProvider.getSystemJavaCompiler()不可用。

类路径中是否缺少tools.jar?

Set class path to the tools.jar文件的Set class path to the tools.jar文件可以在jdk \ jre目录中找到。

System.setProperty("java.home", "C:\\Program Files\\Java\\jdk1.7.0_02");

我认为这是问题所在。明确指定您正在使用的java.exe版本作为JDK目录中的版本。

看详情

以下是在没有安装JDK的情况下如何从应用程序运行Java编译器。

首先,使用Java应用程序包含JDK中的tools.jar文件,并将tools.jar放在类路径中。 Oracle可能不会喜欢你这样做。 但是,有合法的解决方法。 您可以从openjdk.org(openjdk),RedHat(IcedTea)或Azul Systems(Zulu)提供的免费JDK中获取tools.jar文件。

接下来,不是使用ToolProvider.getSystemJavaCompiler()和JavaCompiler类,而是直接调用位于tools.jar中的编译器。 以下是代码片段:

 String classpath = ...; // make sure tools.jar is in this path String sourcepath = ...; // path to your sources String putputpath = ...; // directory for generated class files String filepath = ...; // file path the file you want to compile String[] args = new String[] { "-classpath", classpath, "-sourcepath", sourcepath, "-d", putputpath, filePath }; com.sun.tools.javac.Main javac = new com.sun.tools.javac.Main(); int compileStatus = javac.compile(args); 

只需将/ lib中的tools.jar文件复制到它就可以了

您可以通过System.out.println获取(System.getProperty(“java.home”))

大多数时候它就像C:\ Program files \ Java \ jre(version)[for windows]

另一种解决方案来自: – http://bugs.java.com/bugdatabase/view_bug.do?bug_id=7181951

将JDK_HOME / lib /中的tools.jar复制到JRE_HOME / lib /中。 至少对我来说,它神奇地解决了我的问题!

(我上面没有做任何推荐。我只是把它复制到那里。)

这是对我有用的简单解决方案

我刚刚将jre系统库更改为….. Program Files \ Java \ jdk1.7.0_55 \ jre而不是…. Program Files \ Java \ jdk1.7.0_55 \ bin,它对我有用。

在Mac上,这对我有用:

  System.setProperty("java.home", "/Library/Java/JavaVirtualMachines/jdk1.8.0_144.jdk/Contents/Home"); javax.tools.JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); 

(由于某种原因,它不适用于idk 10)。