在Java 9+中使用JRE运行时,我可以提供运行时编译器访问吗?

时间:2018-05-31 15:51:58

标签: java java-9 jigsaw java-10 jmod

我正在将应用程序迁移到Java 10.我们的应用程序通常使用JRE运行,但我们允许用户通过捆绑tools.jar并使用反射加载{{1}来编译自己的自定义代码的位按需实例。我们的方法如下:

JavacTool

这是必要的,因为从JRE运行时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()); } } 返回null。我们的方法在Java 8中运行良好,但在Java 9中删除了javax.tools.ToolProvider.getSystemJavaCompiler(),而我需要tools.jar的类在com.sun.tools.javac.api.JavacTool模块中,它仍然是JDK的一部分,而不是JRE

启动JRE时是否有任何方法可以加载jdk.compiler模块?我怀疑它不是基于this answer,并且我尝试使用jdk.compiler会导致: --add-module

我还缺少另一种解决方案吗?

1 个答案:

答案 0 :(得分:4)

IMO对您的问题最简单的解决方案是保持简单,并要求用户下载JDK而不是JRE:

  

...但我们允许用户编译他们自己的自定义代码

用户下载JDK应该不足为奇,因为他们正在使用JDK功能:编译代码。

如果那是不可能的,那么您可能想尝试@nullpointer在评论中建议的jlink解决方案。