다중 릴리스 JAR(Multi-Release JAR)란?
Java 9에서는 다중 릴리스 JAR(Multi-Release JAR, MRJAR)이라는 새로운 기능이 도입되었습니다. 이 형식은 하나의 JAR 파일 안에 Java 버전별로 서로 다른 클래스나 리소스를 함께 담을 수 있도록 기존 JAR 형식을 확장한 것으로, 실행 환경의 플랫폼 버전에 맞는 클래스가 자동으로 선택되어 사용됩니다.
jar 명령어로 다중 릴리스 JAR 생성하기
jar 명령어를 사용하면 Java 8용과 Java 9용으로 각각 컴파일된 동일한 클래스 두 버전을 하나의 다중 릴리스 JAR에 포함시킬 수 있습니다. 이때 두 클래스의 내용이 완전히 같다는 경고 메시지가 출력될 수 있습니다.
jar --create --file MR.jar -C sampleproject-base demo --release 9 -C sampleproject-9 demo
Warning: entry META-INF/versions/9/demo/SampleClass.class contains a class that is identical to an entry already in the jar
--release 옵션의 역할
명령어에서 --release 9 옵션은 jar 도구에게, 이 옵션 뒤에 오는 모든 내용(여기서는 'sampleproject-9' 디렉터리 내부의 demo 패키지)을 버전별 항목(versioned entry)으로 처리하도록 지시합니다. 결과적으로 해당 파일들은 MRJAR 내부의 META-INF/versions/9 경로 아래에 배치됩니다.
생성된 MRJAR의 디렉터리 구조
위 명령어로 생성된 다중 릴리스 JAR의 내부 구조는 다음과 같습니다.
jar root
- demo
- SampleClass.class
- META-INF
- versions
- 9
- demo
- SampleClass.class
JAR의 루트에는 Java 8 이하에서 사용되는 기본 클래스가 위치하고, META-INF/versions/9 디렉터리에는 Java 9 전용으로 컴파일된 클래스가 들어갑니다. 덕분에 구버전 JDK 환경에서는 루트의 클래스가, Java 9 이상 환경에서는 버전별 디렉터리의 클래스가 로드되므로, 하위 호환성을 유지하면서 최신 API를 활용할 수 있습니다.