跳到主要内容

JEP 367: 移除 Pack200 工具和 API

QWen Max 中英对照 JEP 367: Remove the Pack200 Tools and API

概述

移除 pack200unpack200 工具,以及 java.util.jar 包中的 Pack200 API。这些工具和 API 在 Java SE 11 中已被标记为弃用并计划移除,明确表示将在未来的版本中删除。

动机

Pack200 是一种针对 JAR 文件的压缩方案,于 Java SE 5.0 中通过 JSR 200 引入。其目标是“减少 Java 应用程序打包、传输和交付时对磁盘空间和带宽的需求。” 开发者使用一对工具 —— pack200unpack200 —— 来对他们的 JAR 文件进行压缩解压缩java.util.jar 包中提供了一个 API

移除 Pack200 有三个原因:

  1. 从历史上看,通过 56k 调制解调器缓慢下载 JDK 是 Java 普及的一个障碍。JDK 功能的持续增长导致下载大小不断膨胀,进一步阻碍了其普及。使用 Pack200 压缩 JDK 是缓解该问题的一种方法。然而,时代已经改变:下载速度得到了改善,JDK 9 为 Java 运行时环境(JEP 220)和用于构建运行时的模块(JMOD)引入了新的压缩方案。因此,JDK 9 及更高版本不再依赖于 Pack200;JDK 8 是最后一个在构建时用 pack200 压缩并在安装时用 unpack200 解压的版本。总之,Pack200 的一个主要使用者——JDK 本身——已经不再需要它。

  2. 除了 JDK,使用 Pack200 压缩客户端应用程序(尤其是小程序)也很有吸引力。一些部署技术(例如 Oracle 的浏览器插件)会自动解压缩小程序的 JAR 文件。然而,客户端应用程序的格局已经发生了变化,大多数浏览器已停止支持插件。因此,Pack200 的一大类使用者——在浏览器中运行的小程序——不再是将 Pack200 包含在 JDK 中的驱动因素。

  3. Pack200 是一种复杂且精细的技术。它的文件格式class 文件格式JAR 文件格式紧密耦合,而这两种格式都以 JSR 200 无法预见的方式发展。(例如,JEP 309 在 class 文件格式中添加了一种新的常量池条目,而 JEP 238 在 JAR 文件格式中添加了版本控制元数据。)JDK 中的实现分散在 Java 和原生代码之间,这使得维护变得困难。java.util.jar.Pack200 中的 API 对 Java SE 平台的模块化产生了不利影响,导致Java SE 9 中移除了其四个方法。总体而言,维护 Pack200 的成本很高,超过了将其包含在 Java SE 和 JDK 中所带来的好处。

描述

java.base 模块中之前标注了 @Deprecated(forRemoval=true) 的三种类型 将会被移除,这一 JEP 最终目标的 JDK 特性发布版本中:

  • java.util.jar.Pack200
  • java.util.jar.Pack200.Packer
  • java.util.jar.Pack200.Unpacker

jdk.pack 模块包含 pack200unpack200 工具,之前已被标注为 @Deprecated(forRemoval=true),并且在最终包含此 JEP 的 JDK 特性发布版本中 也将被移除

风险与假设

我们假设依赖 Pack200 的开发者已经收到了关于其计划移除的足够通知,以便做出替代安排。Pack200 在 JDK 11 中的“为移除而弃用”提议于 2018 年 6 月被提出确认,此后再无更多关于该主题的兴趣。(Eclipse 社区是 Pack200 的一个重要使用者,曾进行过自己的讨论(12),但未报告进一步进展。)Pack200 API 的“为移除而弃用”在 Java SE 11 的平台 JSR 中被标记,并随后在 Java SE 12Java SE 13 中再次标记。平台 JSR 的邮件列表(12)未收到任何关于提议移除的评论。

我们假设使用 pack200 来压缩应用程序 JAR 的开发者可以切换到 jlink 工具或 jpackage 工具,以创建针对应用程序优化的运行时。有关这些工具的更多信息,请参阅 JEP 282JEP 343。包含 jpackage 的 JDK 14 的早期访问版本已经可用