我正在将应用程序迁移到 Java 10。我们的应用程序通常使用 JRE 运行,但我们允许用户通过捆绑和使用反射来按需tools.jar
加载实例来编译自己的自定义代码。JavacTool
我们的方法如下所示:
public static JavaCompiler getJavaCompiler() {
String toolJarName = "tools.jar";
File file = getResourceForClass("tools.jar");
try {
file = file.getCanonicalFile();
} catch (IOException ignore) {
}
if (!file.exists())
throw new RuntimeException("Can't find java tools file: '"+file+"'");
try {
URL[] urls = new URL[]{ file.toURI().toURL() };
URLClassLoader cl = URLClassLoader.newInstance(urls);
return Class.forName("com.sun.tools.javac.api.JavacTool", false, cl).asSubclass(JavaCompiler.class).newInstance();
} catch (Exception e) {
throw new RuntimeException("Can't find java compiler from '"+file+"': "+e.getMessage());
}
}
这是必要的,因为javax.tools.ToolProvider.getSystemJavaCompiler()
从 JRE 运行时返回 null。我们的方法在 Java 8 上运行良好,但tools.jar
在 Java 9 中被删除,我需要的类com.sun.tools.javac.api.JavacTool
在jdk.compiler
模块中,它仍然是 JDK 的一部分,但不是 JRE。
jdk.compiler
启动 JRE 时有什么方法可以加载模块吗?根据这个答案,我怀疑不是,我尝试使用--add-module
的结果是:
java.lang.module.FindException: JMOD format not supported at execution time
我还缺少另一个解决方案吗?