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

       https://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>Unarchiving Task</title>
</head>

<body>

<h2><a name="expand">Unarchiving Tasks</a></h2>

<p>For each of the supported archiving formats there is a
  correspondig <code>unarchiving</code> task.  These tasks are based
  on
  their <a href="https://ant.apache.org/manual/CoreTasks/unzip.html">core
  cousin tasks</a>.</p>

<p><a href="https://ant.apache.org/manual/CoreTypes/patternset.html">PatternSet</a>s are used to select files to extract
<I>from</I> the archive.  If no patternset is used, all files are extracted.
</p>

<p><a href="https://ant.apache.org/manual/CoreTypes/resources.html#collection">Resource
Collection</a>s may be used to select archived files to perform
unarchival upon.</p>

<p>You can define filename transformations by using a
nested <a href="https://ant.apache.org/manual/CoreTypes/mapper.html">mapper</a>
element.  The default mapper is the
<a href="https://ant.apache.org/manual/CoreTypes/mapper.html#identity-mapper">identity
mapper</a>.</p>

<p>File permissions will not be restored on extracted files.</p>

<h3>Parameters</h3>
<table border="1" cellpadding="2" cellspacing="0">
  <tr>
    <td valign="top"><b>Attribute</b></td>
    <td valign="top"><b>Description</b></td>
    <td align="center" valign="top"><b>Required</b></td>
  </tr>
  <tr>
    <td valign="top">src</td>
    <td valign="top">archive file to expand.</td>
    <td align="center" valign="top">Yes, if filesets are not used.</td>
  </tr>
  <tr>
    <td valign="top">dest</td>
    <td valign="top">directory where to store the expanded files.</td>
    <td align="center" valign="top">Yes</td>
  </tr>
  <tr>
    <td valign="top">overwrite</td>
    <td valign="top">Overwrite files, even if they are newer than the
      corresponding entries in the archive (true or false, default is
      true).</td>
    <td align="center" valign="top">No</td>
  </tr>
  <tr>
    <td valign="top">failOnEmptyArchive</td>
    <td valign="top">whether trying to extract an empty archive is an
      error.</td>
    <td valign="top" align="center">No, defaults to false</td>
  </tr>
  <tr>
    <td valign="top">stripAbsolutePathSpec</td>
    <td valign="top">whether Ant should remove leading '/' or '\'
      characters from the extracted file name before extracing it.
      Note that this changes the entry's name before applying
      include/exclude patterns and before using the nested mappers (if
      any).</td>
    <td valign="top" align="center">No, defaults to false</td>
  </tr>
  <tr>
    <td valign="top">skipUnreadableEntries</td>
    <td valign="top">Sometimes archives may contain entries that use
      features not (yet) supported by Apache Commons Compress,
      encryption for example.  Trying to expand such an archive will
      normally lead to an error.  Sometimes Commons Compress can
      signal it doesn't know how to handle an entry and if you set 
      <code>skipUnreadableEntries</code> to true, the Compress Antlib
      will simply skip those entries, avoiding the error.
      <br/><em>since Compress Antlib 1.1</em></td>
    <td valign="top" align="center">No, defaults to false</td>
  </tr>
</table>

<h3><a name="un7z">Un7z</a></h3>

<p><em>Since Apache Compress Antlib 1.3</em>.</p>

<p>An <a href="#expand">unarchiving task</a> for 7z archives.</p>

<p>As of version 1.3 of the Compress Antlib this task can only work on
  file based resources.</p>

<h3><a name="unar">UnAr</a></h3>

<p>An <a href="#expand">unarchiving task</a> for AR archives.</p>

<p>Traditionally the AR format doesn't allow file names longer than 16
  characters.  There are two variants that circumvent this limitation
  in different ways, the GNU/SRV4 and the BSD variant; both of which
  are transparently supported since Commons Compress 1.3.</p>

<h3><a name="unarj">UnArj</a></h3>

<p><em>Since Apache Compress Antlib 1.3</em>.</p>

<p>An <a href="#expand">unarchiving task</a> for arj archives.</p>

