Могу ли я предоставить доступ к компилятору времени выполнения при работе с JRE в Java 9+? - PullRequest
0 голосов
/ 31 мая 2018

Я переношу приложение на 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.Наш метод хорошо работал с 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

Есть ли другое решение, которое я пропускаю?

1 Ответ

0 голосов
/ 31 мая 2018

IMO самое простое решение вашей проблемы - это сделать его простым и требовать, чтобы пользователи загружали JDK вместо JRE:

... но мы позволяем пользователям собирать биты по своему усмотрениюcode

Пользователи не должны удивляться, загружая JDK, поскольку они используют функцию JDK: компилирование кода.

Если это невозможно, тогда выВозможно, вы захотите попробовать решение jlink, которое @nullpointer предлагает в комментариях.

...