2024年最新Java9系列第三篇-同一个Jar支持多JDK版本运行,java面试技巧和注意事项

Java高频面试专题合集解析:

阿里Java岗面试百题:Spring 缓存 JVM 微服务 数据库 RabbitMQ等

当然在这还有更多整理总结的Java进阶学习笔记和面试题未展示,其中囊括了Dubbo、Redis、Netty、zookeeper、Spring cloud、分布式、高并发等架构资料和完整的Java架构学习进阶导图!

阿里Java岗面试百题:Spring 缓存 JVM 微服务 数据库 RabbitMQ等

更多Java架构进阶资料展示

阿里Java岗面试百题:Spring 缓存 JVM 微服务 数据库 RabbitMQ等

阿里Java岗面试百题:Spring 缓存 JVM 微服务 数据库 RabbitMQ等

阿里Java岗面试百题:Spring 缓存 JVM 微服务 数据库 RabbitMQ等

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

假设上文中的根目录是使用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


# 总结

其他的内容都可以按照路线图里面整理出来的知识点逐一去熟悉,学习,消化,不建议你去看书学习,最好是多看一些视频,把不懂地方反复看,学习了一节视频内容第二天一定要去复习,并总结成思维导图,形成树状知识网络结构,方便日后复习。

这里还有一份很不错的《Java基础核心总结笔记》,特意跟大家分享出来

**目录:**

![](https://img-blog.csdnimg.cn/img_convert/ad1d08ede6417aea17de20020b325721.webp?x-oss-process=image/format,png)

**部分内容截图:**

![](https://img-blog.csdnimg.cn/img_convert/fba18b1aa725d7980cbd9095eb6b9f69.webp?x-oss-process=image/format,png)

![](https://img-blog.csdnimg.cn/img_convert/437263c597f215e1546e5b2e1c1b0b71.webp?x-oss-process=image/format,png)



> **本文已被[CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】](https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)收录**

**[需要这份系统化的资料的朋友,可以点击这里获取](https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)**

246786)]



> **本文已被[CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】](https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)收录**

**[需要这份系统化的资料的朋友,可以点击这里获取](https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)**

  • 17
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值