JEP 367: Remove the Pack200 Tools and API | 移除 Pack200 工具和 API
摘要
移除 pack200
和 unpack200
工具以及 java.util.jar
包中的 Pack200
API。这些工具和 API 在 Java SE 11 中已被 标记为弃用以备将来移除,目的是在未来的版本中彻底删除它们。
动机
Pack200 是 Java SE 5.0 中通过 JSR 200 引入的一种 JAR 文件压缩方案。其目标是“减少 Java 应用程序打包、传输和交付所需的磁盘和带宽要求。”开发人员使用一对工具——pack200
和 unpack200
——来 压缩 和 解压缩 他们的 JAR 文件。java.util.jar
包中提供了 一个 API。
移除 Pack200 有三个原因:
在历史上,JDK 通过 56k 调制解调器缓慢下载曾是 Java 采纳的障碍。JDK 功能的持续增长导致下载量增加,进一步阻碍了其采纳。使用 Pack200 压缩 JDK 是缓解该问题的一种方法。然而,时间已经推移:下载速度已经提高,JDK 9 为 Java 运行时(JEP 220)和用于构建运行时的模块(JMOD)引入了新的压缩方案。因此,JDK 9 及更高版本不再依赖 Pack200;JDK 8 是最后一个在构建时使用
pack200
压缩并在安装时使用unpack200
解压缩的版本。总之,Pack200 的一个主要使用者——JDK 本身——不再需要它。除了 JDK 之外,使用 Pack200 压缩客户端应用程序,尤其是小程序,也很有吸引力。一些部署技术,如 Oracle 的浏览器插件,会自动解压缩小程序的 JAR 文件。然而,客户端应用程序的环境已经发生了变化,大多数浏览器都放弃了插件支持。因此,Pack200 的一个主要使用者——在浏览器中运行的小程序——不再是将 Pack200 包含在 JDK 中的动力。
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
包含 pack200
和 unpack200
工具的 jdk.pack
模块之前被标记为 @Deprecated(forRemoval=true)
,并且 也将在本 JEP 最终针对的 JDK 功能版本中移除。
风险和假设
我们假设依赖 Pack200 的开发者已经收到足够的关于其拟议移除的通知,并做出了替代安排。JDK 11 中 Pack200 的弃用 - 以便移除的提议在 2018 年 6 月 提出 并 确认,此后该主题未再引起关注。(Eclipse 社区作为 Pack200 的重要用户,自行进行了讨论(1,2),但并未报告进一步的进展。)在 Java SE 11、Java SE 12 和 Java SE 13 的平台 JSR 中,都标记了 Pack200
API 的弃用 - 以便移除。在平台 JSR 的邮件列表中(1,2)未收到关于拟议移除的任何评论。
我们假设使用 pack200
来缩小应用程序 JAR 文件的开发者可以切换到 jlink
工具或 jpackage
工具,以创建具有优化尺寸的特定于应用程序的运行时。有关这些工具的更多信息,请参阅 JEP 282 和 JEP 343。包含 jpackage
的 JDK 14 早期访问构建 已可用。