Multi-release JAR (mrjar) เป็น JAR ที่มีไลบรารีรุ่นเดียวกันสำหรับ หลายเวอร์ชัน JDK หมายความว่าเราสามารถมีไลบรารีเป็น mrjar ที่ทำงานบน JDK 9 โค้ดใน mrjar มี class files ที่คอมไพล์ด้วย JDK 9 คลาสเหล่านี้อาจใช้ API ที่ JDK 9 เสนอ
โครงสร้าง JAR ธรรมดา
- jar-root
- C1.class
- C2.class
- C3.class
- C4.class
- META-INF
- MANIFEST.MF
โครงสร้าง Multi-Release JAR
mrjar ขยายโครงสร้าง META-INF เพื่อเก็บคลาสเฉพาะเวอร์ชัน JDK โฟลเดอร์ META-INF/versions มีซับไดเรกทอรีชื่อตาม major version ของ JDK
- jar-root
- C1.class
- C2.class
- C3.class
- C4.class
- META-INF
- MANIFEST.MF
- versions
- 9
- C2.class
- C5.class
- 10
- C1.class
- C2.class
- C6.class
การทำงาน
- JDK 9+ จะโหลดคลาสจาก
META-INF/versions/9/แทนที่ใน root - JDK 10+ จะโหลดจาก
META-INF/versions/10/ - JDK 8 หรือเก่ากว่า (ไม่รองรับ mrjar) จะโหลดจาก root ตามปกติ
- ต้องมี
Multi-Release: trueใน MANIFEST.MF
สร้าง mrjar ด้วยคำสั่ง jar
jar --create --file mrjar.jar -C classes-root . --release 9 -C classes-9 . --release 10 -C classes-10 .
mrjar ช่วยให้ไลบรารีเดียวรองรับหลาย JDK ได้ โดยใช้ API ใหม่ในเวอร์ชันใหม่ แต่ยังทำงานบน JDK เก่าได้