mirror of https://github.com/apache/maven.git
first cut of lifecycle user doc
git-svn-id: https://svn.apache.org/repos/asf/maven/components/trunk@190871 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
49ea8e4001
commit
8de5475d5a
|
@ -0,0 +1,208 @@
|
|||
------
|
||||
Build Lifecycle
|
||||
------
|
||||
Brett Porter
|
||||
------
|
||||
16 June 2005
|
||||
------
|
||||
|
||||
Build Lifecycle
|
||||
|
||||
* Build Lifecycle Basics
|
||||
|
||||
Maven 2.0 is based around the central concept of a build lifecycle. What this means is that the process for building
|
||||
and distributing a particular artifact is clearly defined.
|
||||
|
||||
For the person building a project, this means that it is only necessary to learn a small set of commands to build any
|
||||
Maven project, and the POM will ensure they get the results they desired.
|
||||
|
||||
The most common lifecycle phases that would be executed on a project are the following:
|
||||
|
||||
* <<<validate>>> - validate the project is correct and all necessary information is available
|
||||
|
||||
* <<<compile>>> - compile the source code of the project
|
||||
|
||||
* <<<test>>> - test the compiled source code using a suitable unit testing framework. These tests should not
|
||||
require the code be packaged or deployed
|
||||
|
||||
* <<<package>>> - take the compiled code and package it in its distributable format, such as a JAR.
|
||||
|
||||
* <<<integration-test>>> - process and deploy the package if necessary into an environment where integration tests
|
||||
can be run
|
||||
|
||||
* <<<verify>>> - run any checks to verify the package is valid and meets quality criteria
|
||||
|
||||
* <<<install>>> - install the package into the local repository, for use as a dependency in other projects locally
|
||||
|
||||
* <<<deploy>>> - done in an integration or release environment, copies the final package to the remote repository
|
||||
for sharing with other developers and projects.
|
||||
|
||||
Note that for each of these steps, all previous steps are always executed, so you only need to specify the last one
|
||||
you desire on the command line. For example:
|
||||
|
||||
-------
|
||||
m2 install
|
||||
-------
|
||||
|
||||
This command will compile, test, package, verify and install the package into the local repository when run.
|
||||
|
||||
There are more commands that are part of the lifecycle, which will be discussed in the following sections.
|
||||
|
||||
It should also be noted that the same command can be used in a multi-module scenario. For example;
|
||||
|
||||
------
|
||||
m2 clean:clean install
|
||||
------
|
||||
|
||||
This command will traverse into all of the subprojects and run <<<clean:clean>>>, then <<<install>>> (including all of
|
||||
the prior steps).
|
||||
|
||||
* Setting up your Project to Use the Build Lifecycle
|
||||
|
||||
The build lifecycle is simple enough to use, but when you are constructing a Maven build for a project, how do you go
|
||||
about assigning tasks to each of those build phases?
|
||||
|
||||
** Packaging
|
||||
|
||||
The first, and most common way, is to set the <<<packaging>>> for your project. This defaults to <<<jar>>>, so whether
|
||||
you have specifically done it or not, this has already happened. Each packaging contains a list of goals to bind to
|
||||
a particular phase. For example, a JAR will add the following bindings to the lifecycle:
|
||||
|
||||
*------------------------------+---------------------------------------------------------------------------------------+
|
||||
| <<<process-resources>>> | <<<resources:resources>>>
|
||||
*------------------------------+---------------------------------------------------------------------------------------+
|
||||
| <<<compile>>> | <<<compiler:compile>>>
|
||||
*------------------------------+---------------------------------------------------------------------------------------+
|
||||
| <<<process-test-resources>>> | <<<resources:testResources>>>
|
||||
*------------------------------+---------------------------------------------------------------------------------------+
|
||||
| <<<test-compile>>> | <<<compiler:testCompile>>>
|
||||
*------------------------------+---------------------------------------------------------------------------------------+
|
||||
| <<<test>>> | <<<surefire:test>>>
|
||||
*------------------------------+---------------------------------------------------------------------------------------+
|
||||
| <<<package>>> | <<<jar:jar>>>
|
||||
*------------------------------+---------------------------------------------------------------------------------------+
|
||||
| <<<install>>> | <<<install:install>>>
|
||||
*------------------------------+---------------------------------------------------------------------------------------+
|
||||
| <<<deploy>>> | <<<deploy:deploy>>>
|
||||
*------------------------------+---------------------------------------------------------------------------------------+
|
||||
|
||||
This is an almost standard set of bindings, however, some packages handle them differently. For example, a project
|
||||
that is purely metadata (packaging <<<pom>>>) only binds the <<<install>>> and <<<deploy>>> phases.
|
||||
|
||||
Note that for some packaging tpyes to be available, you may also need to include a particular plugin in your
|
||||
<<<build>>> section, similarly to the next section. One example of a plugin that requires this is the Plexus plugin,
|
||||
which provides a <<<plexus-application>>> and <<<plexus-service>>> packaging.
|
||||
|
||||
** Plugins
|
||||
|
||||
The second way to add goals to phases is to configure plugins in your project. As you will see in the later sections,
|
||||
plugins contain information that says where to bind particular goals to. Note that adding the plugin on its own is not
|
||||
enough information - you must also specify the goals you want run as part of your build.
|
||||
|
||||
For example, the Modello plugin always binds <<<modello:java>>> to the <<<generate-sources>>> phase. So to use the
|
||||
Modello plugin and have it generate sources from a model and incorporate that into the build, you would add the
|
||||
following to your POM in the <<<plugins>>> section of <<<build>>>:
|
||||
|
||||
----
|
||||
...
|
||||
<plugin>
|
||||
<groupId>org.codehaus.modello</groupId>
|
||||
<artifactId>modello-maven-plugin</artifactId>
|
||||
<executions>
|
||||
<execution>
|
||||
<configuration>
|
||||
<model>maven.mdo</model>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
</configuration>
|
||||
<goals>
|
||||
<goal>modello:java</goal>
|
||||
</goals>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
...
|
||||
----
|
||||
|
||||
You might be wondering why that executions element is there? That is so that you can run the same goal multiple times
|
||||
with different configuration, if needed. Separate executions can also be given an ID so that during inheritence or the
|
||||
application of profiles you can control whether goal configuration is merged or turned into an additional execution.
|
||||
|
||||
When multiple executions are given that match a particular phase, they are executed in the order specified in the POM,
|
||||
with inherited executions running first.
|
||||
|
||||
Now, in the case of <<<modello:java>>>, it only makes sense in the <<<generate-sources>>> phase. But some goals can be
|
||||
used in more than one phase, and there may not be a sensible default. For those, you can specify the phase yourself.
|
||||
For example, let's say you have a goal <<<touch:timestamp>>> that echos the current time to file, and you want it to
|
||||
run in the <<<process-test-resources>>> phase to indicate when the tests were started. This would be configured like
|
||||
so:
|
||||
|
||||
----
|
||||
...
|
||||
<plugin>
|
||||
<groupId>com.mycompany.example</groupId>
|
||||
<artifactId>touch-maven-plugin</artifactId>
|
||||
<executions>
|
||||
<execution>
|
||||
<phase>process-test-resources</phase>
|
||||
<configuration>
|
||||
<file>${project.output.directory}/timestamp.txt</file>
|
||||
</configuration>
|
||||
<goals>
|
||||
<goal>touch:timestamp</goal>
|
||||
</goals>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
...
|
||||
----
|
||||
|
||||
TODO
|
||||
|
||||
* Build Lifecycle Phase Reference
|
||||
|
||||
The following phases are all the ones available as of the Maven 2.0 alpha-3 release. They are executed in the order
|
||||
given, up to the point of the one specified.
|
||||
|
||||
*-------------------------------+--------------------------------------------------------------------------------------+
|
||||
| <<<validate>>> | validate the project is correct and all necessary information is available.
|
||||
*-------------------------------+--------------------------------------------------------------------------------------+
|
||||
| <<<generate-sources>>> | generate any source code for inclusion in compilation.
|
||||
*-------------------------------+--------------------------------------------------------------------------------------+
|
||||
| <<<process-sources>>> | process the source code, for example to filter any values.
|
||||
*-------------------------------+--------------------------------------------------------------------------------------+
|
||||
| <<<generate-resources>>> | generate resources for inclusion in the package.
|
||||
*-------------------------------+--------------------------------------------------------------------------------------+
|
||||
| <<<process-resources>>> | copy and process the resources into the destination directory, ready for packaging.
|
||||
*-------------------------------+--------------------------------------------------------------------------------------+
|
||||
| <<<compile>>> | compile the source code of the project.
|
||||
*-------------------------------+--------------------------------------------------------------------------------------+
|
||||
| <<<process-classes>>> | post-process the generated files from compilation, for example to do bytecode enhancement on Java classes.
|
||||
*-------------------------------+--------------------------------------------------------------------------------------+
|
||||
| <<<generate-test-sources>>> | generate any test source code for inclusion in compilation.
|
||||
*-------------------------------+--------------------------------------------------------------------------------------+
|
||||
| <<<process-test-sources>>> | process the test source code, for example to filter any values.
|
||||
*-------------------------------+--------------------------------------------------------------------------------------+
|
||||
| <<<generate-test-resources>>> | create resources for testing.
|
||||
*-------------------------------+--------------------------------------------------------------------------------------+
|
||||
| <<<process-test-resources>>> | copy and process the resources into the test destination directory.
|
||||
*-------------------------------+--------------------------------------------------------------------------------------+
|
||||
| <<<test-compile>>> | compile the test source code into the test destination directory
|
||||
*-------------------------------+--------------------------------------------------------------------------------------+
|
||||
| <<<test>>> | run tests using a suitable unit testing framework. These tests should not require the code be packaged or deployed.
|
||||
*-------------------------------+--------------------------------------------------------------------------------------+
|
||||
| <<<package>>> | take the compiled code and package it in its distributable format, such as a JAR.
|
||||
*-------------------------------+--------------------------------------------------------------------------------------+
|
||||
| <<<integration-test>>> | process and deploy the package if necessary into an environment where integration tests can be run.
|
||||
*-------------------------------+--------------------------------------------------------------------------------------+
|
||||
| <<<verify>>> | run any checks to verify the package is valid and meets quality criteria.
|
||||
*-------------------------------+--------------------------------------------------------------------------------------+
|
||||
| <<<install>>> | install the package into the local repository, for use as a dependency in other projects locally.
|
||||
*-------------------------------+--------------------------------------------------------------------------------------+
|
||||
| <<<deploy>>> | done in an integration or release environment, copies the final package to the remote repository for sharing with other developers and projects.
|
||||
*-------------------------------+--------------------------------------------------------------------------------------+
|
||||
|
||||
* How the Build Lifecycle Affects Plugin Developers
|
||||
|
||||
TODO
|
||||
|
||||
|
Loading…
Reference in New Issue