Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Java

Multi-Release JAR (mrjar) trong Java 9 là gì?

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ỏ qua META-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.