<p>In addition to the parameters above, the unarj tasks supports the
  following attributes:</p>

<table border="1" cellpadding="2" cellspacing="0">
  <tr>
    <td valign="top"><b>Attribute</b></td>
    <td valign="top"><b>Description</b></td>
    <td align="center" valign="top"><b>Required</b></td>
  </tr>
  <tr>
    <td valign="top">encoding</td>
    <td valign="top">
    The character encoding that has been used for filenames
    inside the arj file.  For a list of possible values see <a
    href="https://docs.oracle.com/javase/8/docs/technotes/guides/intl/encoding.doc.html">https://docs.oracle.com/javase/8/docs/technotes/guides/intl/encoding.doc.html</a>.<br>
    Defaults <code>native-encoding</code> which is the magic value for
    the platform's default character encoding.<br/>
    <em>since Compress Antlib 1.3</em></td>
    <td align="center" valign="top">No</td>
  </tr>
</table>

<h3><a name="uncpio">UnCpio</a></h3>

<p>An <a href="#expand">unarchiving task</a> for CPIO archives.</p>

<p>In addition to the parameters above, the uncpio tasks supports the
  following attributes:</p>

<table border="1" cellpadding="2" cellspacing="0">
  <tr>
    <td valign="top"><b>Attribute</b></td>
    <td valign="top"><b>Description</b></td>
    <td align="center" valign="top"><b>Required</b></td>
  </tr>
  <tr>
    <td valign="top">encoding</td>
    <td valign="top">
    The character encoding that has been used for filenames
    inside the cpio file.  For a list of possible values see <a
    href="https://docs.oracle.com/javase/8/docs/technotes/guides/intl/encoding.doc.html">https://docs.oracle.com/javase/8/docs/technotes/guides/intl/encoding.doc.html</a>.<br>
    Defaults <code>native-encoding</code> which is the magic value for
    the platform's default character encoding.<br/>
    <em>since Compress Antlib 1.3</em></td>
    <td align="center" valign="top">No</td>
  </tr>
</table>

<h3><a name="undump">UnDump</a></h3>

<p><em>Since Apache Compress Antlib 1.1</em>.</p>

<p>An <a href="#expand">unarchiving task</a> for Unix dump archives.</p>

<p>In addition to the parameters above, the undump tasks supports the
  following attributes:</p>

<table border="1" cellpadding="2" cellspacing="0">
  <tr>
    <td valign="top"><b>Attribute</b></td>
    <td valign="top"><b>Description</b></td>
    <td align="center" valign="top"><b>Required</b></td>
  </tr>
  <tr>
    <td valign="top">encoding</td>
    <td valign="top">
    The character encoding that has been used for filenames
    inside the dump file.  For a list of possible values see <a
    href="https://docs.oracle.com/javase/8/docs/technotes/guides/intl/encoding.doc.html">https://docs.oracle.com/javase/8/docs/technotes/guides/intl/encoding.doc.html</a>.<br>
    Defaults <code>native-encoding</code> which is the magic value for
    the platform's default character encoding.<br/>
    <em>since Compress Antlib 1.3</em></td>
    <td align="center" valign="top">No</td>
  </tr>
</table>

<h3><a name="untar">UnTar</a></h3>

<p>An <a href="#expand">unarchiving task</a> for TAR archives.</p>

<p>In addition to the parameters above, the untar tasks supports the
  following attributes:</p>

<table border="1" cellpadding="2" cellspacing="0">
  <tr>
    <td valign="top"><b>Attribute</b></td>
    <td valign="top"><b>Description</b></td>
    <td align="center" valign="top"><b>Required</b></td>
  </tr>
  <tr>
    <td valign="top">encoding</td>
    <td valign="top">
    The character encoding that has been used for filenames
    inside the tar file.  For a list of possible values see <a
    href="https://docs.oracle.com/javase/8/docs/technotes/guides/intl/encoding.doc.html">https://docs.oracle.com/javase/8/docs/technotes/guides/intl/encoding.doc.html</a>.<br>
    Defaults <code>native-encoding</code> which is the magic value for
    the platform's default character encoding.<br/>
    <em>since Compress Antlib 1.2</em></td>
    <td align="center" valign="top">No</td>
  </tr>
