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

Java SE 9 多版本兼容 JAR 包示例

 更新時(shí)間:2022年08月16日 11:22:10   作者:敲代碼的老賈???????  
這篇文章主要介紹了Java SE 9 多版本兼容 JAR 包示例,Java 9 版本中增強(qiáng)了Jar 包多版本字節(jié)碼文件格式支持,也就是說(shuō)在同一個(gè) Jar 包中我們可以包含多個(gè) Java 版本的 class 文件,更多相關(guān)內(nèi)容感興趣的小伙伴可以參考一下

說(shuō)明

Java 9 版本中增強(qiáng)了Jar 包多版本字節(jié)碼文件格式支持,也就是說(shuō)在同一個(gè) Jar 包中我們可以包含多個(gè) Java 版本的 class 文件,這樣就能做到 Jar 包升級(jí)到新的 Java 版本時(shí)不用強(qiáng)迫使用方為了使用新 Jar 包而升級(jí)自己的業(yè)務(wù)模塊 Java 版本,也不用針對(duì)不同最低支持 Java 版本提供不同的 Jar,真正的做到了一個(gè) Jar 包兼容所有的目的。

本文通過(guò)以下示例來(lái)說(shuō)明多版本 Jar 包的使用。

環(huán)境準(zhǔn)備

機(jī)器上應(yīng)該有多個(gè)版本的 JDK 用于測(cè)試,并且至少有一個(gè)是 JDK 9 或者更高版本。

命令行編譯示例

注:本示例無(wú)需使用 IDE ,我們用最原始的方式創(chuàng)建一個(gè)多版本的 Jar 包。

新建一個(gè)文件夾,用項(xiàng)目名稱(chēng)命名,并且在其中把 src 目錄,包名都建好,可以自定義,后續(xù)編譯命令自行調(diào)整即可。

src\main\java\git\snippet 目錄下存的是舊版本 JDK 編寫(xiě)的代碼。在這個(gè)目錄下新建兩個(gè)類(lèi)。

package git.snippet;

/**
 * Java SE 9 Multi-Release JAR Files示例
 *
 * @author <a href="mailto:410486047@qq.com" rel="external nofollow"  rel="external nofollow"  rel="external nofollow" >Grey</a>
 * @date 2022/8/14
 * @since 9
 */
public class App {
    public static void main(String[] args) {
        Helper.hello(args[0]);
    }
}
package git.snippet;

/**
 * @author <a href="mailto:410486047@qq.com" rel="external nofollow"  rel="external nofollow"  rel="external nofollow" >Grey</a>
 * @date 2022/8/14
 * @since 1.7
 */
public class Helper {
    public static void hello(String name) {
        // jdk 9+不能用_作為變量
        String _ = "hello";
        System.out.println(_ + ", " + name);
    }
}

src\main\java9\git\snippet 目錄下存的是新版本 JDK 編寫(xiě)的代碼。我們需要把 Helper 類(lèi)用新的 JDK 版本特性來(lái)實(shí)現(xiàn)。代碼如下

package git.snippet;

/**
 * @author <a href="mailto:410486047@qq.com" rel="external nofollow"  rel="external nofollow"  rel="external nofollow" >Grey</a>
 * @date 2022/8/14
 * @since 9
 */
public class Helper {
    public static void hello(String name) {
        // 舊版本用_作為變量,jdk9不能用_作為變量
        String fixName = "hello";
        System.out.println(fixName + ", " + name + " from jdk9");
    }
}

創(chuàng)建好上述類(lèi)以后,項(xiàng)目結(jié)構(gòu)如下:

接下來(lái)是編譯,在項(xiàng)目目錄下,用 JDK 9+的 javac 執(zhí)行如下兩個(gè)編譯命令

C:\jdk\jdk-11\bin\javac --release 7 -d classes src\main\java\git\snippet\*.java

提示信息如下(僅顯示了警告)

D:\git\hello-mrjar>C:\jdk\jdk-11\bin\javac --release 7 -d classes src\main\java\git\snippet\*.java
src\main\java\git\snippet\Helper.java:11: 警告: 從發(fā)行版 9 開(kāi)始, '_' 為關(guān)鍵字, 不能用作標(biāo)識(shí)符
        String _ = "hello";
               ^
