Multi-version compatible JAR function อนุญาตให้สร้าง version ของคลาสที่เลือกใช้เฉพาะตอนรัน library programs ใน Java environment version เฉพาะ สามารถระบุ compiled version ผ่าน parameter --release
การเปลี่ยนแปลงเฉพาะ: ไฟล์ MANIFEST.MF ใน directory META-INF มี attribute ใหม่:
Multi-Release: true
มี version directory ใหม่ภายใต้ META-INF หากต้องการรองรับ Java 9 จะมี directory 9 ภายใต้ versions directory
multirelease.jar
├── META-INF
│ └── versions
│ └── 9
│ └── multirelease
│ └── Helper.class
├── multirelease
│ └── Helper.class
└── Main.class
ตัวอย่างสมบูรณ์: สร้าง Multi-release JAR
Step 1: สร้าง Java 7 Version
# โฟลเดอร์: C:/test/java7/com/tutorialspoint/Test.java
package com.tutorialspoint;
public class Test {
public static void main(String args[]) {
System.out.println("Inside Java 7");
}
}
Step 2: สร้าง Java 9 Version
# โฟลเดอร์: C:/test/java9/com/tutorialspoint/Test.java
package com.tutorialspoint;
public class Test {
public static void main(String args[]) {
System.out.println("Inside Java 9");
}
}
Step 3: Compile ทั้งสอง Version
C:\test> javac --release 9 java9/com/tutorialspoint/Test.java
C:\test> javac --release 7 java7/com/tutorialspoint/Test.java
Step 4: สร้าง Multi-release JAR
C:\JAVA> jar -c -f test.jar -C java7 . --release 9 -C java9 .
Warning: entry META-INF/versions/9/com/tutorialspoint/Test.java, multiple resources with same name
Step 5: ทดสอบรัน
# ใช้ JDK 7
C:\JAVA> java -cp test.jar com.tutorialspoint.Test
Inside Java 7
# ใช้ JDK 9
C:\JAVA> java -cp test.jar com.tutorialspoint.Test
Inside Java 9
โครงสร้าง Multi-release JAR
myapp.jar
├── META-INF/
│ ├── MANIFEST.MF # Multi-Release: true
│ └── versions/
│ ├── 9/ # Java 9+ specific classes
│ │ └── com/myapp/OptimizedClass.class
│ ├── 10/ # Java 10+ specific classes
│ │ └── com/myapp/OptimizedClass.class
│ └── 11/ # Java 11+ specific classes
│ └── com/myapp/OptimizedClass.class
├── com/myapp/
│ ├── Main.class # Base version (Java 8-)
│ └── OptimizedClass.class # Base version
└── module-info.class # Optional
Jar Command Options
| Option | คำอธิบาย |
|---|---|
| -c, --create | สร้าง JAR ใหม่ |
| -f, --file | ระบุชื่อไฟล์ JAR |
| -C dir | เปลี่ยน directory ก่อน add files |
| --release N | เพิ่ม files สำหรับ Java version N (ใส่ใน META-INF/versions/N/) |
| --main-class | ระบุ Main-Class ใน MANIFEST |
ข้อควรระวัง
- Base version (root) ต้อง compile ด้วย oldest supported version
- Version-specific classes ต้องมี package structure เดียวกัน
- ไม่สามารถ override module-info.class ใน versions ได้
- Resource files (non-class) ก็รองรับ multi-release ได้
- jdeps --multi-release <version> สำหรับ analyze
Use Cases
- ใช้ API ใหม่ (var, switch expressions, records) ใน version ใหม่
- Optimize performance ด้วย JDK internal APIs ใน version ใหม่
- Backward compatibility สำหรับ library users
- Migration path จาก Java 8 ไป 9, 11, 17, 21