우리는 전통적인 Spring Spring 웹 응용 프로그램에서 현대적인 Spring Boot 실행 파일 인 Jar로 마이그레이션 된 응용 프로그램을 가지고 있습니다.Spring Boot app에서 JavaCompiler API 사용하기 - 컴파일 클래스 경로를 올바르게 설정할 수 없음
하나의 앱 모듈은 JavaCompiler
API를 사용하여 Java 코드를 생성하고이를 런타임에 컴파일합니다.
생성 된 코드는 웹 응용 프로그램의 클래스 경로에있는 종속성을 필요로하고, 그래서 우리는 대략 다음과 같은 코드를 가지고 : 부팅 작동하지 않는, 그러나
StandardJavaFileManager standardFileManager = compiler.getStandardFileManager(null, null, null);
List<String> optionList = new ArrayList<String>();
// set compiler's classpath to be same as the runtime's
String classpathString = System.getProperty("java.class.path");
optionList.addAll(Arrays.asList("-nowarn",
"-classpath",
classpathString,
"-g",
"-source",
javaVersion,
"-target",
javaVersion));
Collection classpathFiles = getClasspathJars(classpathString);
addPreviousCompiledClassesToClasspathFiles(rootClassPath, classpathFiles);
try {
File file = new File(getTargetRoot(tempClassPath));
file.mkdirs();
standardFileManager.setLocation(StandardLocation.CLASS_OUTPUT, Lists.newArrayList(file));
standardFileManager.setLocation(StandardLocation.CLASS_PATH, classpathFiles);
// adding current dir to the source path, to find the compiled DV
if (generateSeparateJarsForEachDecision.equals(NO_JAR)) {
standardFileManager.setLocation(StandardLocation.SOURCE_PATH, Lists.newArrayList(file));
}
} catch (IOException e) {
throw new RuntimeException(e);
}
List<CharSequenceJavaFileObject> compilationUnits = Lists
.newArrayList(new CharSequenceJavaFileObject( StringUtils.capitalize(filename),
toString(javaCode)));
JavaCompiler.CompilationTask task = compiler
.getTask(writer, standardFileManager, listener, optionList, null, compilationUnits);
status = task.call();
```
합니다. 클래스 경로에는 my-app.jar
만 포함되어 있으며 중첩 된 jar 파일을 작업의 -cp
에 추가 할 수 없습니다.이 파일은 중첩 된 jar 파일이 아닙니다. 또한 수동으로 너무 같은 -cp
매개 변수 그들에게 추가하려고 시도했습니다 사람들의 {absolute-path}/my-app.jar!/BOOT-INF/lib/my-dep.jar
{absolute-path}/my-app.jar!/BOOT-INF/lib/*.jar
없음 작동하지 않습니다. 빌드에 <requiresUnpack>
태그를 사용하는 것에 대해 생각해 보았지만 클래스 패스에 추가하기 위해 확장 된 dir을 확보 할 수 없어 도움이되지 않았습니다.