我正在尝试创建一个可以.java
在运行时编译提供的文件的应用程序。我知道tools.jar
JDK 中有一个可用的程序编译器。但是,我不能保证应用程序的用户有 JDK。我试图tools.jar
在应用程序中打包并将其作为库引用。当我tools.jar
添加到类路径的引导条目中时,这似乎在 Eclipse IDE 中起作用。将应用程序导出到可运行的 jar(与tools.jar
它一起打包)时,
ToolProvider.getSystemJavaCompiler();
返回null
. 我不确定问题是什么,但我相信这可能与应用程序导出到可运行 jar 时类路径的引导条目未正确保留有关。有任何想法吗?tools.jar
我可以使用编译器的替代品吗?感谢您的耐心等待,因为这是我在这里发布的第一个问题!
问问题
401 次
1 回答
1
您需要在“tools.jar”中使用编译器
ToolProvider.getSystemJavaCompiler()
将从路径变量中定义的 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();
或者您可以更改系统属性,但这会导致意外行为
于 2018-11-14T02:41:55.303 回答