我打算在后续的一段时间内,写一系列对于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.MainIOUtil 应用java 9 版本测试字符串

在JDK 8的环境下运行这个jar包

D:\multi-release-jar-example>C:\jdk1.8.0_151\bin\java -cp my-lib.jar com.example.MainIOUtil 应用java 8 版本测试字符串

欢送关注我的博客,外面有很多精品合集

本文转载注明出处(必须带连贯,不能只转文字):字母哥博客 - zimug.com

感觉对您有帮忙的话,帮我点赞、分享!您的反对是我不竭的创作能源! 。另外,笔者最近一段时间输入了如下的精品内容,期待您的关注。

  • 《手摸手教你学Spring Boot2.0》
  • 《Spring Security-JWT-OAuth2一本通》
  • 《实战前后端拆散RBAC权限管理系统》
  • 《实战SpringCloud微服务从青铜到王者》
  • 《VUE深入浅出系列》