 ------
 Usage
 ------
 Edwin Punzalan
 ------
 2006-07-05
 ------

~~ 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.

~~ NOTE: For help with the syntax of this file, see:
~~ http://maven.apache.org/doxia/references/apt-format.html

Usage

* Compiling Your Java Sources

  The goals for the Compiler Plugin are bound to their respective phases in the
  build lifecycle.  So to compile your sources, you need only to tell maven
  until which lifecycle to execute.  The following will compile your sources:

+-----
mvn compile
+-----

  To compile your test sources, you'll do:

+-----
mvn test-compile
+-----

  The above command will execute both <<<compiler:compile>>> and
  <<<compiler:testCompile>>> since the <<<compile>>> phase happens a few phases
  before the <<<test-compile>>> phase.

* Configuring Your Compiler Plugin

  Since the Compiler Plugin executes automatically during their phases, you
  don't have to put <<<executions>>> unlike many other plugins. However, you
  should specify the version of the Compiler Plugin.

+-----
<project>
  ...
  <build>
    <pluginManagement>
      <plugins>
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-compiler-plugin</artifactId>
          <version>${project.version}</version>
          <configuration>
            <!-- put your configurations here -->
          </configuration>
        </plugin>
      </plugins>
    </pluginManagement>
  </build>
  ...
</project>
+-----

  <<Note>>: Maven 3.0 will issue warnings if you do not specify the version of a
  plugin.
