Как использовать JavaCompiler из tools.jar без JDK - PullRequest
0 голосов
/ 14 ноября 2018

Я пытаюсь создать приложение, которое может компилировать предоставленный файл .java во время выполнения.Я понимаю, что есть программный компилятор, доступный в tools.jar JDK.Однако я не могу гарантировать, что у пользователя приложения есть JDK.Я попытался упаковать tools.jar в приложение и сослаться на него как на библиотеку.Похоже, что это работает в Eclipse IDE, когда у меня добавлено tools.jar в записи начальной загрузки пути к классам.При экспорте приложения в исполняемый файл (с tools.jar в комплекте), ToolProvider.getSystemJavaCompiler(); возвращает null.Я не совсем уверен, в чем проблема, но я полагаю, что это может быть связано с тем, что записи начальной загрузки classpath не сохраняются должным образом при экспорте приложения в исполняемый файл jar.Есть идеи?Есть ли какие-нибудь альтернативы компилятору tools.jar, которые я мог бы использовать?Спасибо за ваше терпение, так как это мой первый вопрос, размещенный здесь!

1 Ответ

0 голосов
/ 14 ноября 2018

Вам нужно использовать компилятор в "tools.jar"

ToolProvider.getSystemJavaCompiler()

вернет компилятор из jdk, определенного в переменной пути, Вы можете сделать это вместо:

File file = new File(pathToToolsJar);
URL[] urls = new URL[]{ file.toURI().toURL() };
ClassLoader loader = new URLClassLoader(urls);
Class compilerClass = loader.loadClass("com.sun.tools.javac.api.JavacTool");
JavaCompiler compiler = (JavaCompiler) compilerClass.getConstructor().newInstance();

Или вы можете добавить tools.jar в виде библиотеки во время компиляции

import com.sun.tools.javac.api.JavacTool;
...
JavaCompiler compiler = new JavacTool();

Или вы можете изменить Системные свойства, но это приводит к неожиданному поведению

...