</table>

<h3><a name="unzip">UnZip</a></h3>

<p>An <a href="#expand">unarchiving task</a> for ZIP archives.</p>

<p><b>Please note</b> that different ZIP tools handle timestamps
differently when it comes to applying timezone offset calculations of
files.  Some ZIP libraries will store the timestamps as they've been
read from the filesystem while others will modify the timestamps both
when reading and writing the files to make all timestamps use the same
timezone.  A ZIP archive created by one library may extract files with
"wrong timestamps" when extracted by another library.</p>

<p>Apache Commons Compress' ZIP classes use the same algorithm as the
InfoZIP tools and zlib (timestamps get adjusted), Windows' "compressed
folders" function and WinZIP don't change the timestamps.  This means
that using the unzip task on files created by Windows' compressed
folders function may create files with timestamps that are "wrong",
the same is true if you use Windows' functions to extract an Ant
generated ZIP archive.</p>

<p>Unlike its counterpart in Ant's core this Antlib's task can also
  extract archives that are not file system resources.</p>

<p>In addition to the parameters above, the unzip tasks supports the
  following attributes:</p>

<table border="1" cellpadding="2" cellspacing="0">
  <tr>
    <td valign="top"><b>Attribute</b></td>
    <td valign="top"><b>Description</b></td>
    <td align="center" valign="top"><b>Required</b></td>
  </tr>
  <tr>
    <td valign="top">encoding</td>
    <td valign="top">
    The character encoding that has been used for filenames
    inside the zip file.  For a list of possible values see <a
    href="https://docs.oracle.com/javase/8/docs/technotes/guides/intl/encoding.doc.html">https://docs.oracle.com/javase/8/docs/technotes/guides/intl/encoding.doc.html</a>.<br>
    Defaults to &quot;UTF8&quot;, use the magic value
    <code>native-encoding</code> for the platform's default character
    encoding.
      <br/>See also the <a href="https://ant.apache.org/manual/CoreTasks/zip.html#encoding">discussion in the
      zip task page</a></td>
    <td align="center" valign="top">No</td>
  </tr>
  <tr>
    <td valign="top">scanForUnicodeExtraFields</td>
    <td valign="top">
      If the archive contains uncode extra fields then use them to set
      the file names, ignoring the specified encoding.
      <br/>See also the <a href="https://ant.apache.org/manual/CoreTasks/zip.html#encoding">discussion in the
      zip task page</a></td>
    <td align="center" valign="top">No, defaults to true</td>
  </tr>
</table>

<h3>Examples</h3>
<pre>
&lt;cmp:unzip src=&quot;${tomcat_src}/tools-src.zip&quot;
    dest=&quot;${tools.home}&quot;
    xmlns:cmp="antlib:org.apache.ant.compress"/&gt;
</pre>
<p>
<pre>
&lt;cmp:gunzip src=&quot;tools.tar.gz&quot; xmlns:cmp="antlib:org.apache.ant.compress"/&gt;
&lt;cmp:untar src=&quot;tools.tar&quot; dest=&quot;${tools.home}&quot;
    xmlns:cmp="antlib:org.apache.ant.compress"/&gt;
</pre>
<pre>
&lt;cmp:unzip src=&quot;${tomcat_src}/tools-src.zip&quot;
       xmlns:cmp="antlib:org.apache.ant.compress"
       dest=&quot;${tools.home}&quot;&gt;
    &lt;patternset&gt;
        &lt;include name=&quot;**/*.java&quot;/&gt;
        &lt;exclude name=&quot;**/Test*.java&quot;/&gt;
    &lt;/patternset&gt;
&lt;/cmp:unzip&gt;
</pre>
<p>
<pre>
&lt;cmp:unzip dest=&quot;${tools.home} xmlns:cmp="antlib:org.apache.ant.compress"&quot;&gt;
    &lt;patternset&gt;
        &lt;include name=&quot;**/*.java&quot;/&gt;
        &lt;exclude name=&quot;**/Test*.java&quot;/&gt;
    &lt;/patternset&gt;
    &lt;fileset dir=&quot;.&quot;&gt;
        &lt;include name=&quot;**/*.zip&quot;/&gt;
        &lt;exclude name=&quot;**/tmp*.zip&quot;/&gt;
    &lt;/fileset&gt;