src\main\java\git\snippet\Helper.java:12: 警告: 從發(fā)行版 9 開(kāi)始, '_' 為關(guān)鍵字, 不能用作標(biāo)識(shí)符
        System.out.println(_ + ", " + name);
                           ^
2 個(gè)警告
C:\jdk\jdk-11\bin\javac --release 9 -d classes-9 src\main\java9\git\snippet\*.java

無(wú)提示信息和報(bào)錯(cuò)信息。

接下來(lái)是通過(guò) JDK 9+ 的 jar 進(jìn)行打包,打包的時(shí)候,運(yùn)行如下打包命令

C:\jdk\jdk-11\bin\jar --create --file target/hello-mrjar.jar --main-class git.snippet.App -C classes . --release 9 -C classes-9 .

如果提示如下報(bào)錯(cuò)信息:

java.nio.file.NoSuchFileException: C:\Users\zhuiz\AppData\Local\Temp\hello-mrjar.jar9462053262887373909.jar -> target\hello-mrjar.jar
        at java.base/sun.nio.fs.WindowsException.translateToIOException(WindowsException.java:85)
        at java.base/sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:103)
        at java.base/sun.nio.fs.WindowsFileCopy.move(WindowsFileCopy.java:395)
        at java.base/sun.nio.fs.WindowsFileSystemProvider.move(WindowsFileSystemProvider.java:292)
        at java.base/java.nio.file.Files.move(Files.java:1422)
        at jdk.jartool/sun.tools.jar.Main.validateAndClose(Main.java:466)
        at jdk.jartool/sun.tools.jar.Main.run(Main.java:349)
        at jdk.jartool/sun.tools.jar.Main.main(Main.java:1681)

則手動(dòng)在項(xiàng)目目錄下建立一個(gè)target文件夾,再次執(zhí)行打包命令,錯(cuò)誤解決。

在 target 目錄下,包已經(jīng)打好 hello-mrjar.jar 。

最后進(jìn)行測(cè)試,用JDK 9之前的 java 來(lái)執(zhí)行這個(gè) jar 包。

C:\jdk\jdk1.8\bin\java -jar hello-mrjar.jar Grey

輸出如下

hello, Grey

用 JDK 9+ 的 java 來(lái)執(zhí)行這個(gè) jar 包。

C:\jdk\jdk-11\bin\java -jar hello-mrjar.jar Grey

輸出如下:

hello, Grey from jdk9

這樣就實(shí)現(xiàn)了同一個(gè) Jar 包中包含多個(gè) Java 版本的 class 文件,用不同版本 JDK 執(zhí)行的時(shí)候,運(yùn)行不同版本的 class 文件。

也可以使用 Intellij IDEA 來(lái)創(chuàng)建多版本 Jar,這里是參考文檔: Creating Multi-Release JAR Files in IntelliJ IDEA

Maven 項(xiàng)目配合多版本 Jar 示例

多數(shù)情況下,我們不會(huì)手動(dòng)創(chuàng)建項(xiàng)目目錄并編譯,一般用 Maven 來(lái)管理項(xiàng)目。本示例演示如何在 Maven 下進(jìn)行多版本 Jar 包的管理。

創(chuàng)建一個(gè) Maven 項(xiàng)目,結(jié)構(gòu)如下:

和上例類(lèi)似, src\main\java9 文件夾中是對(duì)應(yīng)的新版本 JDK 的代碼

src\main\java 文件夾中是對(duì)應(yīng)的舊版本的 JDK 代碼。

代碼清單如下:

package git.snippet;
public class App {
    public static void main(String[] args) {
        System.out.println(String.format("Running on %s", new DefaultVersion().version()));
    }
}

舊版本代碼,放在 src\main\java 對(duì)應(yīng)的包下。

package git.snippet;
public class DefaultVersion {
    public String version() {
        System.out.println("use jdk");
        return System.getProperty("java.version");
    }
}

新版本代碼,放在 src\main\java9 對(duì)應(yīng)的包下。

package git.snippet;

public class DefaultVersion {

    public String version() {
        System.out.println("use jdk 9+");
        return Runtime.version().toString();
    }
}

