如何在没有 JDK 的情况下使用 tools.jar 中的 JavaCompiler

How to use JavaCompiler from tools.jar without JDK

我正在尝试创建一个可以在运行时编译提供的 .java 文件的应用程序。我知道 JDK 的 tools.jar 中有一个可用的程序编译器。但是,我不能保证应用程序的用户有 JDK。我试图在应用程序中打包 tools.jar 并将其作为库引用。当我将 tools.jar 添加到类路径的 Bootstrap 条目中时,这似乎在 Eclipse IDE 中起作用。将应用程序导出到可运行的 jar 时(使用 tools.jar 打包), ToolProvider.getSystemJavaCompiler(); returns null。我不确定问题出在哪里,但我相信这可能与当应用程序导出到可运行的 jar 时未正确保留类路径的 Bootstrap 条目有关。有任何想法吗?我可以使用 tools.jar 编译器的替代品吗?感谢您的耐心等待,因为这是我在这里发布的第一个问题!

您需要在"tools.jar"

内使用编译器
ToolProvider.getSystemJavaCompiler()

将return编译器从jdk路径变量中定义, 你可以这样做:

File file = new File(pathToToolsJar);
URL[] urls = new URL[]{ file.toURI().toURL() };
ClassLoader loader = new URLClassLoader(urls);
Class compilerClass = loader.loadClass("com.sun.tools.javac.api.JavacTool");
JavaCompiler compiler = (JavaCompiler) compilerClass.getConstructor().newInstance();

或者你可以在编译时添加tools.jar作为库

import com.sun.tools.javac.api.JavacTool;
...
JavaCompiler compiler = new JavacTool();

或者您可以更改系统属性,但这会导致意外行为