&lt;/cmp:unzip&gt;
</pre>
<p>
<pre>
&lt;cmp:unzip src=&quot;apache-ant-bin.zip&quot;
    dest=&quot;${tools.home}&quot;
    xmlns:cmp="antlib:org.apache.ant.compress"&gt;
    &lt;patternset&gt;
        &lt;include name=&quot;apache-ant/lib/ant.jar&quot;/&gt;
    &lt;/patternset&gt;
    &lt;mapper type=&quot;flatten&quot;/&gt;
&lt;/cmp:unzip&gt;
</pre>

<pre>
&lt;cmp:unzip src=&quot;${ant.home}/lib/ant.jar&quot;
    dest=&quot;...&quot; xmlns:cmp="antlib:org.apache.ant.compress"&gt;
  &lt;patternset&gt;
    &lt;include name=&quot;images/&quot;/&gt;
  &lt;/patternset&gt;
&lt;/cmp:unzip&gt;
</pre>
<p>This extracts all images from <tt>ant.jar</tt> which are stored in the <tt>images</tt> directory
of the Jar (or somewhere under it). While extracting the directory structure (<tt>images</tt>)
will be taken.</p>

<pre>
&lt;cmp:unzip src=&quot;${ant.home}/lib/ant.jar&quot;
    dest=&quot;...&quot; xmlns:cmp="antlib:org.apache.ant.compress"&gt;
  &lt;patternset&gt;
    &lt;include name=&quot;**/ant_logo_large.gif&quot;/&gt;
    &lt;include name=&quot;**/LICENSE.txt&quot;/&gt;
  &lt;/patternset&gt;
&lt;/cmp:unzip&gt;
</pre>
<p>This extracts the two files <tt>ant_logo_large.gif</tt> and <tt>LICENSE.txt</tt> from the
<tt>ant.jar</tt>. More exactly: it extracts all files with these names from anywhere in the source file. While extracting the directory structure will be taken.</p>

<h3>Related tasks</h3>

<pre>
&lt;cmp:unzip src="some-archive" dest="some-dir" xmlns:cmp="antlib:org.apache.ant.compress"&gt;
  &lt;patternset&gt;
    &lt;include name="some-pattern"/&gt;
  &lt;/patternset&gt;
  &lt;mapper type=&quot;some-mapper&quot;/&gt;
&lt;/cmp:unzip&gt;
</pre>

is identical to

<pre>
&lt;copy todir="some-dir" preservelastmodified="true"&gt;
  &lt;cmp:zipfileset src="some-archive" xmlns:cmp="antlib:org.apache.ant.compress"&gt;
    &lt;patternset&gt;
      &lt;include name="some-pattern"/&gt;
    &lt;/patternset&gt;
  &lt;/cmp:zipfileset&gt;
  &lt;mapper type=&quot;some-mapper&quot;/&gt;
&lt;/copy&gt;
</pre>

<p>The same is also true for <code>&lt;untar&gt;</code> and
<code>&lt;tarfileset&gt;</code>.  <code>&lt;copy&gt;</code> offers
additional features
like <a href="https://ant.apache.org/manual/CoreTypes/filterchain.html">filtering
files</a> on the fly, allowing a file to be mapped to multiple
destinations or a configurable file system timestamp granularity.</p>

<pre>&lt;cmp:zip destfile=&quot;new.jar&quot; xmlns:cmp="antlib:org.apache.ant.compress"&gt;
  &lt;cmp:zipfileset src=&quot;old.jar&quot;&gt;
    &lt;exclude name=&quot;do/not/include/this/class&quot;/&gt;
  &lt;/cmp:zipfileset&gt;
&lt;/cmp:zip&gt;
</pre>
<p>&quot;Deletes&quot; files from a zipfile.</p>

</body>
</html>
