如何在没有 JDK 的情况下使用 tools.jar 中的 JavaCompiler
How to use JavaCompiler from tools.jar without JDK
我正在尝试创建一个可以在运行时编译提供的 .java
文件的应用程序。我知道 JDK 的 tools.jar
中有一个可用的程序编译器。但是,我不能保证应用程序的用户有 JDK。我试图在应用程序中打包 tools.jar
并将其作为库引用。当我将 tools.jar
添加到类路径的 Bootstrap 条目中时,这似乎在 Eclipse IDE 中起作用。将应用程序导出到可运行的 jar 时(使用 tools.jar
打包),
ToolProvider.getSystemJavaCompiler();
returns null
。我不确定问题出在哪里,但我相信这可能与当应用程序导出到可运行的 jar 时未正确保留类路径的 Bootstrap 条目有关。有任何想法吗?我可以使用 tools.jar
编译器的替代品吗?感谢您的耐心等待,因为这是我在这里发布的第一个问题!
您需要在"tools.jar"
内使用编译器
ToolProvider.getSystemJavaCompiler()
将return编译器从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();
或者您可以更改系统属性,但这会导致意外行为
我正在尝试创建一个可以在运行时编译提供的 .java
文件的应用程序。我知道 JDK 的 tools.jar
中有一个可用的程序编译器。但是,我不能保证应用程序的用户有 JDK。我试图在应用程序中打包 tools.jar
并将其作为库引用。当我将 tools.jar
添加到类路径的 Bootstrap 条目中时,这似乎在 Eclipse IDE 中起作用。将应用程序导出到可运行的 jar 时(使用 tools.jar
打包),
ToolProvider.getSystemJavaCompiler();
returns null
。我不确定问题出在哪里,但我相信这可能与当应用程序导出到可运行的 jar 时未正确保留类路径的 Bootstrap 条目有关。有任何想法吗?我可以使用 tools.jar
编译器的替代品吗?感谢您的耐心等待,因为这是我在这里发布的第一个问题!
您需要在"tools.jar"
内使用编译器ToolProvider.getSystemJavaCompiler()
将return编译器从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();
或者您可以更改系统属性,但这会导致意外行为