我正在将一个应用程序迁移到Java10。我们的应用程序通常使用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());
}
}
这是必要的,因为当从JRE运行时,javax.tools.ToolProvider.getSystemJavaCompiler()
返回null。我们的方法在Java8中工作得很好,但是tools.jar
在Java9中被删除了,我需要的com.sun.tools.javac.api.JavacTool
类在jdk.compiler
模块中,它仍然是JDK的一部分,但不是JRE。
有没有办法在启动JRE时加载jdk.compiler
模块?我怀疑它不是,基于this answer,我尝试使用--add-module
的结果是:java.lang.module.FindException: JMOD format not supported at execution time
还有没有其他的解决方案我错过了?
发布于 2018-06-01 04:46:12
IMO对您的问题最简单的解决方案是保持简单,并要求用户下载JDK而不是JRE:
...但是我们允许用户编译他们自己的自定义代码
用户下载JDK应该不会感到惊讶,因为他们正在使用JDK的一个特性:编译代码。
如果这是不可能的,那么你可能想尝试@nullpointer在评论中建议的jlink
解决方案。
https://stackoverflow.com/questions/50628270
复制相似问题