0. 들어가며


JAR, WAR, Fat JAR, Executable JAR 같은 용어들을 자주 접하는데 제대로 알고 있는 것 같지 않아서 이에 대해 정리해보려한다.

1. JAR가 무엇인가


JAR(Java Archive)는 ZIP 포맷 기반의 압축 파일이다. JAR는 클래스 파일(.class), 리소스 파일, 메타데이터를 하나로 묶은 ZIP 압축 파일이라고 보면 된다.

JAR 파일을 열어보면 내부 구조는 다음과 같이 구성되어있다.

hello.jar
 ├── META-INF/
 │   └── MANIFEST.MF
 └── com/
     └── example/
         └── Hello.class

여기서 핵심은 META-INF/MANIFEST.MF 파일이다. 이 파일은 JAR의 메타데이터, 즉 “이 JAR가 어떻게 실행 될지”를 정의하는 역할을 한다.

예를 들면, 해당 파일이 아래와 같이 작성되어있다고 가정해보자

Manifest-Version: 1.0
Main-Class: com.example.Hello
Class-Path: lib/a.jar lib/b.jar

이건 JVM에게 다음과 같이 말하는 것과 같다.

이 덕에 다음과 같은 명령어로 프로그램을 실행할 수 있는 것이다.

$ java -jar hello.jar