부트 개념과 활용-07.독립적으로 실행 가능한 JAR
독립적으로 실행 가능한 JAR
https://docs.spring.io/spring-boot/docs/current/reference/html/executable-jar.html
“JAR” 하나로만 실행이 가능하네?
mvn package를 하면 실행 가능한 JAR 파일 “하나가” 생성 됨.
spring-maven-plugin이 해주는 일 (패키징)
- 과거 “uber” jar 를 사용
모든 클래스 (의존성 및 애플리케이션)를 하나로 압축하는 방법.
뭐가 어디에서 온건지 알 수가 없음 - 무슨 라이브러리를 쓰는건지..
- 내용은 다르지만 이름이 같은 파일은 또 어떻게?
- 스프링 부트의 전략
- 내장 JAR : 기본적으로 자바에는 내장 JAR를 로딩하는 표준적인 방법이 없음.
- 애플리케이션 클래스와 라이브러리 위치 구분
- org.springframework.boot.loader.jar.JarFile을 사용해서 내장 JAR를 읽는다.
- org.springframework.boot.loader.Launcher를 사용해서 실행한다.
Executable Jar
example.jar
|
+-META-INF
| +-MANIFEST.MF
+-org
| +-springframework
| +-boot
| +-loader
| +-<spring boot loader classes>
+-BOOT-INF
+-classes (내가 만든 클래스 파일)
| +-mycompany
| +-project
| +-YourClasses.class
+-lib (애플리케이션에 필요한 라이브러리 전부)
+-dependency1.jar
+-dependency2.jar
jar 풀어보면 이런 구조로 되어 있다.
자바에는 JAR 안에 들어있는 JAR를 읽을 수 있는 방법이 없다.
예전에는 모든 JAR를 다 합쳐서 하나로 만드는 경우도 있었다. 파일이름이 같은데 내용이 다른 JAR… 등
스프링 부트는 JAR안에 JAR를 그대로 다 묶어놓고
읽을 수 있는 파일을 만들어놓음
JAR를 읽는 로더는 JarFile 클래스
이 JAR을 실행하는 로더는(메인 애플리케이션이 실행하는) JarLauncher 클래스
JarLauncher
PropertiesLauncher 등.. 있다.
MANIFEST.MF
메인클래스 - JarLauncher 사용
JarLauncher가 MANIFEST.MF에 선언된 스타트 클래스 설정을 읽어서 실행시킴.
이런 방식으로
스프링 부트의 목표중 하나인 독립적으로 실행되는 애플리케이션이 구현됨!
시작점은 MANIFEST.MF 설정파일 이며
이 안에는 메인 클래스(JarLauncher).
시작 클래스(스프링 어플리케이션 클래스).. 클래스파일, 라이브러리 파일 경로 등..
이 전부 설정되어 있다.
JAR 하나로 앱을 실행할 수 있다가 중요하다.
스프링 부트 메이븐 플러그인이 패키징을 이런 식으로 해주고
MANIFEST.MF 정보 활용해서 모든 일들이 일어납니다..
런처(Launcher)를 사용하고 런처가 내장JAR를 읽어들이는 내장JAR를 활용하고…