Код: Выделить всё
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
Теперь я знаю, что мне нужно использовать JDK, а не JRE как «среда выполнения», но вот чего я не понимаю: разве недостаточно просто поместить Tools.jar в путь к классам приложения, а затем получить доступ к компилятору Java API? Если это правда, есть ли (я думаю, что есть) разница между автономным Java-приложением и веб-приложением.
На самом деле, я пытаюсь вызвать JavaCompiler из веб-приложения PlayFramework, поэтому я понял, может быть, это решение (с включением Tools.jar) работает только для автономных приложений?
Я также пытался создать собственный ClassLoader и вызвать вышеупомянутое метод с отражением, но все, что я получаю, имеет значение null для объекта компилятора:
Код: Выделить всё
ClassLoader classloader = app.classloader();
File file = new File("lib/tools.jar");
URL url = file.toURI().toURL();
URL[] urls = new URL[]{url};
ClassLoader newCL = new URLClassLoader(urls, classloader) {
};
Class loadClass = newCL.loadClass("javax.tools.ToolProvider");
Method method = loadClass.getMethod("getSystemJavaCompiler", null);
Object object = method.invoke(null);
System.out.println("Object: " + object); // NULL
- Я не включил try/ ловит для простоты.
- app.classloader() — это метод Play, который возвращает ClassLoader приложения.
- включен в мою папку lib проекта Play (это означает, что он находится в пути к классам проекта — согласно документации Play)
Код: Выделить всё
tools.jar
Параметры, такие как Runtime.exec("javac myFile.java") и компилятор Eclipse JDT мне известны, но это не то, что я ищу.
Да, и что-то вроде System. setProperty("java.home", "PATH_TO_YOUR_JDK");, а затем ToolProvider.getSystemJavaCompiler(); работает, но я считаю это решение таким уродливым.
С уважением
РЕДАКТИРОВАТЬ: (чтобы предоставить дополнительную информацию и отразить последний статус)
Это базовый вариант представление структуры веб-приложения:
Код: Выделить всё
myApp
|-conf\...
|-lib\MyJar.jar
|-lib\tools.jar
|-logs\...
|-...
Код: Выделить всё
Manifest-Version: 1.0
Sealed: true
Main-Class: here.comes.my.main.class
Class-Path: tools.jar
Код: Выделить всё
ToolProvider.getSystemJavaCompiler();
Подробнее здесь: https://stackoverflow.com/questions/157 ... mmatically