首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Java 9+中运行JRE时,我可以提供运行时编译器访问吗?

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

Stack Overflow用户
提问于 2018-05-31 23:51:58
回答 1查看 736关注 0票数 5

我正在将一个应用程序迁移到Java10。我们的应用程序通常使用JRE运行,但我们允许用户通过捆绑tools.jar并使用反射按需加载JavacTool实例来编译他们自己的自定义代码。我们的方法看起来像这样:

代码语言:javascript
复制
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

还有没有其他的解决方案我错过了?

EN

回答 1

Stack Overflow用户

发布于 2018-06-01 04:46:12

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

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

用户下载JDK应该不会感到惊讶,因为他们正在使用JDK的一个特性:编译代码。

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50628270

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档