共计 2645 个字符,预计需要花费 7 分钟才能阅读完成。
我打算在后续的一段时间内,写一系列对于 java 9 的文章,尽管 java 9 不像 Java 8 或者 Java 11 那样的外围 java 版本,然而还是有很多的个性值得关注。期待您能关注我,我将把 java 9 写成一系列的文章,大略十篇左右。
- java9 第一篇 - 能够在 interface 中定义公有办法了
- java9 第二篇 -Java9 改良 try-with-resources 语法
本文内容:在 Java 9 加强了 JAR 多版本字节码文件格式的反对,同一个 Jar 包能够蕴含多个 Java 版本的 class 文件。应用这个性能,咱们能够将应用程序 / 库降级到新的 Java 版本,而不用强制用户降级到雷同的 Java 版本。
一、根本应用办法
多版本的字节码发行 jar 包,须要在其 MANIFEST.MF 中做以下的申明:
Multi-Release: true
在 jar 包的 META-INF/versions
文件目录外面能够蕴含多个版本的 class 文件,编译后果目录构造如下:
jar root
- A.class
- B.class
- META-INF
- versions
- 9
- A.class
假如上文中的根目录是应用 java 8 或之前版本编译的字节码文件 A.calss。META-INF/versions/9/
是应用 java 9 编写的 java 代码的编译后果 A.class。
- 如果 jar 包是在 JDK 8 的运行时环境下运行,将应用根目录上面的 class 文件进行程序运行。
- 如果 jar 包是在 JDK 9 的运行时环境下运行,将应用
META-INF/versions/9/
上面的 class 文件进行程序运行。
假如将来这个我的项目降级 JDK 10,决定在 A.java 中应用 Java 10 的一些新个性,能够独自针对 A.class 进行语法降级,并将编译后果 a.class 搁置在 META-INF/versions/10/
上面
jar root
- A.class
- B.class
- META-INF
- versions
- 9
- A.class
- 10
- A.class
当初,下面的 jar 蕴含了能够以三种 Java 版本运行的字节码文件,A.class 兼容 JDK 8、9、10。
二、实在的例子
java 8 代码
上面的类文件代码咱们让它运行在 Java 8 的环境下
package com.example;
public class IOUtil {public static String convertToString(InputStream inputStream) throws IOException {System.out.println("IOUtil 应用 java 8 版本");
Scanner scanner = new Scanner(inputStream, "UTF-8");
String str = scanner.useDelimiter("\\A").next();
scanner.close();
return str;
}
}
减少一个 Main.java 的应用程序入口文件,调用 IOUtil.convertToString 办法将 InputStream 转换成 String。
package com.example;
public class Main {public static void main(String[] args) throws IOException {InputStream inputStream = new ByteArrayInputStream("测试字符串".getBytes());
String result = IOUtil.convertToString(inputStream);
System.out.println(result);
}
}
Java 9 代码
在 Java 9 公布之后,咱们决定应用 Java 9 的新的语法重写 IOUtil.convertToString 办法。
package com.example;
public class IOUtil {public static String convertToString(InputStream inputStream) throws IOException {System.out.println("IOUtil 应用 java 9 版本");
try (inputStream) { //Java9 版本的加强 try-with-resources
String str = new String(inputStream.readAllBytes());
return str;
}
}
}
如上的代码所示,咱们应用了 Java 9 的两个新个性带有 inputStream 援用的 try-with-resource 块和新的 InputStream.readAllBytes()办法。
编译
将 Java8、Java9 的 IOUtil.java 代码别离在 JDK8、JDK9 的版本下别离编译成 class 字节码文件,并将 class 文件依照如下的目录构造打成保留,并打 jar 包。(先按 java8 版本打成 jar 包,而后批改 MANIFEST.MF 文件,增加 java 9 字节码 class 文件即可)
D:\multi-release-jar-example\my-lib-jar>tree /A /F
+---com
| \---example
| IOUtil.class
| Main.class
|
\---META-INF
| MANIFEST.MF
|
\---versions
\---9
\---com
\---example
IOUtil.class
运行 Main class
在 JDK 9 的环境下运行这个 jar 包
D:\multi-release-jar-example>java -cp my-lib.jar com.example.Main
IOUtil 应用 java 9 版本
测试字符串
在 JDK 8 的环境下运行这个 jar 包
D:\multi-release-jar-example>C:\jdk1.8.0_151\bin\java -cp my-lib.jar com.example.Main
IOUtil 应用 java 8 版本
测试字符串
欢送关注我的博客,外面有很多精品合集
本文转载注明出处(必须带连贯,不能只转文字):字母哥博客 – zimug.com
感觉对您有帮忙的话,帮我点赞、分享!您的反对是我不竭的创作能源!。另外,笔者最近一段时间输入了如下的精品内容,期待您的关注。
- 《手摸手教你学 Spring Boot2.0》
- 《Spring Security-JWT-OAuth2 一本通》
- 《实战前后端拆散 RBAC 权限管理系统》
- 《实战 SpringCloud 微服务从青铜到王者》
- 《VUE 深入浅出系列》