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