ㅇ.ㅇ
[Java] META-INF 디렉토리와 MANIFEST.MF 본문
Java 애플리케이션을 배포할 때, JAR, WAR 같은 패키징 파일 내부에는 META-INF 디렉토리와 MANIFEST.MF 파일이 포함된다. 도대체 얘네는 어디에서 나오는걸까? 궁금해서 찾아보며 간단히 정리를 해보았다.
1. META-INF 디렉토리란?
META-INF 디렉토리는 JAR, WAR 파일 내부에서 해당 패키지(아카이브)와 관련된 설정 정보를 저장하는 디렉토리다.
META-INF의 주요 역할
- 메타데이터 저장 : 패키지의 버전, 개발자 정보 등 포함
- 보안 관련 정보 저장 : 디지털 서명, 암호화 키 등이 위치
- 서비스 로딩 : 특정 인터페이스의 구현체를 자동으로 검색하는 기능 제공
- MANIFEST.MF 파일 포함 : JAR, WAR의 속성을 정의하는 주요 파일
META-INF 디렉토리의 위치
JAR 또는 WAR 파일 내부에서 기본적으로 루트 디렉토리에 존재하며, 일반적으로 다음과 같은 구조를 가진다.
application.war
│── META-INF/
│ ├── MANIFEST.MF <-- 주요 설정 파일
│ ├── application.xml
│ ├── persistence.xml
│ ├── services/ <-- 서비스 로딩 관련 디렉토리
│ ├── some-library.sig <-- 디지털 서명 파일
│── WEB-INF/
│ ├── web.xml
│ ├── classes/
│ ├── lib/
- JAR 파일 → META-INF는 패키징 정보, 서명, 서비스 로딩 설정을 포함
- WAR 파일 → META-INF는 웹 애플리케이션의 메타정보를 저장하며, WEB-INF와는 별도로 존재
2. MANIFEST.MF 파일이란?
MANIFEST.MF는 META-INF 디렉토리 내부에 위치하며, JAR/WAR 파일의 속성을 정의하는 메타데이터 파일이다.
MANIFEST.MF의 주요 역할
- JAR/WAR의 버전 정보 제공 (Implementation-Version)
- 개발사 정보 (Implementation-Vendor)
- 실행 가능한 JAR의 메인 클래스 지정 (Main-Class)
- 특정 라이브러리와의 호환성 설정
- 서비스 프로바이더 등록 (ServiceLoader 지원)
MANIFEST.MF의 기본 구조
Manifest-Version: 1.0
Implementation-Title: MyApplication
Implementation-Version: 1.0.0
Implementation-Vendor: TEST Corp.
Created-By: 1.8.0_281 (Oracle Corporation)
Main-Class: com.example.Main
- Manifest-Version : MANIFEST 파일의 버전 (기본값: 1.0)
- Implementation-Title : 프로젝트명
- Implementation-Version : 애플리케이션 버전
- Implementation-Vendor : 개발사
- Created-By : JDK 버전
- Main-Class : JAR를 실행할 때 사용할 메인 클래스
3. MANIFEST.MF 파일이 중요한 이유
실행 가능한 JAR 만들기
JAR 파일을 실행 가능하게 만들려면 MANIFEST.MF에 Main-Class를 지정해야 한다.
Main-Class: com.example.Main
// JAR 실행 명령어
java -jar my-application.jar
이 설정이 없으면 java -jar로 실행할 수 없다.
애플리케이션의 메타정보 제공
JAR/WAR 파일의 버전 및 개발사 정보를 확인할 수 있다.
Implementation-Title: MyApplication
Implementation-Version: 1.0.0
Implementation-Vendor: WeMB Corp.
이 정보는 배포 및 버전 관리를 할 때 유용하다.
서비스 로딩 (ServiceLoader 지원)
특정 인터페이스를 구현하는 클래스를 META-INF/services 폴더에 추가하면, ServiceLoader를 통해 자동으로 검색할 수 있다.
예를 들어, com.example.MyService 인터페이스를 구현하는 클래스를 로딩하려면
META-INF/services/com.example.MyService
// 파일 내용
com.example.impl.MyServiceImpl
이렇게 설정하면 ServiceLoader.load(com.example.MyService.class)를 호출할 때 자동으로 구현체를 찾아준다.
META-INF/MANIFEST.MF는 JAR/WAR 파일의 중요한 설정 파일이며, 올바르게 관리하지 않으면 원하는 메타데이터가 사라질 수 있다. 애플리케이션 버전도 해당 파일을 열어 바로 확인할 수도 있고, 관리에도 편리할 것 같다.
'Today I Learned' 카테고리의 다른 글
[Tomcat] Tomcat의 war-tracker 파일 (0) | 2025.03.28 |
---|---|
[Git] Stash (0) | 2025.03.23 |
[Java] try-with-resources (자원 관리 최적화) (1) | 2025.03.11 |
[DEV] SBOM에 대하여 (0) | 2025.03.09 |
[Oracle] Oracle에서 NULL 값 다루기 (0) | 2025.03.09 |