<!--
   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, .Z, Snappy and
      pack200 compression and ar, arj, cpio, 7z, Unix dump, tar and
      zip archives.  Support for lzma, arj, .Z, Snappy 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#sevenz">sevenz</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="unpack.html#unsnappy">unsnappy</a></li>
      <li><a href="expand.html#untar">untar</a></li>
      <li><a href="unpack.html#unxz">unxz</a></li>
      <li><a href="unpack.html#unz">unz</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="compresource.html#snappyresource">snappyresource</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>
      <li><a href="compresource.html#zresource">zresource</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>
