{"id":2302,"date":"2013-09-10T17:43:09","date_gmt":"2013-09-10T15:43:09","guid":{"rendered":"http:\/\/www.tutego.de\/blog\/javainsel\/?p=2302"},"modified":"2013-09-10T17:43:09","modified_gmt":"2013-09-10T15:43:09","slug":"pack200-format","status":"publish","type":"post","link":"https:\/\/www.tutego.de\/blog\/javainsel\/2013\/09\/pack200-format\/","title":{"rendered":"Pack200-Format"},"content":{"rendered":"<p>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 \u00fcber alle Formate, bietet aber keine besonderen Kompressionsverfahren f\u00fcr gewissen Dateitypen. Eine optimale Kompression ist aber gerade bei Jar-Bezug \u00fcber das Internet w\u00fcnschenswert. W\u00e4hrend JPG-Dateien von Zip auch nicht besser komprimiert werden k\u00f6nnen, verk\u00fcrzen sich Klassendateien schon etwas, erreichen mit Zip aber immer noch nicht das Maximum einer m\u00f6glichen Komprimierung. Das liegt daran, dass Zip eine .class-Datei wie normalen Bin\u00e4rcode betrachtet und den Aufbau der Java-Klassendateien eben nicht kennt. Hier kommt ein spezielles Format zum Zuge, was den Aufbau von Klassendateien ber\u00fccksichtigt, das Pack200-Format. Neben dem Dienstprogramm jar bietet das JDK im bin-Verzeichnis auch entsprechende Kommandozeilenwerkzeuge pack200 und unpack200 zum Komprimieren und eben Dekomprimieren.<\/p>\n<p>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.<\/p>\n<pre>$ pack200.exe -O ant.jar.pack.gz ant.jar<\/pre>\n<p>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.<\/p>\n<p>Das pack200-Tool arbeitet im Prinzip so, dass es eine Jar-Datei nimmt, die Eintr\u00e4ge umsortiert, Redundanzen erkennt und in einer Art neue spezielle Mega-Klassendatei verpackt<a href=\"file:\/\/\/C:\/Users\/Christian\/Dropbox\/Eigene Dokumente\/Insel\/#_ftn1_8665\" name=\"_ftnref1_8665\">[1]<\/a>, die dann mit dem Standard-GZip-Verfahren komprimiert wird.<a href=\"file:\/\/\/C:\/Users\/Christian\/Dropbox\/Eigene Dokumente\/Insel\/#_ftn2_8665\" name=\"_ftnref2_8665\">[2]<\/a> 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 \u00fcber Java Web Start oder ein Java Plug-in die Dateien, so werden diese direkt ausgepackt und wie ein Jar eingebunden.<\/p>\n<hr align=\"left\" size=\"1\" width=\"33%\" \/>\n<p><a href=\"file:\/\/\/C:\/Users\/Christian\/Dropbox\/Eigene Dokumente\/Insel\/#_ftnref1_8665\" name=\"_ftn1_8665\">[1]<\/a> 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 \u00fcber die internen Vorg\u00e4nge lang, siehe http:\/\/docs.oracle.com\/javase\/7\/docs\/technotes\/guides\/pack200\/pack-spec.html.<\/p>\n<p><a href=\"file:\/\/\/C:\/Users\/Christian\/Dropbox\/Eigene Dokumente\/Insel\/#_ftnref2_8665\" name=\"_ftn2_8665\">[2]<\/a> W\u00e4hrend jede normale Klassen-Datei mit der Hex-Kennung 0xCAFEBABE beginnt, beginnt der Container der Pack-Datei mit 0xCAFED00D (Cafe Dude) \u2013 sympathisch.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>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 \u00fcber alle Formate, bietet aber keine besonderen Kompressionsverfahren f\u00fcr gewissen Dateitypen. Eine optimale Kompression ist aber gerade bei Jar-Bezug \u00fcber das Internet w\u00fcnschenswert. W\u00e4hrend JPG-Dateien [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":"","_links_to":"","_links_to_target":""},"categories":[11],"tags":[],"class_list":["post-2302","post","type-post","status-publish","format-standard","hentry","category-insel"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/2302","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/comments?post=2302"}],"version-history":[{"count":1,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/2302\/revisions"}],"predecessor-version":[{"id":2303,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/2302\/revisions\/2303"}],"wp:attachment":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/media?parent=2302"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/categories?post=2302"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/tags?post=2302"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}