Java 9 版本中增强了Jar 包多版本字节码文件格式支持,也就是说在同一个 Jar 包中我们可以包含多个 Java 版本的 class 文件,这样就能做到 Jar 包升级到新的 Java 版本时不用强迫使用方为了使用新 Jar 包而升级自己的业务模块 Java 版本,也不用针对不同最低支持 Java 版本提供不同的 Jar,真正的做到了一个 Jar 包兼容所有的目的。
本文通过以下示例来说明多版本 Jar 包的使用。
机器上应该有多个版本的 JDK 用于测试,并且至少有一个是 JDK 9 或者更高版本。
注:本示例无需使用 IDE ,我们用最原始的方式创建一个多版本的 Jar 包。
新建一个文件夹,用项目名称命名,并且在其中把src
目录,包名都建好,可以自定义,后续编译命令自行调整即可。
src\main\java\git\snippet
目录下存的是旧版本 JDK 编写的代码。在这个目录下新建两个类。
package git.snippet; /** * Java SE 9 Multi-Release JAR Files示例 * * @author <a href="mailto:410486047@qq.com">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">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 编写的代码。我们需要把Helper
类用新的 JDK 版本特性来实现。代码如下
package git.snippet; /** * @author <a href="mailto:410486047@qq.com">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"); } }
创建好上述类以后,项目结构如下
接下来是编译,在项目目录下,用 JDK 9+的javac
执行如下两个编译命令
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: 警告: 从发行版 9 开始, '_' 为关键字, 不能用作标识符 String _ = "hello"; ^ src\main\java\git\snippet\Helper.java:12: 警告: 从发行版 9 开始, '_' 为关键字, 不能用作标识符 System.out.println(_ + ", " + name); ^ 个警告
C:\jdk\jdk-11\bin\javac --release 9 -d classes-9 src\main\java9\git\snippet\*.java
无提示信息和报错信息。
接下来是通过 JDK 9+ 的jar
进行打包,打包的时候,运行如下打包命令
C:\jdk\jdk-11\bin\jar --create --file target/hello-mrjar.jar --main-class git.snippet.App -C classes . --release 9 -C classes-9 .
标签:Java SE,机器,命令,JDK,测试,编译,关键字 来源:
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。