<!--
  ~ 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>
    <title>Maven Shared Components: Jar Analyzer</title>
</head>
<body>

<h1>Maven Shared Components: Jar Analyzer</h1>

<p>
    The Maven Jar Analyzer components can be used to gather various pieces of information about a given JAR file.

    Currently, the following operations are supported:
</p>
<ul>
    <li><a href="#Identification">Maven Artifact Identification</a> - examine the JAR and its contents to try and
        determine any associated Maven metadata such as group and artifact ID.
    </li>
    <li><a href="#ClassAnalysis">Java Class Analysis</a> - examine ther JAR's class file contents to determine various
        pieces of Java metadata.
    </li>
</ul>

<a name="Identification"><h2>Maven Artifact Identification</h2></a>

<p>
    To determine the Maven artifact metadata for a particular JAR, the
    {@link org.apache.maven.shared.jar.identification.JarIdentificationAnalysis} class is used.
    The class can be obtained through Plexus, or created standalone (in which case, see the class Javadoc for
    information on proper wiring).
</p>

<p>
    Note that to use the class, you must first obtain a {@link org.apache.maven.shared.jar.JarAnalyzer} instance as
    instructed in its Javadoc.
</p>

<p>
    The resulting information will be populated in the returned
    {@link org.apache.maven.shared.jar.identification.JarIdentification} class.
</p>

<p>
    Example usage:
    <pre>
        JarAnalyzer jar = new JarAnalyzer( jarFile );
        JarIdenfitication jarIdenfitication;
        try
        {
            // instance must have been previously obtained through Plexus or created as instructed in its Javadoc
            jarIdenfitication = jarIdenfiticationAnalyzer.analyze( jar );
        }
        finally
        {
            jar.closeQuietly();
        }

        // continue to use jarIdenfitication or jar.getJarData()
    </pre>
</p>

<a name="ClassAnalysis"><h2>Java Class Analysis</h2></a>

<p>
    To determine the Java class metadata for a particular JAR, the
    {@link org.apache.maven.shared.jar.classes.JarClassesAnalysis} class is used.
    The class can be obtained through Plexus, or created standalone (in which case, see the class Javadoc for
    information on proper wiring).
</p>

<p>
    Note that to use the class, you must first obtain a {@link org.apache.maven.shared.jar.JarAnalyzer} instance as
    instructed in its Javadoc.
</p>

<p>
    The resulting information will be populated in the returned
    {@link org.apache.maven.shared.jar.classes.JarClasses} class.
</p>

<p>
    Example usage:
    <pre>
        JarAnalyzer jar = new JarAnalyzer( jarFile );
        JarClasses jarClasses;
        try
        {
            // instance must have been previously obtained through Plexus or created as instructed in its Javadoc
            jarClasses = jarClassAnalyzer.analyze( jar );
        }
        finally
        {
            jar.closeQuietly();
        }

        // continue to use jarClasses or jar.getJarData()
    </pre>
</p>

</body>
</html>