Jar-Dateien enthalten in der Regel eine Mischung aus Klassendateien und Ressourcen. Die Jar-Archive sind normale Zip-Archive und somit steht der bekannte Zip-Algorithmus hinter der Kompression. Das liefert eine befriedigende Kompression über alle Formate, bietet aber keine besonderen Kompressionsverfahren für gewissen Dateitypen. Eine optimale Kompression ist aber gerade bei Jar-Bezug über das Internet wünschenswert. Während JPG-Dateien von Zip auch nicht besser komprimiert werden können, verkürzen sich Klassendateien schon etwas, erreichen mit Zip aber immer noch nicht das Maximum einer möglichen Komprimierung. Das liegt daran, dass Zip eine .class-Datei wie normalen Binärcode betrachtet und den Aufbau der Java-Klassendateien eben nicht kennt. Hier kommt ein spezielles Format zum Zuge, was den Aufbau von Klassendateien berücksichtigt, das Pack200-Format. Neben dem Dienstprogramm jar bietet das JDK im bin-Verzeichnis auch entsprechende Kommandozeilenwerkzeuge pack200 und unpack200 zum Komprimieren und eben Dekomprimieren.
Beispiel: Die Eclipse-Installation bringt genug Jar-Dateien mit, an denen Pack200 ausprobiert werden kann. Unter eclipse\plugins\org.apache.ant_1.8.4.v201303080030\lib nehmen wir uns ant.jar vor, ein Jar-Archiv von 1.941.731 Bytes.
$ pack200.exe -O ant.jar.pack.gz ant.jar
Der Schalter -O optimiert noch etwas und am Ende steht eine Datei ant.jar.pack.gz von 502.721 Bytes, also eine fast viermal kleinere Version.
Das pack200-Tool arbeitet im Prinzip so, dass es eine Jar-Datei nimmt, die Einträge umsortiert, Redundanzen erkennt und in einer Art neue spezielle Mega-Klassendatei verpackt[1], die dann mit dem Standard-GZip-Verfahren komprimiert wird.[2] Pack200- Dateien tragen in der Regel die Dateiendung *.jar.pack.gz und ein Web-Server serviert sie unter dem MIME-Typ application/x-java-pack200. Bezieht ein Programm über Java Web Start oder ein Java Plug-in die Dateien, so werden diese direkt ausgepackt und wie ein Jar eingebunden.
[1] Details und Anwendung zum Verfahren gibt Die Oracle-Seite http://download.java.net/jdk8/docs/technotes/guides/jweb/networking/compression_formats.html#pack200_compression. Intern ist das Verfahren komplex und die Beschreibung über die internen Vorgänge lang, siehe http://docs.oracle.com/javase/7/docs/technotes/guides/pack200/pack-spec.html.
[2] Während jede normale Klassen-Datei mit der Hex-Kennung 0xCAFEBABE beginnt, beginnt der Container der Pack-Datei mit 0xCAFED00D (Cafe Dude) – sympathisch.