Компилируйте Java-файлы программноJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Компилируйте Java-файлы программно

Сообщение Anonymous »

Я знаю, что об этом много спрашивали и отвечали, но у меня до сих пор нет хорошего решения, и я до сих пор не понимаю некоторых частей. Поэтому мне необходимо программно скомпилировать файлы *.java.

Код: Выделить всё

JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
это то, что я использую, и (как и ожидалось) компилятор имеет значение null.
Теперь я знаю, что мне нужно использовать 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 приложения.
  • Код: Выделить всё

    tools.jar
    включен в мою папку lib проекта Play (это означает, что он находится в пути к классам проекта — согласно документации Play)
Я почти уверен, что мне нужно сделать кое-что еще, прежде чем Play сможет загрузить класс компилятора Java. Я просто не знаю, чего мне не хватает.

Параметры, такие как 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\...
|-...
MyJar.jar теперь имеет файл META-INF/MANIFEST.MF со следующим содержимым:

Код: Выделить всё

Manifest-Version: 1.0
Sealed: true
Main-Class: here.comes.my.main.class
Class-Path: tools.jar
Не запуская приложения Play, я пытаюсь (в папке lib): java -jar MyJar.jar — мой простой метод main пытается вызвать компилятор (

Код: Выделить всё

ToolProvider.getSystemJavaCompiler();
) и возвращает ноль. Это наводит меня на мысль, что проблема не имеет ничего общего с Play — я даже не могу получить компилятор при обычном запуске Jar!

Подробнее здесь: https://stackoverflow.com/questions/157 ... mmatically
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»