多版本jdk共享jar

本文介绍了Java 9引入的多版本JAR文件特性,允许库开发者为不同Java版本提供不同实现。通过示例展示了如何在IntelliJ IDEA中创建一个多版本JAR文件,包括设置不同模块的Java版本、编译输出结构以及创建和运行JAR文件的过程。
摘要由CSDN通过智能技术生成

多版本jdk共享jar

Java 9的一个有趣特性是支持多版本JAR文件。这是什么意思?过去,库开发人员在支持新版本的Java时有三种选择:

  1. 提供两个(或更多)不同的JAR文件,每个文件对应他们想要支持的Java版本。它们的版本号可能是“1.2-java-5”和“1.2-java-1.3”。
  2. 将每个发行版绑定到特定的Java版本,迫使用户要么升级他们的Java版本,要么被困在旧版本的库中。例如“5.0版本以后需要Java 8”。
  3. 坚持为用户提供最小公分母的版本。对于许多库开发人员来说,这意味着他们仍然是针对Java 6进行编译的,并且在几乎所有的用户都已经迁移到Java 8之前,他们无法迁移到使用Java 8的特性,比如lambdas和streams。

对于库开发人员或其用户来说,这些方法都不是特别有趣。它们要么涉及大量工作,要么疏远/混淆用户,要么库不能利用新特性(因此也不能为用户提供太多的动机来升级他们的Java版本)。

从Java 9开始,有一个替代方案。现在,库开发人员可以发布一个JAR文件:

  • 如果您在Java 9上运行它,则使用Java 9的特性和功能
  • 如果在Java 9之前的版本上运行它,则得到的是Java 9之前的实现。

这适用于Java 9以后的版本——所以这些多版本JAR文件将支持Java 9版本、Java 10(或18.3)、Java 11、Java 12版本等等,但Java 9之前的任何版本都被归为“pre-Java 9”。这有点让人难过,因为如果你运行的是Java 8, Java 8显然有一些不错的特性,但Java 9之前对库的支持可能会以6为目标,就像许多库一样。当然,这种分离的原因是Java 8本身无法决定在运行多版本JAR文件时做什么不同的事情,因为这些功能只有在Java 9中才可用。

在这篇博文中,我将展示如何在IntelliJ IDEA中创建一个多版本的JAR文件。我强烈建议您不要使用IDE来创建应用程序的生产就绪构建,我希望大多数人使用Maven, Gradle, Ant或其他构建工具。然而,我想尝试多版本JAR文件,并设法使用IntelliJ IDEA构建它们,并希望展示这个过程可以帮助人们理解如何构建多版本JAR文件以及它们是如何工作的。

The Example

我将创建一个非常简单的应用程序,它只输出当前堆栈跟踪(稍后您将看到我为什么选择这个示例)。我的项目包括一个Main类,一个定义我可能对栈感兴趣的接口,StackInfo,以及这个接口的实现,StackParser:

01BasicStructure

Project Structure

如果你看一下规范,你会发现你需要的是一个输出结构,看起来像这样:

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

基本上,像往常一样,在根目录中有一个包含应用程序中所有类的标准JAR文件,在META-INF中有一个附加的“版本”文件夹,其中包含每个附加支持的Java版本(在这种情况下,只有Java 9)的特定实现。这个“9”文件夹只需要包含具有特定Java 9功能的类的类文件。如果一个类不在其中(例如C.class),则使用默认版本。

如果我想要我的应用程序的部分被编译针对Java 9和“默认”应用程序编译针对Java 8,我可以在IntelliJ IDEA中做到这一点的一种方法是设置一个不同的IntelliJ IDEA模块只包含Java 9代码:

  • 27
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值