<!--
   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.
-->
<html>

  <head>
    <meta http-equiv="Content-Language" content="en-us">
    <link rel="stylesheet" type="text/css" href="style.css">
    <title>Apache Compress Antlib User Manual</title>
  </head>

  <body>
    <h2>Apache Compress Antlib User Manual</h2>

    <p>This Antlib contains tasks and resources that provide
      compression/uncompression and archival/unarchival capabilities
      based on <a href="http://commons.apache.org/compress/">Apache
      Commons Compress</a>.  Using Apache Commons Compress 1.6 this
      Antlib supports gzip, bzip2, lzma standalone, xz and pack200
      compression and ar, arj, cpio, 7z, Unix dump, tar and zip
      archives.  Support for lzma, arj and dump is read-only.  7z can
      only be used on filesystem resources.</p>

    <h3>Known Limitations</h3>

    <p>Reading AR archives from non-filesystem resources currently
      fails for reasons that haven't been investigated, yet.  Most
      likely the problem is within Apache Commons Compress.</p>

    <h3>Tasks and Types</h3>

    <p>This Antlib contains the following tasks:</p>

    <ul>
      <li><a href="archive.html#ar">ar</a></li>
      <li><a href="unpack.html#bunzip2">bunzip2</a></li>
      <li><a href="pack.html#bzip2">bzip2</a></li>
      <li><a href="archive.html#cpio">cpio</a></li>
      <li><a href="unpack.html#gunzip">gunzip</a></li>
      <li><a href="pack.html#gzip">gzip</a></li>
      <li><a href="pack.html#pack200">pack200</a></li>
      <li><a href="pack200normalize.html">pack200normalize</a></li>
      <li><a href="archive.html#tar">tar</a></li>
      <li><a href="expand.html#un7z">un7z</a></li>
      <li><a href="expand.html#unar">unar</a></li>
      <li><a href="expand.html#unarj">unarj</a></li>
      <li><a href="expand.html#uncpio">uncpio</a></li>
      <li><a href="expand.html#undump">undump</a></li>
      <li><a href="unpack.html#unlzma">unlzma</a></li>
      <li><a href="unpack.html#unpack200">unpack200</a></li>
      <li><a href="expand.html#untar">untar</a></li>
      <li><a href="unpack.html#unxz">unxz</a></li>
      <li><a href="expand.html#unzip">unzip</a></li>
      <li><a href="pack.html#xz">xz</a></li>
      <li><a href="archive.html#zip">zip</a></li>
    </ul>

    <p>This Antlib contains the following resources:</p>

    <ul>
      <li><a href="archives.html">archives</a></li>
      <li><a href="entry.html#arentry">arentry</a></li>
      <li><a href="entry.html#arjentry">arjentry</a></li>
      <li><a href="fileset.html#arfileset">arfileset</a></li>
      <li><a href="fileset.html#arjfileset">arjfileset</a></li>
      <li><a href="compresource.html#bzip2resource">bzip2resource</a></li>
      <li><a href="entry.html#cpioentry">cpioentry</a></li>
      <li><a href="fileset.html#cpiofileset">cpiofileset</a></li>
      <li><a href="entry.html#dumpentry">dumpentry</a></li>
      <li><a href="fileset.html#dumpfileset">dumpfileset</a></li>
      <li><a href="compresource.html#gzipresource">gzipresource</a></li>
      <li><a href="compresource.html#lzmaresource">lzmaresource</a></li>
      <li><a href="compresource.html#pack200resource">pack200resource</a></li>
      <li><a href="entry.html#tarentry">tarentry</a></li>
      <li><a href="fileset.html#sevenzfileset">sevenzfileset</a></li>
      <li><a href="entry.html#sevenzentry">sevenzentry</a></li>
      <li><a href="fileset.html#tarfileset">tarfileset</a></li>
      <li><a href="compresource.html#xzresource">xzresource</a></li>
      <li><a href="entry.html#zipentry">zipentry</a></li>
      <li><a href="fileset.html#zipfileset">zipfileset</a></li>
    </ul>

    <p>This Antlib contains the following conditions that work on the
      <code>*entry</code>-resources of this Antlib as well as their
      counterparts in Ant itself:</p>

    <ul>
      <li><a href="conditions.html#hasgroupid">hasgroupid</a></li>
      <li><a href="conditions.html#hasgroupname">hasgroupname</a></li>
      <li><a href="conditions.html#hasmode">hasmode</a></li>
      <li><a href="conditions.html#hasuserid">hasuserid</a></li>
      <li><a href="conditions.html#hasusername">hasusername</a></li>
    </ul>

    <h3>Installing and Using</h3>

    <p>This Antlib requires Apache Ant 1.8.0 or higher, Apache
      Commons Compress 1.6 or higher and Java5 or higher.</p>

    <p>If you are building the Antlib from sources, run
      the <code>antlib</code> target and you'll get a
      file <code>ant-compress-VERSION.jar</code>.  If you've
      downloaded a binary release, you are already there.</p>

    <p>In order to use the Antlib, you can either
      use <code>taskdef</code> or rely on Ant's autodiscovery by using
      an XML namespace and the Antlib's URI.  The <code>taskdef</code>
      approach allows you to specify a custom classpath while you must
      make sure Ant finds the Antlib itself as well as Apache Commons
      Compress - either because it is in a well known place like
      <code>$ANT_HOME/lib</code> or using the <code>-lib</code>
      command line option - when using autodiscovey.</p>

    <h4>The <code>taskdef</code> approach</h4>

    <p>Before you can use any of the tasks or resources you must use
      a <code>taskdef</code> task like:</p>

    <pre>
      &lt;taskdef 
        uri="antlib:org.apache.ant.compress"
        resource="org/apache/ant/compress/antlib.xml"&gt;
        &lt;classpath&gt;
          &lt;pathelement location="YOUR-PATH-TO/ant-compress-VERSION1.jar"/&gt;
          &lt;pathelement location="YOUR-PATH-TO/commons-compress-VERSION2.jar"/&gt;
        &lt;/classpath&gt;
      &lt;/taskdef&gt;
</pre>

    <p>And later use something like:</p>

    <pre>
      &lt;comp:tar
        xmlns:tar="antlib:org.apache.ant.compress"
        ...
</pre>

    <h4>The autodiscovery approach</h4>

    <pre>
      &lt;project
        xmlns:comp="antlib:org.apache.ant.compress"
        ...
</pre>

    <p>And later use something like:</p>

    <pre>
          &lt;comp:tar
            ...
</pre>

  </body>
</html>
