Компилировать Java-файл во время выполнения - PullRequest
0 голосов
/ 07 ноября 2018

Я пытаюсь скомпилировать файл 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 в скомпилированной папке

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...