Spring
War와 Jar
minturtle
2024. 11. 15. 15:02
반응형
개요
- Spring 또는 Java로 웹 어플리케이션을 만들게 되면 .war 파일과 .jar 이 생성됩니다. 이번에는 이 파일들에 대해 알아보고자 합니다.
Jar 파일
- jar 파일은 java archive의 약자로, JVM위에서 실행되거나 라이브러리로 사용할 수 있도록 관련 된 자바 클래스 파일을 압축한 파일입니다.
- 실행하는 경우 main() 메서드가 필요하며, MANIFEST.MF에 메인 메서드의 클래스를 지정해 주어야 합니다.
- jar 파일을 압축 해제 했을때 포함하는 파일은 다음과 같습니다.
- META-INF
- MANIFEST.MF : jar 파일을 시작할 때 실행되는 main 메서드와 기타 메타 정보를 포함한 파일
- classes : 사용자가 작성한 Java 코드(ByteCode의 형태)
- META-INF
- jar 파일은 기본적으로 Jar파일 내부에 jar파일을 포함할 수 없기 때문에, 라이브러리를 내장할 수 없습니다.
FatJar
- 위의 jar파일 내에 라이브러리 jar파일을 실행할 수 없는 문제를 해결하기 위해 fat jar라는 기능을 사용합니다.
- fat jar는 라이브러리의 jar파일을 해제해 생긴 class 파일들을 새로 만드는 jar파일에 포함시키는 방법입니다.
- 그러나 FatJar도 단점이 있는데, 아래와 같습니다.
- 어떤 라이브러리를 사용하는지 확인하기 어렵습니다.
- 파일명 중복을 해결하기 어렵습니다.
- META-INF에서 등록한 초기화 함수가 여러개 존재한다면, java 실행시 임의의 하나의 파일만 등록되어 초기화 됩니다.
Executable Jar
- Spring Boot에서는 BOOT-INF 폴더가 존재합니다. 이 폴더에는 classes(개발자가 작성한 코드의 바이트 코드)와 lib 폴더에 라이브러리 jar파일(?!)가 존재합니다.
- jar파일안에는 jar가 존재하지 못한다고 했는데, Spring Boot는 어떻게 해결하는 것일까요?
- 스프링 부트에서는 Executable jar 이라는 특별한 구조의 jar를 만들어서, jar 파일 안에 jar를 포함하는 것이 가능하도록 만들어버렸습니다.
- executable jar은 아래의 구조를 가집니다.
- META-INF
- MANIFEST.MF : 메타정보와 메인 클래스 정보
- org/springframework/boot/loader
- JarLauncher.class : Spring Boot 앱을 실행하는 메인 메서드가 있는 클래스
- BOOT-INF:
- classes : 개발자가 작성한 class 파일
- lib : 외부 라이브러리(jar 파일로 존재)
- classpath.idx : 외부 라이브러리 모음
- layer.idx : 스프링 부트 구조 정보
- META-INF
war 파일
- war파일은 Web Application Archive의 약자로, WAS에 배포할 때 사용되는 파일입니다.
- 이는 자바 클래스 파일, HTML등의 웹 서버 구동에 필요한 자원을 한데 모아 놓고 압축되어 제공됩니다.
- 이러한 파일은 압축된 상태로 전달되며, 압축 해제했을 때 아래의 파일들이 존재하게 됩니다.
- WEB-INF :
- classes : 사용자가 정의한 실행 클래스
- lib : 라이브러리 모음
- 정적 파일(HTML, CSS, JS 파일 등)
- WEB-INF :
추가 내용
- jar와 war는 jar 명령어를 사용해 해제할 수 있으며, 이는 JDK에 내장되어 있습니다.
출처
- [Spring boot 배포 War 만들기 (War 파일이란?)]
- [스프링 부트 - 핵심 원리와 활용 강의 | 김영한 - 인프런]
반응형