<!--
  ~ 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.
  -->

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <meta name="generator" content=
                "HTML Tidy for Windows (vers 14 June 2007), see www.w3.org"/>
        <title>Quick Guide to Maven for Axis 2.0</title>
        <meta http-equiv="content-type" content=
                "text/html; charset=us-ascii"/>
    </head>
    <body lang="en" xml:lang="en">
        <h1 align="center">Quick Guide to Maven for Axis 2.0</h1>
        <h2 align="left">Introduction</h2>
        <p align="left">
            <a href="http://maven.apache.org">Maven 2</a>
            is used
            as the build environment for Axis2. This document will provide a quick
            guide on how to use Maven with our project.
        </p>
        <h2 align="left">Commands</h2>
        <table>
            <tbody>
                <tr>
                    <th scope="col">
                        <div align="left">Command</div>
                    </th>
                    <th scope="col">
                        <div align="left">Description</div>
                    </th>
                </tr>
                <tr>
                    <td>mvn clean</td>
                    <td>Cleans all the content built so far in the target/ folder. This
                        will not delete jars from your local repository.
                    </td>
                </tr>
                <tr>
                    <td>
                        <div align="left">mvn install</div>
                    </td>
                    <td>
                        <div align="left">Run a full build.</div>
                    </td>
                </tr>
                <tr>
                    <td>
                        <div align="left">mvn test</div>
                    </td>
                    <td>
                        <div align="left">Runs our basic test suite.</div>
                    </td>
                </tr>
                <tr>
                    <td>
                        <div align="left">mvn clean test</div>
                    </td>
                    <td>
                        <div align="left">Cleans up, rebuilds everything from scratch, and then runs the basic test
                            suite.
                        </div>
                    </td>
                </tr>
                <tr>
                    <td>
                        <div align="left">mvn -Dtest=MyTest install</div>
                    </td>
                    <td>
                        <div align="left">run a single test (cd to the specific module say kernel before running this
                            and don't use the package name of the class, just the class name).
                        </div>
                    </td>
                </tr>
                <tr>
                    <td>
                        <div align="left">mvn dependency:resolve</div>
                    </td>
                    <td>
                        <div align="left">print dependencies under any module</div>
                    </td>
                </tr>
                <tr>
                    <td>
                        <div align="left">mvn site</div>
                    </td>
                    <td>
                        <div align="left">Generates the website in target/site/</div>
                    </td>
                </tr>
                <tr>
                    <td>
                        <div align="left">mvn idea:idea</div>
                    </td>
                    <td>
                        <div align="left">Generates IDEA .ipr, .iml and .iws project
                            files.
                        </div>
                    </td>
                </tr>
                <tr>
                    <td>
                        <div align="left">mvn -Dtest=false</div>
                    </td>
                    <td>
                        <div align="left"></div>
                        Builds Axis2 and skips all the tests.
                    </td>
                </tr>
                <tr>
                    <td>
                        <div align="left">mvn -U -Drelease clean install</div>
                    </td>
                    <td>
                        <div align="left"></div>
                        Generate release artifacts.
                    </td>
                </tr>
            </tbody>
        </table>
        <h4>Notes:</h4>
        <ul>
            <li>The "-U" ensures that you fetch the latest snapshots</li>
            <li>The "-Drelease" runs the pom.xml under modules/distribution. The zip's are created under
                modules/distribution/target
            </li>
            <li>To skip tests use "-Dtest=false"</li>
            <li>If you run into an exception, switch on printing of full exception using "-e"</li>
            <li>If you want to see the versbose output, use "-X"</li>
        </ul>
        <h3>Ant helper for the m2 build</h3>
        <p>If you prefer to use Ant, we have a build.xml. Please note that there are 2 maven2 plugins that need to be
            built first when you update version # for Axis2. the ant build.xml takes care of that automatically. It
            builds
            axis2-aar-maven-plugin and axis2-mar-maven-plugin before it runs the main build.
        </p>
        <table>
            <tbody>
                <tr>
                    <th scope="col">
                        <div align="left">Command</div>
                    </th>
                    <th scope="col">
                        <div align="left">Description</div>
                    </th>
                </tr>
                <tr>
                    <td>ant clean"</td>
                    <td>cleans up</td>
                </tr>
                <tr>
                    <td>ant install"</td>
                    <td>runs the build</td>
                </tr>
                <tr>
                    <td>ant deploy"</td>
                    <td>deploys artifacts in apache m2 snapshots repo</td>
                </tr>
                <tr>
                    <td>ant -Doffline=true clean"</td>
                    <td>offline clean up</td>
                </tr>
                <tr>
                    <td>ant -Doffline=true install"</td>
                    <td>offline build</td>
                </tr>
                <tr>
                    <td>ant -Dskip=true install"</td>
                    <td>run the build, but skip the tests</td>
                </tr>
                <tr>
                    <td>ant -Dskip=true install"</td>
                    <td>run the build, but skip the tests</td>
                </tr>
                <tr>
                    <td>ant -Dskip=true deploy"</td>
                    <td>deploys artifacts, but skip the tests</td>
                </tr>
                <tr>
                    <td>ant -Doffline=true -Dskip=true install"</td>
                    <td>run the build in the offline and skips the tests</td>
                </tr>
            </tbody>
        </table>
    </body>
</html>
