A brief overview on Apache Maven2. About the lifecycle, core concepts and how to setup a project. Presented with demos about Eclipse integration and reporting customization.
2. What is Maven?
•
A build tool like Apache Ant but:
●
Configure your build, don't script it
●
Define what you build, not how!
•
A dependency management tool
●
Coherent organization of dependencies
•
A project management tool
Take back control!
Heiko Scherrer
3. What is Maven?
•
Currently using Maven2.
Maven3 is almost backward compatible
•
Benefit of a wide range of plugins to
setup your build and reporting
•
Maven repository server, e.g. Sonatype's
Nexus
Heiko Scherrer
4. Maven vs. Ant – Why not Ant?
•
“Convention over Configuration”
•
Appreciate for building complex
modularized applications
•
Based on a repository to store and
resolve artifacts
•
Maven doesn't have to know about
directory structures (use defaults)
Heiko Scherrer
5. Downside of Maven
•
“Convention over Configuration”
•
Exceptions are less meaningful and
configuration errors hard to find
•
Plugins are less documented
Heiko Scherrer
7. What represents a project ?
•
Each project has a project descriptor
(pom.xml)
•
A project is determined using Maven
coordinates
groupId:artifactId:version:classifier:type
•
Project Object Model (POM) files support
inheritance
Heiko Scherrer
8. Standard directory layout
•
Take advantage of
Mavens default
configuration - setup a
standard directory layout
•
Maven Archtype plugin
creates project structure
•
The target directory is
generated after the first
build run
Heiko Scherrer
9. POM – Project Object Model (I)
•
Define your project <project ...>
coordinates <modelVersion>4.0.0</modelVersion>
<groupId>org.openwms</groupId>
•
Set a packaging type <artifactId>org.openwms.core</artifactId>
<version>1.0.1-SNAPSHOT</version>
-> what to build <packaging>jar</packaging>
List dependencies,
<dependencies>
•
<dependency>
you need for your <groupId>junit</groupId>
<artifactId>junit</artifactId>
project in different <version>${junit.version}</version>
<scope>test</scope>
scopes
</dependency>
</dependencies>
•
Use custom </project>
properties
Heiko Scherrer
10. POM - Scopes
•
COMPILE
Included in compilation, packaged and delivered
•
PROVIDED
Included in compilation, but not packaged. Expected to be
provided at runtime
•
RUNTIME
Not included in compilation classpath, but expected at runtime
(Class.forName...)
•
TEST
Only included in test classpath and test phase; not delivered
•
SYSTEM
Like provided, but must be referenced directly. Used for non
Maven artifacts
Heiko Scherrer
11. POM Inheritance
•
A super POM comes with your local Maven
installation (maven2.jar#pom-4.0.0.xml)
•
POM files inherit configuration from a parent
project
•
Common used dependencies or configuration
snippets shall be moved to a parent project
•
That way it is possible to build complex
inheritance strategies
•
Find the effective POM:
mvn help:effective-pom
Heiko Scherrer
12. Grouping & Inheritance
•
Building modules to group projects
• Use the packaging type pom and define
submodules
•
Group modules and configure build with
Profiles
•
Use inheritance to follow DRY principle
Heiko Scherrer
13. POM – Project Object Model (II)
<project ...>
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.openwms</groupId>
<artifactId>org.openwms</artifactId>
•
Define a parent <version>1.0.1-SNAPSHOT</version>
</parent>
project <artifactId>org.openwms.core</artifactId>
<packaging>pom</packaging>
•
Project coordinates <name>OpenWMS CORE module</name>
<modules>
<module>org.openwms.core.domain</module>
Project name and a
</modules>
•
<build>
list of submodules <plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-
•
Override plugin <configuration>
plugin</artifactId>
<source>1.6</source>
configuration <target>1.6</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
Heiko Scherrer
15. Lifecycle, Phases, Plugins and Goals
•
Maven uses plugins to accomplish it's work
•
Each plugin offers one or more goals
•
A goal is specific to a plugin -
comparable to an Ant target
•
Most plugins are developed and driven by the
community
•
Plugin goals are documented on the generated Maven
site
Plugin Goal
• Calling a single plugin goal: mvn compiler:compile
Heiko Scherrer
16. Lifecycles, Phases, Plugins and Goals
•
The Lifecycle is a pre-defined procedural process for
building and distributing a particular artifact
•
A Phase is one step in Mavens Build Lifecycle
●
Plugin goals are attached to an execution Phase
●
Each Phase can perform one or more plugin goals
•
Kick a Lifecycle Phase execution:
mvn clean or mvn site
• 3 standard Lifecycles : clean, default, site
•
Plugins can define own Lifecycles (see Flex plugin)
Heiko Scherrer
17. Standard Lifecycle - Clean
•
Provided by the
clean plugin
•
Pre-configured in the pre-clean
Super POM
• Run mvn clean to
execute all three clean
phases within the
Lifecycle
•
Deletes build post-clean
directory
${basedir}/target
Heiko Scherrer
18. Standard Lifecycle - Default
validate
•
21 phases
•
Validate project
compile
completeness for build run
•
Compile source code
test
•
Run unit tests
•
Package in distributable
format package
•
Install to local repository
install
•
Deploy; copies the artifacts
to a remote repository deploy
Heiko Scherrer
20. Local Maven Repository
• When executing the Lifecycle phase install,
Maven populates a local repository with
artifacts
• Local repository: ~/.m2/repository
•
Dependencies and custom deliverables are
stored hierarchically
• The groupId is interpreted as directory path
• The artifactId and version define the name
of the artifact
Heiko Scherrer
21. Remote Maven Repository
•
A Remote repository is a central, company-
wide storage for build artifacts
•
Serves as
●
a Proxy (to minimize bandwidth)
●
a storage for own project artifacts
(accessible by Maven or web UI)
•
Sonatype Nexus Repository Manager is
OpenSource (comm. version available)
• Copy to central repo: mvn deploy
Heiko Scherrer
31. Reporting & Site Generation
• Run site generation: mvn site
•
Maven-site-plugin
• Site content: ${basedir}/src/site
•
Accepted formats: apt, fml, xdoc,
DocBook, …
Heiko Scherrer
32. Reporting & Site Generation
•
Report generation is part of site
•
Site customization is done within
<reporting> section
•
Useful plugins:
maven-project-info-reports-plugin,
dashboard-maven-plugin,
cobertura-maven-plugin,
maven-surefire-report-plugin,
maven-javadoc-plugin
•
→ Demo
Heiko Scherrer
34. IDE Integration (Eclipse)
•
Usually each IDE has its own project setting files
•
Avoid sharing platform specific files within your
VCS
• Import pom.xml as Maven project → Eclipse demo
• Use maven-eclipse-plugin to add particular
project facets: mvn eclipse:eclipse
•
Use the IDE to develop – not to build.
→ Keep Maven out of development process
Heiko Scherrer
35. IDE Integration II (Eclipse)
•
Install m2eclipse:
http://m2eclipse.sonatype.org/sites/m2e
•
m2eclipse comes with Maven3 beta, change
manually to local Maven2 installation
•
In addition to the local and remote repository,
m2eclipse uses the workspace as 1st. Repository
•
Use favorite Run Configurations to run Maven
Heiko Scherrer
37. Tips & Tricks
• Download sources mvn dependency:sources
• Define <server> in your settings.xml to store your
credentials
• Add -DskipTests to bypass test phase
• Add -U to update snapshot dependencies manually
•
m2e: Nested projects lead to artifact resolving
errors
Heiko Scherrer
38. Tips & Tricks II
•
Aggregate common config in top-level pom
•
SVN ignore IDE specific files and use pom as
project descriptor at all
•
Don't commit binaries or generated files to VCS
Heiko Scherrer