<!--
   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>Archives</title>
</head>

<body>

<h2>archives</a></h2>

<p>This resource collection accepts an arbitrary number of nested
  resources and assumes that all those resources must be archives of one
  of the supported formats.  The resources returned
  by <code>&lt;archives&gt;</code> are the contents of the nested
  archives.</p>

<p><em>archives</em> doesn't support any attributes.</p>

<h3>Parameters specified as nested elements</h3>

  <p><code>&lt;archives&gt;</code> has seven nested
    elements <code>&lt;ars&gt;</code>, <code>&lt;arjs&gt;</code>, <code>&lt;cpios&gt;</code>,
    <code>&lt;dumps&gt;</code>, <code>&lt;sevenzs&gt;</code>, <code>&lt;zips&gt;</code>
    and
    <code>&lt;tars&gt;</code> that
    are <a href="http://ant.apache.org/manual/CoreTypes/resources.html#union">unions</a>
    themselves, i.e. they accept arbitrary many resource(collection)s
    as nested elements.</p>

  <p>The nested resources of &lt;zips&gt; are treated as ZIP archives,
    the nested resources of &lt;tars&gt; as TAR archives and so on.</p>

  <p>Support for nested <code>arjs</code>, <code>dumps</code>
    and <code>sevenzs</code> has been added with the Compress Antlib
    1.5.</p>

  <h4>Examples</h4>

  <p>Copies all files from all jars that are on the classpath
    to <code>${target}</code>.</p>

  <pre>
    &lt;copy todir="${target}"&gt;
      &lt;cmp:archives xmlns:cmp="antlib:org.apache.ant.compress"&gt;
        &lt;zips&gt;
          &lt;restrict&gt;
            &lt;path path="${java.class.path}"/&gt;
            &lt;name name="*.jar"/&gt;
          &lt;/restrict&gt;
        &lt;/zips&gt;
      &lt;/cmp:archives&gt;
    &lt;/copy&gt;
</pre>

</body>
</html>
