我正在尝试在运行时编译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文件