부트 개념과 활용-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 등.. 있다.

  1. MANIFEST.MF

  2. 메인클래스 - JarLauncher 사용

  3. JarLauncher가 MANIFEST.MF에 선언된 스타트 클래스 설정을 읽어서 실행시킴.

이런 방식으로
스프링 부트의 목표중 하나인 독립적으로 실행되는 애플리케이션이 구현됨!

시작점은 MANIFEST.MF 설정파일 이며
이 안에는 메인 클래스(JarLauncher).
시작 클래스(스프링 어플리케이션 클래스).. 클래스파일, 라이브러리 파일 경로 등..
이 전부 설정되어 있다.

JAR 하나로 앱을 실행할 수 있다가 중요하다.

스프링 부트 메이븐 플러그인이 패키징을 이런 식으로 해주고

MANIFEST.MF 정보 활용해서 모든 일들이 일어납니다..

런처(Launcher)를 사용하고 런처가 내장JAR를 읽어들이는 내장JAR를 활용하고…




© 2019. by jaeuk