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

时间:2018-11-14 02:22:17

标签: java eclipse classpath javacompiler tools.jar

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

1 个答案:

答案 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();

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