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

<body>

  <h2><a name="pack200normalize">Pack200Normalize</a></h2>
  <h3>Description</h3>

  <p>In general packing and unpacking a JAR changes its binary
    representation which breaks any signature that has been used to
    sign the initial JAR.  It is possible to "normalize" a JAR by
    packing and unpacking it again so that any signature applied to
    the "normalized" JAR will stay valid during another pack/unpack
    cycle.
    See <a href="https://download.oracle.com/javase/1.5.0/docs/api/java/util/jar/Pack200.Packer.html">Pack200.Packer's
    javadocs</a> for more details.</p>

  <p>This task can be used to normalize a JAR in-place or to create a
    new normalized JAR separate from the original JAR.  The later
    allows you to run <code>&lt;jar&gt;</code>
    and <code>&lt;pack200normalize&gt;</code> in succession and the
    "normalization" step wouldn't do anything unless the original jar
    changed.</p>

  <p>If you want to normalize the JAR in-place, you must set the force
    attribute to true as any file will always be up-to-date when
    compared to itself.</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">srcfile</td>
      <td valign="top">the file to normalize.</td>
      <td align="center" valign="top">Yes.</td>
    </tr>
    <tr>
      <td valign="top">destfile</td>
      <td valign="top">the normalized archive.</td>
      <td align="center" valign="top">No, defaults to the
        srcfile.</td>
    </tr>
    <tr>
      <td valign="top">force</td>
      <td valign="top">Whether to normalize the archive even if the
        destfile seems up-to-date.</td>
      <td align="center" valign="top">No, defaults to <em>false</em></td>
    </tr>
  </table>

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

  <h4>property</h4>

  <p>Sets a property for the packer (see the Pack200 javadocs for
    details).</p>

  <p>Note this task implicitly sets the segment limit to -1.</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">key</td>
      <td valign="top">Name of the property.</td>
      <td align="center" valign="top">Yes.</td>
    </tr>
    <tr>
      <td valign="top">value</td>
      <td valign="top">Value of the property.</td>
      <td align="center" valign="top">Yes.</td>
    </tr>
  </table>

  <h3>Examples</h3>

  <pre>
    &lt;cmp:pack200normalize destfile="foo-normalized.jar"
                 xmlns:cmp="antlib:org.apache.ant.compress"
                 srcfile="foo.jar"&gt;
      &lt;property key="pack.effort" value="9"/&gt;
    &lt;/cmp:pack200normalize&gt;
  </pre>
  <p>Normalizes <i>foo.jar</i> where <i>foo-normalized.jar</i> is the
    normalized archive.  As both the normalization step and the actual
    packing must use the same parameters the normalization prepares
    for better compression results by using above than normal
    effort.</p>

  <pre>
    &lt;cmp:pack200normalize force="true"
                 xmlns:cmp="antlib:org.apache.ant.compress"
                 srcfile="foo.jar"/&gt;
  </pre>
  <p>Normalizes <i>foo.jar</i> in-place.</p>
</body>
