跳到主要内容

JEP 336:弃用 Pack200 工具和 API

概括

弃用pack200unpack200工具Pack200以及java.util.jar.

动机

Pack200是 JAR 文件的压缩方案。它是由JSR 200在 Java SE 5.0 中引入的。其目标是“降低 Java 应用程序打包、传输和交付的磁盘和带宽要求”。开发人员使用一对工具pack200unpack200压缩和解压缩他们的 JAR 文件。包中提供了APIjava.util.jar

想要弃用(并最终删除)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 的浏览器插件)会自动解压缩 applet JAR。然而,客户端应用程序的情况已经发生了变化,大多数浏览器已经放弃了对插件的支持。因此,Pack200 的一类主要消费者(在浏览器中运行的小程序)不再是在 JDK 中包含 Pack200 的驱动程序。

  3. Pack200 是一项复杂而精细的技术。它的文件格式与类文件格式JAR 文件格式紧密耦合,这两种格式都以 JSR 200 无法预见的方式发展。(例如,JEP 309在类文件格式中添加了一种新的常量池条目,并且JEP 238在 JAR 文件格式中添加了版本控制元数据。)JDK 中的实现分为 Java 和本机代码,这使得维护变得困难。中的 APIjava.util.jar.Pack200不利于 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

jdk.pack模块包含pack200unpack200工具,也将最终被弃用。

运行pack200unpack200将显示有关计划删除该工具的警告。jar -c使用子选项运行n(以标准化存档)将显示有关计划删除子选项的警告。所有三个工具的文档都将表明弃用和计划删除。

将提交一个单独的 JEP,以便在未来的 JDK 功能版本中实际删除类型和模块。

风险和假设

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