좌충우돌 프로젝트 이야기

Springboot Application 실행하기 (Manifest, Jar, BootJar 개념 짚기)

호춘쿠키 2023. 7. 27. 20:45

스프링 웹 애플리케이션을 만들었다. IDE 에서만 웹서버를 실행해봤지, 호스팅 서버에서 실행해본적은 없었다. 스프링 웹 애플리케이션을 호스팅 서버에서 실행시키기 위한 개념을 정리해봤다.

 

What is JAR?

Java ARchive의 줄임말이다. ZIP 파일 포맷이며 여러 개의 파일을 하나로 묶고 있다. JAR 파일의 주목적은 자바 애플릿(JVM이 내장된 웹 브라우저에서 실행할 수 있는 자바 바이트코드. 주로 플러그인을 만들 때 사용하는 듯 함)과 그에 필요한 구성 요소들을 묶어 한 번에 다운로드할 수 있도록 하는 것이다.

 

JAR는 정의는 다음과 같다.

  • 크로스 플랫폼 (모든 플랫폼에서 사용 가능한) 아카이브 포맷
  • 오디오, 이미지, 클래스 파일을 다룰 수 있는 포맷
  • 기존의 애플릿 코드와 호환
  • 확장 가능하며 자바 언어로 작성
  • 자바 애플릿의 구성 요소들을 묶는 방법

 

JAR 구성 요소

JAR 파일의 구성요소를 알아보자.
JAR는 Manifest 파일, 서명파일 그리고 zip 아카이브로 구성된다. JAR Specification은 JAR 파일에 대해 더 자세히 설명하고 있다.

 

이 문서를 바탕으로 JAR 파일의 구성요소를 간단하게 요약해봤다.

  • JAR 파일에는 META-INF 디렉토리를 포함할 수 있다.
  • META-INF 디렉토리는 패키지, 설정 정보 등을 저장하는데 사용된다. META-INF 디렉토리는 다음 파일을 가진다.
    • META-INF/MANIFEST.MF - JAR 파일에 포함된 파일 리스트와 각 파일들에 대한 속성 정보를 기록하는 파일
    • META-INF/INDEX.LIST - 애플리케이션 또는 확장팩에서 정의된 패키지들에 대한 위치 정보를 담고 있는 파일. 클래스 로더들이 클래스 로딩 과정을 빠르게 수행하기 위해 사용된다.
    • META-INF/X.DSA - 전자 서명 파일 (X = 파일 이름)
    • META-INF/services - 전자 서명 파일에 대응되는 서명 블록 파일

 

META-INF/MANIFEST 예시

Manifest-Version: 1.0
Class-Path: MyUtils.jar MyApp.jar ===> 함께 로드할 JAR 파일을 명시
Main-Class: MyPackage.MyClass ===> 메인 클래스 명시
Name: java/util/ ===> 패키지 버전 정보 명시
Specification-Title: Java Utility classes
Specification-Version: 1.2
Specification-Vendor: Example Tech, Inc.
Implementation-Title: java.util 
Implementation-Version: build57
Implementation-Vendor: Example Tech, Inc.
Created-By: 1.7.0_06 (Oracle Corporation)

 

Executable JAR

META-INF/MANIFEST.MF 파일에 메인 클래스 경로가 명시된 채, 생성된 JAR 파일은 javaw -jar 혹은 java -jar 명령으로 실행할 수 있다. 실행할 수 없는 JAR 파일과 구분하기 위해 Executable JAR 라고 부르는 것 같다.

Spring-boot, Gradle 기반의 프로젝트로부터 Executable JAR 파일을 생성하는 방법을 알아보자.

 

Gradle BootJar

스프링 부트 공식 문서를 살펴봤다.

Gradle 을 사용한다면 플러그인을 통해 Spring-boot 프로젝트의 Executable JAR 파일을 만들 수 있다.

bootJar Task를 사용하면 Executable jars 를 빌드할 수 있는데, 이 Task는 java 플러그인을 적용하면 자동으로 생성된다. assemble(buld) Task는 bootJar Task에 의존하기 떄문에 해당 Task를 실행하면 bootJar Task가 자동 실행된다.

 

그림1. Gradle build task → bootJar task에 의존

 

 

결론

Gradle을 사용하고 java 플러그인을 적용한 경우, build Task를 사용하여 실행 가능한 JAR 파일을 빌드할 수 있다.

 

참고 자료