pom.xml 文件配置,注意,相關(guān)的文件夾或者包有調(diào)整,需要做對(duì)應(yīng)的調(diào)整。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>git.snippet</groupId>
    <artifactId>hello-mrjar-with-maven</artifactId>
    <version>1.0</version>

    <properties>
        <java.version>11</java.version>
        <maven.compiler.source>${java.version}</maven.compiler.source>
        <maven.compiler.target>${java.version}</maven.compiler.target>
        <maven-jar-plugin.version>3.2.0</maven-jar-plugin.version>
    </properties>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <executions>
                    <execution>
                        <id>compile-java-8</id>
                        <goals>
                            <goal>compile</goal>
                        </goals>
                        <configuration>
                            <source>1.8</source>
                            <target>1.8</target>
                            <compileSourceRoots>
                            <!---舊版本代碼的位置-->
                                <compileSourceRoot>${project.basedir}/src/main/java</compileSourceRoot>
                            </compileSourceRoots>
                        </configuration>
                    </execution>
                    <execution>
                        <id>compile-java-9</id>
                        <phase>compile</phase>
                        <goals>
                            <goal>compile</goal>
                        </goals>
                        <configuration>
                            <release>9</release>
                            <compileSourceRoots>
                            <!---新版本代碼的位置-->
                                <compileSourceRoot>${project.basedir}/src/main/java9</compileSourceRoot>
                            </compileSourceRoots>
                            <outputDirectory>${project.build.outputDirectory}/META-INF/versions/9</outputDirectory>
                        </configuration>
                    </execution>
                    <execution>
                        <id>default-testCompile</id>
                        <phase>test-compile</phase>
                        <goals>
                            <goal>testCompile</goal>
                        </goals>
                        <configuration>
                            <skip>true</skip>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>${maven-jar-plugin.version}</version>
                <configuration>
                    <archive>
                        <manifestEntries>
                            <Multi-Release>true</Multi-Release>
                        </manifestEntries>
                        <manifest>
                        <!--設(shè)置主方法入口-->
                            <mainClass>git.snippet.App</mainClass>
                        </manifest>
                    </archive>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

然后用新版本的 JDK 進(jìn)行打包,在項(xiàng)目目錄下執(zhí)行:

mvn clean package -Dmaven.test.skip=true

提示:

[INFO] --- maven-jar-plugin:3.2.0:jar (default-jar) @ hello-mrjar-with-maven ---
[INFO] Building jar: D:\git\hello-mrjar-with-maven\target\hello-mrjar-with-maven-1.0.jar
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  1.447 s
[INFO] Finished at: 2022-08-15T11:29:48+08:00
[INFO] ------------------------------------------------------------------------

說(shuō)明打包成功。然后進(jìn)入 target 目錄,進(jìn)行驗(yàn)證

用舊版本的 Java 執(zhí)行 Jar 包

C:\jdk\jdk1.8\bin\java -jar hello-mrjar-with-maven-1.0.jar
復(fù)制代碼

輸出:

use jdk
Running on 1.8.0_202

用新版本的 Java 執(zhí)行 Jar 包

C:\jdk\jdk-11\bin\java -jar hello-mrjar-with-maven-1.0.jar

輸出:

use jdk 9+
Running on 11.0.15+8-LTS-149

