Maven is a build tool that manages Java projects and their dependencies. It uses a POM (Project Object Model) file to describe build configuration including dependencies, plugins, and reports. The document discusses using Maven to build a sample Java project with modules including data, EJB, and web application components. Maven allows each component to be built independently and deployed as JAR, EJB-JAR, and WAR artifacts. XDoclet and other plugins are used to generate code and handle deployment details.
2. Agenda
• What is Maven?
• A J2EE example
• Customizing and extending Maven
• Tips and discussions
3. What is Maven?
• A Java project management and integration
build tool.
• Based on the concept of XML Project Object
Model (POM).
• Originally developed for building Turbine.
• A small core with numerous plugins (in Jelly).
4. Build Tools Retrospective
• One level above ant.
• Make ant Maven
• (Assembly C C++)
Make makefile target
Ant build.xml target
Maven project.xml
maven.xml
goals
5. Under the Hood
forehead classloader util launcher
maven core, jelly, werkz
Maven
pluginsjava jar war ejb
ear gump xdoclet javadoc
test
jalopy
cactus artifact xdoc
site junit etc…
ant
8. Artifact Repository
• Local Repository
– A local mirror/cache of downloaded
artifacts from remote repositories.
– Located at $
{user.home}/.maven/repository
${mave.repo.local}/<groupId>/<type>s/<artifactId>-<version>.<type>
9. Implementing an Example
• Get Started
– Download from
• http://maven.apache.org/start/download.html
– Current version: 1.0rc1
– Environment setup
• export MAVEN_HOME=c:/maven-1.0rc1
• export PATH=“$MAVEN_HOME/bin;$PATH”
(or set MAVEN_HOME = c:maven-1.0rc1
set PATH = %MAVEN_HOME%bin;%PATH% )
– run install_repo.sh to populate the local
repository
10. Create a New Project
Type:
maven genapp
It will prompt for
– project id
– project name
– project package name
A Sample Service J2EE Project
• EJB (stateless session beans exposed as web
services)
• Data components
• Web application
11. Directory Layout
Project Directory Layout
sampleservice
– project.xml - Master POM of the project
– maven.xml - Reactor definition
– project.properties - Properties related to the project
– application/ - Application component
– service-data/ - Common data component
– service-ejb/ - EJB/WS component
– service-web/ - Web Application component
– target/ - Generated artifact directory
– xdocs/ - Various documents in xml format
– …
12. Directory Layout
A Component Directory Layout
…
service-data - Data component subproject
– project.xml - POM of the data project
– maven.xml - Goals definition
– project.properties - Properties related to the project
– src/ - Source directory
– conf/ - Configuration and resource files
– java/ - Java source files
– test/ - Test source files
– target/ - Generated artifact directory
– xdocs/ - Various documents in xml format
…
13. Project Object Model (POM)
Projects are described as Project Object Model.
• Project Management
– Detailed description of the project.
– Company information.
– Developer roles and information.
– Mailing list and source control modules
configuration.
• Project Build
– Source code and test code location.
– Resources location
14. Project Object Model (POM)
• Project Dependency
– Libraries needed for build and runtime.
• Project Reports
– Junit reports
– Javadoc reports
– Checkstyle reports, ….etc
16. Project Management Section
<project>
[…]
<inceptionYear>2003</inceptionYear> <!-- Used in JavaDoc –
<package>com.myinc.sampleservice</package> <!-- Used in JavaDoc -->
<shortDescription>Demo to use maven</shortDescription> <!-- one liner -->
<!-- Used in front page-->
<description>
A detailed description about this demo
</description>
<url>http://www.myinc.com/sampleservice/</url>
<issueTrackingUrl/>
<siteAddress>dev.myinc.com</siteAddress> <!-- Used in deployment -->
<siteDirectory>/www/sampleservice/</siteDirectory> <!-- Used in deployment -->
<!-- Used in deployment. If defined, it overrides ${maven.repo.central} -->
<distributionSite>/www/dist/sampleservice</distributionSite>
<!-- Used in deployment, final distribution directory -->
<distributionDirectory>/www/www.myinc.com/somedir</distributionDirectory>
25. Project Report - XDoc
xdocs/navigation.xml
…
<menu name="General Information">
<item name="Overview" href="/index.html"/>
<item name="Features" href="/features.html"/>
<item name="Specification" href="/fsd.html"/>
<item name="Getting Started" href="/getting-started.html"/>
</menu>
xdocs/features.xml
<document>
<properties>
<title>Turbine Features</title>
<author email="">Jon S. Stevens</author>
</properties>
<body>
<section name="Features">
<p>This document is for bragging about all of Turbine's ….
…
</document>
26. Property Processing
${project.home}/project.properties Project scope
properties
${project.home}/build.properties Properties
specific to each
build
${user.home}/build.properties Properties
specific to each
user
CLI –Dfoo=bar
The last definition wins
Sample build.properties:
…
bea.home=c:/bea81sp1
oracle.home=c:/oracle/ora9i
27. Build Process Design
Sample Service project components
Common data module
EJBs
Web Application
Data
(jar)
EJB
(jar)
Webapp
(war)
EAR
31. Subproject: service-ejb
Maven XDoclet Plugin
– Support all standard tags
– Automatically includes generated src dir in compilation src set
– Support util class generation
– Dependencies
– xdoclet-ejb-module-1.2
– xdoclet-web-module-1.2
– xdoclet-bea-module-1.2
(for WebLogic Server Deployment)
Note: Current version 1.2 does not work out-of-box (needed to fix the project.xml)
41. Putting It Together: Reactor
/c/dev/sampleservice/>maven
__ __
| / |__ _Apache__ ___
| |/| / _` V / -_) ' ~ intelligent projects ~
|_| |___,_|_/___|_||_| v. 1.0-rc1-SNAPSHOT
Starting the reactor...
Our processing order:
Sample Service Data Module
Sample Service EJB
Sample Service Web Application
Sample Service Application
+----------------------------------------
| Building Sample Service Data Module
| Memory: 3M/4M
+----------------------------------------
build:
java:prepare-filesystem:
[mkdir] Created dir: C:devsampleserviceservice-datatargetclasses
java:compile:
….
42. Customizing Maven
• Override plugin properties in
– project.properties
– build.properties
• Use maven.xml
– Override plugin goals
– Intercept plugin goals with <preGoal/>
and <postGoal/>
• Write you own plugin
– In Java, Jelly, or other scripting language.
43. Real Life Maven
• Single artifact per project
– Can be tweaked to deliver multiple artifacts
as long as no type conflicts
– Fine-grained design
• Project Migration/Mavenizing
– Can co-exist with ant
– May require different directory structure
• Too Slow?
– Use console plugin
• Are you ready for maven?
– Culture change
44. Summary
• Pros
– Work out-of-box for standard projects
– Build assets highly reusable, thanks to
core/plugin architecture
– Build rules are more dynamic
– Best suited for project integration
– IDE friendly
• Cons
– Incomplete documentation
– Missing convenience details
– Not yet mature. Still waiting for the R1.
45. Get More
• http://maven.apache.org
• http://www.onjava.com/pub/a/onjava/2003/10/22/maven.html
• http://www-106.ibm.com/developerworks/java/library/j-maven
• http://www.javausergroup.at/events/maven.pdf
• http://www.theserverside.com/articles/article.jsp?
l=MavenMagic
• http://blogs.codehaus.org/people/vmassol/archives/000080.ht
ml
• http://www.javaworld.com/javaworld/jw-10-2002/jw-1011-
maven.html
Two scenarios drove Maven to us:
As a Java developer who is involved with building the application. Like to be able to reuse the build scripts, as simple as making a Java API call.
As a project manager/team lead who is trying to keep up-to-date with inter-dependencies among components.
A good analogy for developers to quickly grasp the level of Maven.
The POM consists of four sections.
There are only three required elements in POM.
The ejb goal is actually a jar task.
The build delivers two artifacts: the EJB jar and the Web Service deployment descriptor.