1. 서문
정상적인 상황에서 클래스 로더는 현재 디렉토리에서 *.class 파일만을 찾을 수 있습니다. 중첩 항아리에 자원을로드하기 위해 중첩 된 JAR의 클래스 파일과 응용 프로그램의 클래스 파일이 항아리에 포장되어 중첩 된 JAR이 없도록합니다. 그러나 그렇게하면 응용 프로그램이 무엇에 의존하는지, 응용 프로그램 자체가 무엇인지 명확하게 알 수 없습니다. 또한 여러 항아리의 클래스 내용은 다를 수 있지만 파일 이름은 동일합니다. SpringBoot의 Spring-Boot-Loader는이 문제를 우아하게 해결하기 위해 태어났습니다.
Spring-Boot-Loader 모듈을 사용하면 Java -jar Archive.jar를 사용하여 중첩 된 종속성을 포함하는 Jar 또는 전쟁 파일을 실행할 수 있습니다. 세 가지 유형의 런처 (Jarlauncher, Warlauncher 및 PropertiesLauncher)를 제공합니다. 이 클래스 런처의 목적은 JAR에 중첩 된 리소스 (예 : 클래스 파일, 구성 파일 등)를로드 할 수 있어야합니다. [JAR | WAR] 런처는 현재 JAR의 LIB 디렉토리에있는 중첩 JAR 파일의 리소스를 고정으로 검색합니다.
2. Spring-Boot-Loader 모듈이 제공하는 JAR 디렉토리 구조
SpringBoot의 JAR 파일 형식은 다음과 같이 수정됩니다.
Archive.jar | +-meta-inf (1) | +-manifest.mf +-org (2) | +-springframework | +-부트 | +-로더 | +-<스프링 부트 로더 클래스> +-com (3) | +-mycompany | + 프로젝트 | +-youclasses.class +-lib (4) +-dependency1.jar +-dependency2.jar
그렇다면 스프링 보트는이 구조에 따라 자원을 어떻게로드합니까?
메인 클래스 : org.springframework.boot.loader.jarlauncher start-class : com.mycompany.project.myApplication
스프링 부트 로더 패키지의 클래스 파일을 구조 (2)로 복사하고 응용 프로그램 종속성을 복사하여 (4) 응용 프로그램 클래스를 (3)으로 복사합니다.
3
참고 : 여기서 우리는 왜 클래스를 Spring-Boot-Loader.jar에 넣어야하는 구조에 클래스를 복사 해야하는지 생각해야합니까?
4. Jarlauncher 실행 프로세스 분석
이 과정을 읽은 후 세 번째 섹션에 남은 문제를 분석합니다. 예를 들어, FlowChart는 먼저 AppClassLoader를 사용하여 Jarlauncher 클래스를로드하고 LaunchEdurlClassLoader 클래스를 만듭니다. LaunchEdurlClassLoader는 Spring-Boot-Loader.jar 패키지에 속하며 AppClassLoader는 중첩 된 JAR에 파일을로드 할 수없는 일반 로더입니다. 따라서 Spring-Boot-Loader.jar가 LIB 디렉토리에 배치되면 AppClassLoader는 LaunchEdUrlClassLoader를 찾지 못합니다. 포장 할 때
클래스를 Lib의 스프링 부트 로더에 넣어야 할 구조 (2)에 복사하십시오.
5. 요약
스프링 부트로드 모듈은 맞춤형 JAR 패키지 구조를 통해 중첩 된 JAR 리소스의로드를 우아하게 구현합니다. 포장 중에 시작 클래스 및 조직 JAR 구조를 재설정하고 런타임에 맞춤형 로더를 설정하여 중첩 된 JAR 리소스를 달성함으로써.