在运行时编译Java文件

时间:2018-11-07 10:00:46

标签: java spring spring-boot dynamic-compilation

我正在尝试在运行时编译Java文件。如果我在Eclipse中运行我的代码没有问题,那么我可以编译外部java文件并实例化该类的对象。

当我生成应用程序的jar(使用spring boot插件)时,会发生问题。如果我使用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();

编辑

我认为问题在于如何创建应用程序的jar。如果我使用“ com.github.johnrengelman.shadow”插件,那没有问题。但是,如果我使用spring-boot并使用bootJar任务生成jar,则在执行应用程序期间会遇到运行时异常。如果我同时提取两个jar,我会看到spring-boot将(库的)jar放入应用程序的jar中,而是“阴影”将(库的).class放入我的应用程序的jar中。

我已经创建了2个gradle项目:

两者都可以在Eclpise中正常运行。第一个也在命令行(./gradlew shadowJar)中运行,第二个不在命令行(./gradlew bootJar然后在'java -jar'中运行)

项目的逻辑是读取外部xmls(过滤器目录)并在运行时创建Java类,将xmls的内容和文件skeleton / skeleton.java的内容混合在一起

运行该应用程序后,您可以在已编译的文件夹中看到生成的.java和.class文件

0 个答案:

没有答案