最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java9版本新特性同一個Jar支持多JDK版本運行

 更新時間:2022年03月15日 14:20:11   作者:字母哥哥  
這篇文章主要為大家介紹了Java9新版本的特性之同一個Jar支持多JDK版本運行的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步

我計劃在后續(xù)的一段時間內(nèi),寫一系列關(guān)于java 9的文章,雖然java 9 不像Java 8或者Java 11那樣的核心java版本,但是還是有很多的特性值得關(guān)注。期待您能關(guān)注我,我將把java 9 寫成一系列的文章,大概十篇左右。

java9第一篇-可以在interface中定義私有方法了

java9第二篇-Java9改進try-with-resources語法

本文內(nèi)容:在Java 9增強了JAR多版本字節(jié)碼文件格式的支持,同一個Jar包可以包含多個Java版本的class文件。使用這個功能,我們可以將應(yīng)用程序/庫升級到新的Java版本,而不必強迫用戶升級到相同的Java版本。

一、基本使用方法

多版本的字節(jié)碼發(fā)行jar包,需要在其MANIFEST.MF中做以下的聲明:

Multi-Release: true

在jar包的META-INF/versions文件目錄里面可以包含多個版本的class文件,編譯結(jié)果目錄結(jié)構(gòu)如下:

jar root
  - A.class
  - B.class
  - META-INF
     - versions
        - 9
           - A.class

假設(shè)上文中的根目錄是使用java 8 或之前版本編譯的字節(jié)碼文件A.calss。META-INF/versions/9/是使用java 9 編寫的java代碼的編譯結(jié)果A.class。

如果jar包是在JDK 8的運行時環(huán)境下運行,將使用根目錄下面的class文件進行程序運行。

如果jar包是在JDK 9的運行時環(huán)境下運行,將使用META-INF/versions/9/下面的class文件進行程序運行。

假設(shè)未來這個項目升級JDK 10,決定在A.java中使用Java 10的一些新特性,可以單獨針對A.class進行語法升級,并將編譯結(jié)果a.class放置在META-INF/versions/10/下面

jar root
  - A.class
  - B.class
  - META-INF
     - versions
        - 9
           - A.class
        - 10
           - A.class

現(xiàn)在,上面的jar包含了可以以三種Java版本運行的字節(jié)碼文件,A.class兼容JDK 8、9、10。

二、真實的例子

java 8代碼

下面的類文件代碼我們讓它運行在Java 8的環(huán)境下

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的應(yīng)用程序入口文件,調(diào)用IOUtil.convertToString方法將InputStream轉(zhuǎn)換成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 發(fā)布之后,我們決定使用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字節(jié)碼文件,并將class文件按照如下的目錄結(jié)構(gòu)打成保存,并打jar包。(先按java8版本打成jar包,然后修改MANIFEST.MF文件,添加java 9字節(jié)碼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的環(huán)境下運行這個jar包

D:\multi-release-jar-example>java -cp my-lib.jar com.example.Main
IOUtil 使用java 9 版本
測試字符串

在JDK 8的環(huán)境下運行這個jar包

D:\multi-release-jar-example>C:\jdk1.8.0_151\bin\java -cp my-lib.jar com.example.Main
IOUtil 使用java 8 版本
測試字符串

以上就是Java9版本新特性同一個Jar支持多JDK版本運行的詳細內(nèi)容,更多關(guān)于Java9 Jar支持多JDK版本運行的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • springboot自定義注解RateLimiter限流注解技術(shù)文檔詳解

    springboot自定義注解RateLimiter限流注解技術(shù)文檔詳解

    文章介紹了限流技術(shù)的概念、作用及實現(xiàn)方式,通過Spring AOP攔截方法、緩存存儲計數(shù)器,結(jié)合注解、枚舉、異常類等核心組件,實現(xiàn)對訪問頻率的控制,旨在防止攻擊、保障系統(tǒng)穩(wěn)定、提升用戶體驗及節(jié)約成本
    2025-07-07
  • java Hibernate延遲加載

    java Hibernate延遲加載

    對one-to-one 關(guān)系進行延遲加載和其他關(guān)系相比稍微有些不同。many-to-one 的延遲加載是在配置文件的class 標(biāo)簽
    2008-10-10
  • MyBatis+MyBatisPlus中遇到的一些坑及解決

    MyBatis+MyBatisPlus中遇到的一些坑及解決

    這篇文章主要介紹了MyBatis+MyBatisPlus中遇到的一些坑及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • ?Spring?中?Bean?的生命周期詳解

    ?Spring?中?Bean?的生命周期詳解

    這篇文章主要介紹了Spring中Bean的生命周期詳解,Java中的公共類稱之為Bean或Java?Bean,而Spring中的Bean指的是將對象的生命周期
    2022-09-09
  • Mybatis-plus實現(xiàn)主鍵自增和自動注入時間的示例代碼

    Mybatis-plus實現(xiàn)主鍵自增和自動注入時間的示例代碼

    這篇文章主要介紹了Mybatis-plus實現(xiàn)主鍵自增和自動注入時間的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • java反射機制給實體類相同字段自動賦值實例

    java反射機制給實體類相同字段自動賦值實例

    這篇文章主要介紹了java反射機制給實體類相同字段自動賦值實例,具有
    2020-08-08
  • Java錯誤org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.sjks.mapper.Use

    Java錯誤org.apache.ibatis.binding.BindingException: Inval

    本文主要介紹了Java錯誤org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.sjks.mapper.Use,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • Java編程 多態(tài)

    Java編程 多態(tài)

    這篇文章主要介紹了關(guān)于Java編程的多態(tài),多態(tài)通過分離做什么和怎么做,從另一個角度將接口和實現(xiàn)分離開來。構(gòu)建可擴展的程序,需要的朋友可以參考下
    2021-10-10
  • Springboot中@Value的使用詳解

    Springboot中@Value的使用詳解

    這篇文章主要介紹了Springboot中@Value的使用詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • spring cloud consul使用ip注冊服務(wù)的方法示例

    spring cloud consul使用ip注冊服務(wù)的方法示例

    這篇文章主要介紹了spring cloud consul使用ip注冊服務(wù)的方法示例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03

最新評論

曲沃县| 镇原县| 庄浪县| 辉县市| 乌拉特后旗| 新平| 松溪县| 陆丰市| 迭部县| 阿克陶县| 四平市| 西峡县| 巴塘县| 涞水县| 华坪县| 靖远县| 徐汇区| 虎林市| 黄陵县| 昌乐县| 长兴县| 固阳县| 新津县| 筠连县| 祁门县| 西乌珠穆沁旗| 南华县| 长葛市| 包头市| 株洲市| 临沂市| 鄯善县| 崇信县| 闵行区| 临澧县| 泽库县| 常州市| 扶沟县| 宁波市| 九龙坡区| 阜阳市|