JEP 336:弃用 Pack200 工具和 API
概括
弃用pack200
和unpack200
工具Pack200
以及java.util.jar
.
动机
Pack200是 JAR 文件的压缩方案。它是由JSR 200在 Java SE 5.0 中引入的。其目标是“降低 Java 应用程序打包、传输和交付的磁盘和带宽要求”。开发人员使用一对工具pack200
来unpack200
压缩和解压缩他们的 JAR 文件。包中提供了API。java.util.jar
想要弃用(并最终删除)Pack200 的原因有以下三个:
-
从历史上看,通过 56k 调制解调器下载 JDK 的速度缓慢是 Java 采用的障碍。 JDK 功能的不断增长导致下载大小膨胀,进一步阻碍了采用。使用 Pack200 压缩 JDK 是缓解该问题的一种方法。然而,时间在进步:下载速度有所提高,并且 JDK 9 为 Java 运行时 ( JEP 220 ) 和用于构建运行时的模块 ( JMOD ) 引入了新的压缩方案。因此,JDK 9 及更高版本不依赖 Pack200; JDK 8 是最后一个在
pack200
构建时压缩并unpack200
在安装时解压缩的版本。总之,Pack200 的主要消费者——JDK 本身——不再需要它。 -
除了 JDK 之外,使用 Pack200 压缩客户端应用程序(尤其是小程序)也很有吸引力。某些部署技术(例如 Oracle 的 浏览器插件)会自动解压缩 applet JAR。然而,客户端应用程序的情况已经发生了变化,大多数浏览器已经放弃了对插件的支持。因此,Pack200 的一类主要消费者(在浏览器中运行的小程序)不再是在 JDK 中包含 Pack200 的驱动程序。
-
Pack200 是一项复杂而精细的技术。它的文件格式与类文件格式和JAR 文件格式紧密耦合,这两种格式都以 JSR 200 无法预见的方式发展。(例如,JEP 309在类文件格式中添加了一种新的常量池条目,并且JEP 238在 JAR 文件格式中添加了版本控制元数据。)JDK 中的实现分为 Java 和本机代码,这使得维护变得困难。中的 API
java.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
模块包含pack200
和unpack200
工具,也将最终被弃用。
运行pack200
或unpack200
将显示有关计划删除该工具的警告。jar -c
使用子选项运行n
(以标准化存档)将显示有关计划删除子选项的警告。所有三个工具的文档都将表明弃用和计划删除。
将提交一个单独的 JEP,以便在未来的 JDK 功能版本中实际删除类型和模块。
风险和假设
假设使用pack200
缩小应用程序 JAR 的开发人员将改用该jlink
工具来创建具有优化外形的特定于应用程序的运行时。请参阅工具文档和JEP 282。另一个选择可能是jpackage
工具(JEP 343)。