<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>JDK on </title>
    <link>/tags/jdk/</link>
    <description>Recent content in JDK on </description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en</language>
    <lastBuildDate>Wed, 18 Mar 2026 10:00:00 +0800</lastBuildDate><atom:link href="/tags/jdk/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Java Multi-Release JAR 学习笔记：兼顾新 JDK 与向后兼容的一种做法</title>
      <link>/posts/java-multi-release-jar/</link>
      <pubDate>Wed, 18 Mar 2026 10:00:00 +0800</pubDate>
      
      <guid>/posts/java-multi-release-jar/</guid>
      <description>在 Java 生态系统中，&amp;ldquo;向后兼容性&amp;quot;一直是一把双刃剑。一方面，它保证了旧代码能在新版本 JDK 上平稳运行；另一方面，对于库（Library）维护者来说，为了支持还在使用 Java 8 的用户，往往不得不放弃 Java 11、17 甚至 21 中引入的高效 API。
为了解决这个矛盾，Java 9 引入了 JEP 238: Multi-Release JAR Files (MRJAR)。它允许在一个 JAR 包中针对不同的 Java 版本存放同一份类的不同实现。
什么是 Multi-Release JAR？ 简单来说，Multi-Release JAR 允许你的库在不同的 JDK 版本上表现出不同的行为：
在旧版本 JDK（如 Java 8）上运行时，它执行基础版本的代码。 在新版本 JDK（如 Java 17）上运行时，它自动选择针对该版本优化的代码。 这一切对用户是透明的，他们只需要像往常一样引用一个 JAR 包即可。
MRJAR 的内部结构 一个 Multi-Release JAR 的秘密全在 META-INF 目录下。它的标准结构如下：
example.jar ├── com/meirong/Helper.class (基础版本，例如 Java 8) ├── META-INF/ │ ├── MANIFEST.MF (需要包含 Multi-Release: true) │ └── versions/ │ ├── 11/ │ │ └── com/meirong/Helper.</description>
    </item>
    
  </channel>
</rss>
