跳到主要内容

JEP 336:弃用 Pack200 工具和 API

QWen Max 中英对照 JEP 336 Deprecate the Pack200 Tools and API

概述

弃用 pack200unpack200 工具,以及 java.util.jar 中的 Pack200 API。

动机

Pack200 是一种用于 JAR 文件的压缩方案。它由 JSR 200 引入到 Java SE 5.0 中。其目标是“减少 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 是一种复杂且精细的技术。其文件格式类文件格式JAR 文件格式紧密相关,而这两种格式都以 JSR 200 无法预见的方式进行了演变。(例如,JEP 309 在类文件格式中添加了一种新的常量池条目,而 JEP 238 向 JAR 文件格式添加了版本元数据。)JDK 中的实现分散在 Java 和原生代码之间,这使得维护变得困难。java.util.jar.Pack200 中的 API 对 Java SE 平台的模块化不利,导致 Java SE 9 中删除了它的四个方法。总体而言,维护 Pack200 的成本很高,并且超过了将其包含在 Java SE 和 JDK 中所带来的好处。

描述

java.base 模块中的三种类型将被终止弃用,即使用 @Deprecated(forRemoval=true) 注解:

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

包含 pack200unpack200 工具的 jdk.pack 模块也将被终止性弃用。

运行 pack200unpack200 时,将显示有关该工具计划移除的警告。运行带有子选项 njar -c(用于规范存档)时,将显示有关该子选项计划移除的警告。这三种工具的文档都将标明它们已被弃用并计划移除。

将会为在未来 JDK 特性版本中实际移除这些类型和模块单独提交一份 JEP。

风险与假设

假设使用 pack200 来压缩应用程序 JAR 的开发者将切换到 jlink 工具,以创建针对应用程序优化的特定运行时。请参阅工具文档JEP 282。另一个选择可能是 jpackage 工具 (JEP 343)。