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

标签 java java-9 java-platform-module-system java-10 jmod

我正在将应用程序迁移到 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.JavacTooljdk.compiler 模块仍然是 JDK 的一部分,但不是 JRE。

有什么办法可以在启动JRE时加载jdk.compiler模块吗?我怀疑不是,基于 this answer ,而我尝试使用 --add-module 的结果是: java.lang.module.FindException:执行时不支持 JMOD 格式

我还缺少其他解决方案吗?

最佳答案

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

... but we allow users to compile bits of their own custom code

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

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

关于java - 在 Java 9+ 中使用 JRE 运行时,我可以提供运行时编译器访问吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50628270/

相关文章:

java - 如何在 JFreeChart 中绘制填充矩形?

java - @RequestMapping 在渲染方法中带有 2 个参数

java - JDK 9+ 内置类加载器 ModuleReference 解析将使用类路径(而不是 Jar)来查找资源

java - 用于 Arraylist 处理和调用不同方法的高效 Java 构造

java - JLink:在单独的文件中导出java模块

java - 为什么我必须添加Lombok插件,为什么添加依赖还不够

java - JButton 矩阵上的 Action 事件

java - 在没有 Maven 或 Gradle 的情况下将 JUnit 5 与 Java 9 结合使用

java - 在 Java 9 运行时扫描类路径/模块路径

java - RuntimeException : Package jdk. 模块 jrt.fs 和模块 java.base 中的 internal.jimage.decompressor