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

如何在没有JDK的情况下使用tools.jar中的JavaCompiler,java,eclipse,classpath,javacompiler,tools.jar,Java,Eclipse,Classpath,Javacompiler,Tools.jar,我正在尝试创建一个应用程序,它可以在运行时编译提供的.java文件。我知道JDK的tools.jar中有一个程序编译器。但是,我不能保证应用程序的用户拥有JDK。我试图在应用程序中打包tools.jar,并将其作为库引用。当我将tools.jar添加到类路径的引导条目中时,这似乎在EclipseIDE中起作用。将应用程序导出到可运行的jar时(使用它打包的tools.jar), ToolProvider.getSystemJavaCompiler()返回null。我不确定问题出在哪里,但我相信这

我正在尝试创建一个应用程序,它可以在运行时编译提供的
.java
文件。我知道JDK的
tools.jar
中有一个程序编译器。但是,我不能保证应用程序的用户拥有JDK。我试图在应用程序中打包
tools.jar
,并将其作为库引用。当我将
tools.jar
添加到类路径的引导条目中时,这似乎在EclipseIDE中起作用。将应用程序导出到可运行的jar时(使用它打包的
tools.jar
),
ToolProvider.getSystemJavaCompiler()返回
null
。我不确定问题出在哪里,但我相信这可能与将应用程序导出到可运行jar时未正确保留类路径的引导条目有关。有什么想法吗?除了
tools.jar
编译器之外,我还有其他的选择吗?谢谢你的耐心,因为这是我在这里发布的第一个问题

您需要在“tools.jar”中使用编译器

将从path变量中定义的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();

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

感谢您的快速响应。这似乎很有效。有没有可能让我简单解释一下替代方案在做什么?嗯,我不太清楚为什么我建议使用反射,你可以添加tools.jar作为一个库,然后用老方法对它进行实例
import com.sun.tools.javac.api.JavacTool
JavaCompiler编译器=新的JavacTool()我最初建议的是在运行时使用反射加载tools.jar;使用URLClassLoader是在运行时加载依赖项的一种简单方法,您只需向加载程序请求所需的类,它就会查找您为该类指定的URL
import com.sun.tools.javac.api.JavacTool;
...
JavaCompiler compiler = new JavacTool();