Я хочу скомпилировать файлы Java во время выполнения с заданным JDK (для тестирования процессоров аннотаций и тому подобного). Я использую ToolProvider.getSystemJavaCompiler()
, чтобы получить экземпляр javac
.
javac
имеет опции -bootclasspath
и --system
(JDK9 +) для изменения JDK, с которым скомпилированы источники. Однако, если хост-проект скомпилирован с использованием JDK8, экземпляр, возвращаемый ToolProvider.getSystemJavaCompiler()
, будет JDK8 javac
, который не знает опцию --system
и, следовательно, не может скомпилироваться с JDK9. Аналогично, опция --system
не работает с немодулярным JDK (JDK8 или более ранней).
Так что моя идея состоит в том, чтобы динамически загружать класс ToolProvider
из заданного JDK вместо использования системного компилятора хост-проекта, а затем изменять там JDK. Для JDK8 я должен быть в состоянии сделать это, используя URLClassLoader
до rt.jar
и tools.jar
, но как я могу получить загрузчик классов для модульного JDK, который больше не имеет JAR-файлов?