Skip to content

JEP 367: Remove the Pack200 Tools and API | 移除 Pack200 工具和 API

摘要

移除 pack200unpack200 工具以及 java.util.jar 包中的 Pack200 API。这些工具和 API 在 Java SE 11 中已被 标记为弃用以备将来移除,目的是在未来的版本中彻底删除它们。

动机

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

移除 Pack200 有三个原因:

  1. 在历史上,JDK 通过 56k 调制解调器缓慢下载曾是 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) 的三种类型 将在本 JEP 最终针对的 JDK 功能版本中移除

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

包含 pack200unpack200 工具的 jdk.pack 模块之前被标记为 @Deprecated(forRemoval=true),并且 也将在本 JEP 最终针对的 JDK 功能版本中移除

风险和假设

我们假设依赖 Pack200 的开发者已经收到足够的关于其拟议移除的通知,并做出了替代安排。JDK 11 中 Pack200 的弃用 - 以便移除的提议在 2018 年 6 月 提出确认,此后该主题未再引起关注。(Eclipse 社区作为 Pack200 的重要用户,自行进行了讨论(12),但并未报告进一步的进展。)在 Java SE 11、Java SE 12Java SE 13 的平台 JSR 中,都标记了 Pack200 API 的弃用 - 以便移除。在平台 JSR 的邮件列表中(12)未收到关于拟议移除的任何评论。

我们假设使用 pack200 来缩小应用程序 JAR 文件的开发者可以切换到 jlink 工具或 jpackage 工具,以创建具有优化尺寸的特定于应用程序的运行时。有关这些工具的更多信息,请参阅 JEP 282JEP 343。包含 jpackage 的 JDK 14 早期访问构建 已可用