Я переношу приложение на 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
Есть ли другое решение, которое я пропускаю?