2017-01-24 3 views
0

스프링 부트 메이븐 플러그인. LayoutFactory 새로운 기능. 1.5.0.M1부터 사용 가능합니다.커스텀 레이아웃을 사용할 때 Custom Launcher ClassNotFound 예외

나는 사용자 레이아웃에서 사용자 정의 실행 정의 할 때 내가하는 데 문제가 :

나는 부팅 응용 프로그램 소스 내 사용자 정의 발사기를 포함하는 경우
@Override public String getLauncherClassName() { return "com.mycompany.CustomLauncher"; } 

, 그것은/클래스 BOOT-INF에 재 포장, 언제 도착을 JAR을 실행하려고하면 ClassNotFound 예외가 발생합니다.

나는 리팩커드 코드를 읽었지 만 리 패키징 시퀀스에서 주어진 클래스를 선택적으로 제외시킬 수있는 훅을 찾을 수 없다. 내 레이아웃에서 getRepackagedClassesLocation 메소드를 오버라이드하면 부트 메인 클래스가 다른 클래스 로더에 의해로드되고 SpringBoot ClassNotFound에서 실패합니다.

BOOT-INF/classes 리 패키징에서 실행 프로그램을 강제 실행할 수있는 방법이 있습니까?

UPDATE 코드 내가이 시험을 추가 한 액세스 할 수 있음을 참조하기 위해 1

@Override 
public void writeLoadedClasses(LoaderClassesWriter writer) throws IOException 
{ 
    String name = PropertiesLauncherInternal.class.getName().replaceAll("\\.", "\\\\") + ".class"; 
    InputStream inputStream = PropertiesLauncherInternal.class.getResourceAsStream(PropertiesLauncherInternal.class.getSimpleName() + ".class"); 
    writer.writeEntry(name, inputStream); 
    writer.writeLoaderClasses(); 
} 

:

BOOT-INF/--1 
BOOT-INF/classes/--1 
BOOT-INF/classes/com/-0 
BOOT-INF/classes/com/test/-0 
BOOT-INF/classes/com/test/Boot.class-2405822989 
... 
com\launcher\PropertiesLauncherInternal.class--1 
: 나는 다음과 같은 로그를 얻을 첫 번째 루프를 들어

JarInputStream is = new JarInputStream(new FileInputStream(new File("c:/git/dev/framework/boot/target/boot-current-SNAPSHOT.jar")), true); 
    JarEntry entry = null; 
    while (null != (entry = is.getNextJarEntry())) 
    { 
     System.out.println(entry.getName() + "-" + entry.getCrc()); 
    } 

    URL url = new File("c:/git/dev/framework/boot/target/boot-current-SNAPSHOT.jar").toURL(); 
    URL[] urls = new URL[] { url }; 
    ClassLoader cl = new URLClassLoader(urls); 
    Class cls = cl.loadClass("com.test.Boot"); 
    Class cls = cl.loadClass("com.launcher.PropertiesLauncherInternal"); 

클래스 이름 옆에있는 숫자는 CRC입니다. 관련성이 있는지는 모르겠지만 CRC-32는 알 수 없습니다.

는 는 클래스 로더를 사용하는 경우

, 내가 com.test.Boot를로드 할 수 있어요하지만 응용 프로그램 코드와 함께 그것을하는 것보다 오히려 PropertiesLauncherInternal.class

답변

0

에 대한 ClassNotFoundException가 실패하여 실행 코드는 별도의에 있어야 모듈은 Spring Boot의 Maven 플러그인의 의존성으로 선언된다. 이 별도의 모듈은 Maven의 표준 jar 패키징을 사용해야하며 Spring Boot의 Maven 플러그인을 사용하여 리 패키징해서는 안됩니다.

설정하는 방법을 보여주는 sample이 있습니다.

+0

안녕하세요, Andy, 그 일을 시도하고 내 발사대가 포장 얻을. 그러나 JAR을 실행하려고하면 ** 오류 : 기본 클래스를 찾을 수 없거나로드 할 수 없습니다 **. 동일한 클래스 (동일한 내용, 동일한 이름)를 JAR의 동일한 위치에 수동으로 복사하면 작동합니다. 문제가 뭔지 알 겠어? –

+0

아니요, 죄송합니다. 문제를 재현하는 코드를 공유 할 수 있습니까? –

+0

원래 질문에 대한 세부 정보를 추가했습니다. –