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

我計劃在后續(xù)的一段時間內(nèi),寫一系列關(guān)于java 9的文章,雖然java 9 不像Java 8或者Java 11那樣的核心java版本,但是還是有很多的特性值得關(guān)注。期待您能關(guān)注我,我將把java 9 寫成一系列的文章,大概十篇左右。
java9第二篇-Java9改進(jìn)try-with-resources語法
本文內(nèi)容:在Java 9增強(qiáng)了JAR多版本字節(jié)碼文件格式的支持,同一個Jar包可以包含多個Java版本的class文件。使用這個功能,我們可以將應(yīng)用程序/庫升級到新的Java版本,而不必強(qiáng)迫用戶升級到相同的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文件進(jìn)行程序運行。
如果jar包是在JDK 9的運行時環(huán)境下運行,將使用META-INF/versions/9/下面的class文件進(jìn)行程序運行。
假設(shè)未來這個項目升級JDK 10,決定在A.java中使用Java 10的一些新特性,可以單獨針對A.class進(jìn)行語法升級,并將編譯結(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版本的增強(qiáng)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版本運行的詳細(xì)內(nèi)容,更多關(guān)于Java9 Jar支持多JDK版本運行的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
使用IDEA進(jìn)行安卓開發(fā)的詳細(xì)圖文教程
安卓開發(fā)本身就是Java開發(fā)的一個分支,我們要確保計算機(jī)已經(jīng)安裝好JDK并做好了相關(guān)的配置,下面這篇文章主要給大家介紹了關(guān)于如何使用IDEA進(jìn)行安卓開發(fā)的詳細(xì)圖文教程,需要的朋友可以參考下2023-04-04
Java的Spring框架中實現(xiàn)發(fā)送郵件功能的核心代碼示例
這篇文章主要介紹了Java的Spring框架中實現(xiàn)發(fā)送郵件功能的核心代碼示例,包括發(fā)送帶附件的郵件功能的實現(xiàn),需要的朋友可以參考下2016-03-03
Spring框架JavaMailSender發(fā)送郵件工具類詳解
這篇文章主要為大家詳細(xì)介紹了Spring框架JavaMailSender發(fā)送郵件工具類,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-04-04
java生成excel并導(dǎo)出到對應(yīng)位置的方式
這篇文章主要介紹了java生成excel并導(dǎo)出到對應(yīng)位置的方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-01-01
Spring Data JPA實現(xiàn)動態(tài)條件與范圍查詢實例代碼
本篇文章主要介紹了Spring Data JPA實現(xiàn)動態(tài)條件與范圍查詢實例代碼,非常具有實用價值,需要的朋友可以參考下2017-06-06
使用logback實現(xiàn)按自己的需求打印日志到自定義的文件里
這篇文章主要介紹了使用logback實現(xiàn)按自己的需求打印日志到自定義的文件里,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-08-08
springboot Controller直接返回String類型帶來的亂碼問題及解決
文章介紹了在Spring Boot中,當(dāng)Controller直接返回String類型時可能出現(xiàn)的亂碼問題,并提供了解決辦法,通過在`application.yaml`中設(shè)置請求和響應(yīng)的編碼格式,并在自定義配置類中進(jìn)行配置,可以有效解決這一問題2024-11-11

