1

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

4

1 回答 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 回答