Skip to content

JEP 336: Deprecate the Pack200 Tools and API | 弃用 Pack200 工具和 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 功能的不懈增长导致下载大小膨胀,进一步阻碍了 Java 的普及。使用 Pack200 压缩 JDK 是一种缓解这个问题的方法。然而,时代已经变了:下载速度已经提高,JDK 9 引入了新的压缩方案,包括 Java 运行时 (JEP 220) 和用于构建运行时的模块 (JMOD)。因此,JDK 9 及更高版本不再依赖 Pack200;JDK 8 是最后一个在构建时使用 pack200 压缩并在安装时使用 unpack200 解压缩的版本。总之,Pack200 的一个主要使用者——JDK 本身——已经不再需要它了。

  2. 除了 JDK 之外,使用 Pack200 压缩客户端应用程序,特别是 applet,也很有吸引力。一些部署技术,如 Oracle 的浏览器插件,会自动解压 applet JAR 文件。然而,客户端应用程序的环境已经发生了变化,大多数浏览器已经放弃了插件支持。因此,Pack200 的一个主要使用者类别——在浏览器中运行的 applets——已不再是包含 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 时将显示有关该工具计划移除的警告。使用子选项 n(用于 标准化归档)运行 jar -c 时将显示有关子选项计划移除的警告。这三种工具的文档都将表明其弃用和计划移除的情况。

对于在将来的 JDK 功能发布中实际移除这些类型和模块的操作,将单独提交一个 JEP(JDK 增强提案)。

风险和假设

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