2017-10-23 20 views
0

우리는 전통적인 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을 확보 할 수 없어 도움이되지 않았습니다.

답변

0

비슷한 문제가 있습니다.

스프링 부트로 인한 제한 사항입니다.

Jersey와 Tomcat이 내장 된 독립 실행 형 응용 프로그램이 만들어졌습니다.

이제 jar에는 모든 라이브러리가 포함되어 있으며 Java 컴파일러에 대한 클래스 경로로 설정할 수 있습니다.