티스토리 뷰
스프링 웹 애플리케이션을 만들었다. 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가 자동 실행된다.
![](https://blog.kakaocdn.net/dn/bw56iM/btspflFesRC/KCrda1LADHDonnaGk7gjHk/img.png)
결론
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 로그인
- 더미데이터 생성
- 동시성 이슈
- 낙관적락
- application.yml 분리
- 디지털 청년 고민 해결단 온라인 멘토링
- HTTP 완벽 가이드
- application.properties 분리
- 분산락
- JWT 토큰
- 비관적락
- NHN 엔터프라이즈 면접
- F-LAB
- Jenkins
- 랠릿
- CI/CD 파이프라인
- NHN 엔터프라이즈
- CD 파이프라인 구축
- 데이터베이스 동시성
- C 인터뷰
- T 인터뷰
- NHN 면접
- 배열리스트
- Spring Application 서버 실행
- Docker 자동화 배포
- 개발자 면접
- 회고
- GitHub Webhook
- 디지털 청년 고민 해결단
- CI/CD
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |