<!--
   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.13 this
      Antlib supports gzip, bzip2, lzma standalone, xz, .Z, DEFLATE, Snappy and
      pack200 compression and ar, arj, cpio, 7z, Unix dump, tar and
      zip archives.  Support for 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="pack.html#deflate">deflate</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#lzma">lzma</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="unpack.html#undeflate">undeflate</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="compresource.html#deflateresource">deflateresource</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.13 or higher and Java7 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>
