http://openjdk.java.net/jeps/336
JEP 336: Deprecate the Pack200 Tools and API
Author Kumar Srinivasan Owner Henry Jen Type Feature Scope SE Status Closed/Delivered Release 11 Component tools Discussion jdk dash dev at openjdk dot java dot net Effort S Duration S Reviewed by Alex Buckley, John Rose Endorsed by John Rose Created 2018/04/04 17:11 Updated 2018/10/12 00:50 Issue 8200752
Summary
pack200
とunpack200
ツール、およびjava.util.jar
のPack200
APIを非推奨にします。
Motivation
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のブラウザプラグインなど、ある種のデプロイメント方法は自動的にアプレットのJARを展開します。しかし、クライアントアプリケーションの世界は変わり、大半のブラウザはプラグインサポートを止めています。そういう訳で、Pack200の使い手の主要クラスである、ブラウザ上のアプレットが、JDKでPack200を持つ理由にはならなくなりました。
- Pack200は複雑で緻密な技術です。ファイルフォーマットはクラスファイルフォーマットとJARファイルフォーマットに密結合しており、どちらもJSR 200では予期しない方向へと進化しました。(例えば、JEP 309はクラスファイルフォーマットにconstant pool entryの新しい種類を追加し、JEP 238はJARファイルフォーマットにversioning metadataを追加しました。)JDKの実装はJavaとネイティブコードに分かれており、メンテナンスは困難です。
java.util.jar.Pack200
のAPIはJava SE Platformのモジュール化(modularization)にとって有害になったため、Java SE 9での4つの削除メソッドとなりました。つまり、Pack200のメンテナンスコストが極めて高くなり、Java SEとJDKにこれを含める利点を上回っています。
Description
java.base
モジュールの三つの型を非推奨にし、@Deprecated(forRemoval=true)
を付与します。
java.util.jar.Pack200
java.util.jar.Pack200.Packer
java.util.jar.Pack200.Unpacker
pack200
とunpack200
ツールを含むjdk.pack
モジュールも同様に非推奨にします。
pack200
やunpack200
を実行するとツール削除を予定している旨の警告を表示します。jar -c
をサブオプションn
(normalize the archive)で実行するとサブオプション削除を予定している旨の警告を表示します。全三つのツールのドキュメントには非推奨化と削除予定を記述します。
型とモジュールの実際の削除はこれとは別のJEPを提出し、将来のJDK feature releaseで行います。
Risks and Assumptions
アプリケーションJARの縮小にpack200
を使う開発者はjlink
に移行する、と想定しています。jlink
は最適化されたフォームファクタ(optimized form factor)でアプリケーション固有のランタイムを作成するツールです。tool documentationとJEP 282を参照してください。別の選択肢としてjpackager
もありえます。(draft JEP)