Загрузка класса из другого (модульного) JDK во время выполнения - PullRequest
0 голосов
/ 09 января 2019

Я хочу скомпилировать файлы 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-файлов?

...