Multi-Release JAR (mrjar) chứa nhiều phiên bản class cho các JDK khác nhau trong cùng một file JAR. Cho phép thư viện tận dụng API mới của JDK 9+ mà vẫn tương thích JDK 8.
Cấu trúc thư mục
JAR thông thường
- jar-root
- C1.class
- C2.class
- C3.class
- C4.class
- META-INF
- MANIFEST.MF
Multi-Release JAR
- jar-root
- C1.class (base version, JDK 8-)
- C2.class
- C3.class
- C4.class
- META-INF
- MANIFEST.MF
- versions
- 9
- C2.class (JDK 9 version)
- C5.class (chỉ có JDK 9+)
- 10
- C1.class (JDK 10 version)
- C2.class
- C6.class (chỉ có JDK 10+)
Cơ chế hoạt động
- JDK 8 trở xuống: chỉ thấy
jar-root, bỏ quaMETA-INF/versions/. - JDK 9: ưu tiên class trong
META-INF/versions/9/ghi đè class gốc. - JDK 10: ưu tiên
versions/10/, fallback vềversions/9/, rồi gốc. - Manifest phải có:
Multi-Release: true.
Tạo mrjar
# Compile cho JDK 8 (base)
javac -d out/java8 src/...
# Compile cho JDK 9 (override một số class)
javac --release 9 -d out/java9 src/...
# Package mrjar
jar --create --file mrjar.jar \
-C out/java8 . \
--release 9 -C out/java9 . \
--main-class com.example.Main
Lợi ích
- Một JAR chạy mọi JDK version.
- Tận dụng API mới (var, Stream API mới, HTTP Client...) trên JDK mới.
- Không cần phát hành nhiều artifact khác nhau.
Mrjar là công cụ quan trọng cho thư viện phổ biến (Guava, Spring, Jackson...) duy trì tương thích ngược.