到此這篇關(guān)于Java SE 9 多版本兼容 JAR 包示例的文章就介紹到這了,更多相關(guān)Java JAR 包內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 淺析JavaScript中的特殊函數(shù)及用法小結(jié)

    淺析JavaScript中的特殊函數(shù)及用法小結(jié)

    JavaScript中的函數(shù)本質(zhì)上是一個(gè)對(duì)象,我們可以將這個(gè)對(duì)象賦值給一個(gè)變量,這就使JavaScript中的函數(shù)變得非常的靈活,現(xiàn)在就來(lái)淺看一下JavaScript中函數(shù)的一些用法,需要的朋友可以參考下
    2022-06-06
  • js+html5實(shí)現(xiàn)canvas繪制簡(jiǎn)單矩形的方法

    js+html5實(shí)現(xiàn)canvas繪制簡(jiǎn)單矩形的方法

    這篇文章主要介紹了js+html5實(shí)現(xiàn)canvas繪制簡(jiǎn)單矩形的方法,涉及html5圖形繪制的基本技巧,需要的朋友可以參考下
    2015-06-06
  • 一文詳解如何優(yōu)雅地處理前端錯(cuò)誤邊界

    一文詳解如何優(yōu)雅地處理前端錯(cuò)誤邊界

    前端錯(cuò)誤邊界是一種用于?捕獲子組件樹(shù)中JavaScript錯(cuò)誤?、顯示降級(jí)UI而非讓整個(gè)應(yīng)用崩潰的機(jī)制,這篇文章主要介紹了如何優(yōu)雅地處理前端錯(cuò)誤邊界的相關(guān)資料,需要的朋友可以參考下
    2026-03-03
  • 一文詳解JavaScrip可迭代對(duì)象(Iterable)

    一文詳解JavaScrip可迭代對(duì)象(Iterable)

    本文解釋了ES6引入迭代器和可迭代對(duì)象的原因及使用方法,通過(guò)引入這兩個(gè)概念,JavaScript 統(tǒng)一了數(shù)據(jù)訪問(wèn)接口,解決了遍歷方式不統(tǒng)一和靈活性差的問(wèn)題,文章詳細(xì)介紹了核心概念、底層原理、實(shí)戰(zhàn)案例、常見(jiàn)誤區(qū)及最佳實(shí)踐,幫助讀者徹底理解可迭代對(duì)象,需要的朋友可以參考下
    2026-05-05
  • 使用layui實(shí)現(xiàn)樹(shù)形結(jié)構(gòu)的方法

    使用layui實(shí)現(xiàn)樹(shù)形結(jié)構(gòu)的方法

    今天小編就為大家分享一篇使用layui實(shí)現(xiàn)樹(shù)形結(jié)構(gòu)的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-09-09
  • JavaScript計(jì)算某一天是星期幾的方法

    JavaScript計(jì)算某一天是星期幾的方法

    這篇文章主要介紹了JavaScript計(jì)算某一天是星期幾的方法,需要的朋友可以參考下
    2015-08-08
  • 不錯(cuò)的新聞標(biāo)題顏色效果

    不錯(cuò)的新聞標(biāo)題顏色效果

    [紅色]不錯(cuò)的新聞標(biāo)題顏色效果...
    2006-12-12
  • JS中數(shù)組合并的幾種常見(jiàn)方法

    JS中數(shù)組合并的幾種常見(jiàn)方法

    這篇文章主要給大家介紹了關(guān)于JS中數(shù)組合并的幾種常見(jiàn)方法,在開(kāi)發(fā)的過(guò)程中,我們很多時(shí)候會(huì)遇到需要將兩個(gè)數(shù)組合并成一個(gè)數(shù)組的情況,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),出現(xiàn)需要的朋友可以參考下
    2023-07-07
  • JavaScript使用Canvas繪制一個(gè)驗(yàn)證碼組件

    JavaScript使用Canvas繪制一個(gè)驗(yàn)證碼組件

    驗(yàn)證碼,這一日常伴隨我們的要素,是我們?cè)诰€交互的重要安全保障,你的手機(jī)短信里是否被它占據(jù)半壁江山,今天我們就來(lái)聊聊如何在網(wǎng)頁(yè)上實(shí)現(xiàn)一個(gè)簡(jiǎn)單的驗(yàn)證碼組件,需要的朋友可以參考下
    2023-09-09
  • 用unescape反編碼得出漢字示例

    用unescape反編碼得出漢字示例

    這篇文章主要介紹了如何用unescape反編碼得出漢字,需要的朋友可以參考下
    2014-04-04

最新評(píng)論

炉霍县| 恩施市| 邵武市| 南和县| 蚌埠市| 将乐县| 克东县| 东至县| 海城市| 页游| 赤城县| 乌恰县| 绥江县| 鄯善县| 吴忠市| 紫金县| 邳州市| 南投市| 襄樊市| 孟村| 江北区| 靖安县| 五常市| 罗甸县| 凌海市| 那坡县| 伊通| 闽侯县| 萨嘎县| 如皋市| 文昌市| 台北市| 绍兴市| 凤凰县| 靖远县| 三门峡市| 深泽县| 昌邑市| 忻城县| 贵定县| 屏东市|