티스토리 뷰
스프링 웹 애플리케이션을 만들었다. 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 파일에 포함된 파일 리스트와 각 파일들에 대한 속성 정보를 기록하는 파일- 예를 들어, JAR 파일에 포함된 클래스 파일들의 메인 클래스를 지정, 확장팩의 정보를 기술
- 자세한 내용은 Oracle: Working with Manifest Files: The Basics 참조
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가 자동 실행된다.

결론
Gradle을 사용하고 java 플러그인을 적용한 경우, build Task를 사용하여 실행 가능한 JAR 파일을 빌드할 수 있다.
참고 자료
- https://docs.oracle.com/javase/8/docs/technotes/guides/jar/jarGuide.html
- https://docs.oracle.com/javase/8/docs/technotes/guides/jar/jar.html
- https://docs.spring.io/spring-boot/docs/current/gradle-plugin/reference/htmlsingle/#packaging-executable.jars
- https://ko.wikipedia.org/wiki/자바_애플릿
- https://stackoverflow.com/questions/5258159/how-to-make-an-executable-jar-file
'좌충우돌 프로젝트 이야기' 카테고리의 다른 글
| 동시성 이슈 해결 2탄 - DB 레벨 동시성 이슈 (MySQL Lock, 낙관적락, 비관적락) (3) | 2023.07.28 |
|---|---|
| 동시성 이슈 해결 1탄 - 코드 레벨 동시성 이슈 (Synchronized, Atomic) (0) | 2023.07.28 |
| 연결리스트 vs 배열리스트 선택하기 (+성능 향상 사례) (0) | 2023.07.15 |
| 롤문철 닷컴 구현기 2탄: 로그인 기능 구현 (JWT vs Session) (0) | 2023.07.02 |
| CI/CD 파이프라인 구축(2) [Spring Boot, Jenkins, Naver Cloud] - 테스트 커버리지를 강제하는 CI 파이프라인 구축 (1) | 2023.06.17 |
- Total
- Today
- Yesterday
- java 로그인
- F-LAB
- Jenkins
- CI/CD 파이프라인
- NHN 엔터프라이즈
- application.yml 분리
- T 인터뷰
- 개발자 면접
- 더미데이터 생성
- 낙관적락
- application.properties 분리
- CD 파이프라인 구축
- HTTP 완벽 가이드
- C 인터뷰
- GitHub Webhook
- CI/CD
- NHN 엔터프라이즈 면접
- 랠릿
- Docker 자동화 배포
- 디지털 청년 고민 해결단
- Spring Application 서버 실행
- 분산락
- 배열리스트
- JWT 토큰
- 디지털 청년 고민 해결단 온라인 멘토링
- 회고
- 데이터베이스 동시성
- 비관적락
- NHN 면접
- 동시성 이슈
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 | 31 |