blob: 2861caa538f4baf9cfa68626e97aa4ed50b7f972 [file] [log] [blame]
<?xml version="1.0"?>
<!--
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<document>
<properties>
<title>Commons Compress Pack200 Package</title>
<author email="dev@commons.apache.org">Commons Documentation Team</author>
</properties>
<body>
<section name="The Pack200 package">
<p>The Pack200 algorithm is not a general purpose compression
algorithm but one specialized for compressing JAR archives. JAR
archives compressed with Pack200 will in general be different
from the original archive when decompressed again. More
information can be found in the Javadocs of the <a
href="https://docs.oracle.com/javase/7/docs/api/java/util/jar/Pack200.Packer.html">Pack200.Packer
class</a>.</p>
<p>While the <code>pack200</code> command line utility of the
JDK creates GZip compressed archives (<code>.pack.gz</code>) by
default, the streams provided by the Pack200 package only
perform the actual Pack200 operation. Wrap them in an
additional <code>GzipCompressor(In|Out)putStream</code> in order to deal
with deflated streams.</p>
<subsection name="Pack200Strategy">
<p>The Pack200-API provided by the java class library is not
streaming friendly as it wants to consume its input completely
in a single operation. Because of this
<code>Pack200CompressorInputStream</code>'s constructor will immediately
unpack the stream, cache the results and provide an input
stream to the cache.</p>
<p><code>Pack200CompressorOutputStream</code> will cache all data that
is written to it and then pack it once the <code>finish</code>
or <code>close</code> method is called.</p>
<p>Two different caching modes are available - "in memory",
which is the default, and "temporary file". By default data
is cached in memory but you should switch to the temporary
file option if your archives are really big.</p>
<p>Given there always is an intermediate result
the <code>getBytesRead</code> and <code>getCount</code>
methods of <code>Pack200CompressorInputStream</code> are
meaningless (read from the real stream or from the
intermediate result?) and always return 0.</p>
</subsection>
<subsection name="Normalization">
<p>As a pack/unpack cycle may create a JAR archive that is
different from the original, digital signatures created for
the initial JAR will be broken by the process. There is a way
to "normalize" JAR archives prior to packing them that ensures
signatures applied to the "normalized" JAR will still be valid
aftre a pack/unpack cycle - see <a
href="https://download.oracle.com/javase/7/docs/api/java/util/jar/Pack200.Packer.html">Pack200.Packer</a>'s
javadocs.</p>
<p>The <code>Pack200Utils</code> class in the
<code>pack200</code> package provides several overloads of a
<code>normalize</code> method that can be used to prepare a
JAR archive in place or to a separate file.</p>
</subsection>
</section>
</body>
</document>