一、 使用说明
当一个新版本的 Java 出现的时候,你的库用户要花费数年时间才会切换到这个新的版本。这就意味着库得去向后兼容你想要支持的最老的 Java 版本(许多情况下就是 Java 6 或者 Java7)。这实际上意味着未来的很长一段时间,你都不能在库中运用 Java 9 所提供的新特性。幸运的是,多版本兼容 jar 功能能让你创建仅在特定版本的 Java 环境中运行库程序选择使用的 class 版本。
举例 1:
jar root
- A.class
- B.class
- C.class
- D.class
- META-INF
- versions
- 9
- A.class
- B.class
说明:
在上述场景中, root.jar 可以在 Java 9 中使用, 不过 A 或 B 类使用的不是顶层的 root.A 或 root.B 这两个 class, 而是处“META-INF/versions/9”下面的这两个。这是特别为 Java 9 准备的class 版本,可以运用 Java 9 所提供的特性和库。同时,在早期的 Java 诸版本中使用这个 JAR 也是能运行的,因为较老版本的 Java 只会看到顶层的 A 类或 B 类
举例 2:
jar root
- A.class
- B.class
- C.class
- D.class
- META-INF
- versions
- 9
- A.class
- B.class
- 10
- A.class
二、使用举例:
步骤一:提供类
package com.gcxzflgl.jar;
public class Application {
public static void testMultiJar(){
Generator gen = new Generator();
System.out.println("Generated strings: " + gen.createStrings());
}
}
package com.gcxzflgl.jar;
import java.util.Set;
public class Generator {
public Set<String> createStrings() {
return Set.of("Java", "9");
}
}
上面两个类放到java9环境中
package com.atguigu;
import java.io.IOException;
import java.util.List;
import java.util.ArrayList;
import java.util.Set;
/**
* Created by songhongkang on 2017/12/28 0028.
*/
public class Application {
public static void testMultiJar(){
Generator gen = new Generator();
System.out.println("Generated strings: " + gen.createStrings());
}
}
package com.atguigu;
import java.util.Set;
import java.util.HashSet;
/**
* Created by songhongkang on 2017/12/28 0028.
*/
public class Generator {
public Set<String> createStrings() {
Set<String> strings = new HashSet<String>();
strings.add("Java");
strings.add("8");
return strings;
}
}
上面两个类放到java8环境中
步骤二:打包
javac -d build8 --release 8 src/main/java/com/gcxzflgl/*.java
javac -d build9 --release 9 src/main/java-9/com/gcxzflgl/*.java
jar --create --main-class=Application --file multijar.jar -C build . --release 9 -C build9 .
build的后分别生成对应的文件夹和jar包
将jar包放到java8 java9环境中,各自运行Application