You've got it exactly right.

Maven builds are usually oriented around the concept of a lifecycle, which consists of phases in a specific order. Each phase has zero or more mojos (usually called goals) bound to it. Each phase in the lifecycle implies all of the phases that come before it. This allows users to bind (or configure) different goals to different phases of the build, then the standard phase names to run the build. The default goals for a given type of project are also bound to the lifecycle in this way, but behind the scenes, such that the user can supplement these default goals using configurations in the pom.xml.

So, if you have a jar project (<packaging>jar</packaging>), you might have something like this:

Phase                 Goals
--------                 -----------

validate            (none)
initialize           (none)
...
compile org.apache.maven.plugins:maven-compiler- plugin:compile
...
test org.apache.maven.plugins:maven-surefire- plugin:test
...
package          org.apache.maven.plugins:maven-jar-plugin:jar
...
install org.apache.maven.plugins:maven-install- plugin:install
...
etc.

Now, if you just want to compile your project, you simply call the 'compile' phase, like this:

mvn compile

If you want to run the unit tests, call this:

mvn test

Note that in order to run unit tests, you must have compiled your project's main sources. That's handled here, since the test phase is later in the lifecycle than the compile phase...'test' implies 'compile' and all the other phases (in order) that come before 'test'.

On the other hand, Maven also supports certain one-off goals that are usually meant to help manage the project build in certain special cases, or give information about the build. One such example gives you a glimpse of the POM after all inheritance and profile injection has been completed:

mvn help:effective-pom

which is shorthand for:

mvn org.apache.maven.plugins:maven-help-plugin:effective-pom


Hope that helps,

-john

On Feb 7, 2008, at 4:50 PM, Dhruva Reddy wrote:

I know this seems like a silly thing to post on here, but...

What exactly is a goal and what is a phase? I can't find a good answer in the documentation and there's a lot of seemingly conflicting information out there.

My current understanding is that a phase is a part of a lifecycle (process-resources, compile, etc). A goal is somewhat analogous to an ANT-task, but with a focus on what should happen, rather than how it is done.

Can someone clear this up for me, giving examples?

Thanks,
Dhruva

---
John Casey
Committer and PMC Member, Apache Maven
mail: jdcasey at commonjava dot org
blog: http://www.ejlife.net/blogs/john
rss: http://feeds.feedburner.com/ejlife/john


Reply via email to