Я пытаюсь скомпилировать файл Java во время выполнения. Если я запускаю свой код в Eclipse, проблем нет, я могу скомпилировать внешний java-файл и создать экземпляр объекта этого класса.
Проблема возникает, когда я генерирую флягу моего приложения (используя плагин весенней загрузки). Если я запускаю свое приложение, используя java -jar
, задача компиляции во время выполнения завершается с ошибкой: error: package 'com.myLib' does not exist
Я достал банку и могу найти com.myLib
в BOOT-INF/lib/mylib.jar
Я думаю, что это просто проблема установки правильного пути к классу перед компиляцией во время выполнения моего внешнего Java-файла
Это мой внешний Java-файл, который будет скомпилирован во время выполнения:
package com.mypackage;
import com.myLib.myclass;
public class filter implements MyInterface {
@Override
public void print(myclass obj) {
System.out.println(obj);
}
}
Это код, используемый для компиляции во время выполнения:
final JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
final StandardJavaFileManager fileManager = compiler.getStandardFileManager(errorListener, Locale.ENGLISH,
Charset.defaultCharset());
StringBuilder sb = new StringBuilder();
for (URL url : ((URLClassLoader) Thread.currentThread().getContextClassLoader()).getURLs()) {
sb.append(url.getPath()).append(File.pathSeparator);
}
final classPath = sb.toString();
final List<String> optionList = new ArrayList<>();
optionList.addAll(Arrays.asList("-classpath", classPath));
optionList.add("-Xlint:unchecked");
optionList.add("-Xlint:none");
optionList.addAll(Arrays.asList("-d", "outputFolder"));
final JavaCompiler.CompilationTask task = compiler.getTask(null, fileManager, errorListener, optionList, null,
files);
task.call();
EDIT
Я думаю, что проблема в том, как создается банка моего приложения. Если я использую плагин com.github.johnrengelman.shadow, то проблем нет. Но если я использую spring-boot и генерирую jar с помощью задачи bootJar
, у меня возникает исключение во время выполнения моего приложения. Если я извлекаю оба jar-файла, я вижу, что spring-boot помещает jar-файлы (библиотек) в jar-файл моего приложения, а вместо этого shadow создает «.class» (библиотек) в jar-файл моего приложения.
Я создал 2 проекта Gradle:
Оба работают в Eclpise без проблем. Первый также запускается в командной строке (./gradlew shadowJar), второй не запускается в командной строке (./gradlew bootJar
, а затем запускает его 'java -jar')
Логика проекта - читать внешние xmls (каталог фильтров) и создавать классы java во время выполнения, смешивая содержимое xmls и содержимое файла skeleton / skeleton.java
После запуска приложения вы можете увидеть сгенерированные файлы .java и .class в скомпилированной папке