E N D
1. Juggling Java EE with Enterprise Apache Maven Jesse McConnell - jmcconnell@apache.org
2. Who Am I? On Maven PMC
Active in Continuum
Some maven plugins
Some mojo plugins @ codehaus
axistools-maven-plugin - don’t hold that against me…pls
Redback @ codehaus
3. Is this you?
4. Java EE Application Development by Convention No laughing matter
People cry everyday because of java ee
Maven can help keep crying to a minimum
hopefully
Planning is key
5. Components of Java EE Enterprise Java Beans’s
maven-ejb-plugin
V. 2 and 3 specs
Web Services
axistools-maven-plugin
cxf-maven-plugin
others
Web Archives (Wars)
maven-war-plugin
Enterprise Archives (Ears)
maven-ear-plugin
6. You should end up with…
7. Maven Lifecycle Supported since the beginning with maven 2
Java EE artifact linkage is managed through dependencies
Artifact construction dictated by <type/> What goes here?
What goes here?
8. Understanding Structure in Maven Follow Conventions
Archiva and Continuum are good example Web Applications
Redback is security overlay packaged as a Web Application and overlaid
9. Library Code Understanding the final goal and scoping dependencies appropriately.
That means…understand Java EE classloaders
Understand your Container
Like to think they are all interchangeable
Can be harder in practice
10. EJB Structure and Management <packaging>ejb</packaging>
Directory Layout
11. EJB Structure and Management Plugin Example
<plugin>
<artifactId>maven-ejb-plugin</artifactId>
<configuration>
<generateClient>true</generateClient>
</configuration>
</plugin>
12. Linking into Build Validates ejb-jar.xml file existence
Unless you specify ejbVersion 3.0
13. Testing EJB Code Best bet is testing modularly like with normal junit testing.
Otherwise test when in ear and under typical ejb conditions
14. Web Service Structures and Management No strict lifecycle phase
No strict directory layout
Depends on web service architecture in use
xfire -> CXF, Axis, etc
Code generation components
wsdl2java
java2wsdl
15. Linking into Build Consider services, clients, resource libraries
Common project layout
Annotations of services
All kind of implementation specific
Real deal is testing them
16. Testing Web Services Can be hard to test directly
Client testing against established servers begs irreproducibility
Test by deploying services to embedded jetty and running client code
17. War Structure and Management <packaging>war</packaging>
Directory Layout
|-- pom.xml
`-- src
`-- main
|-- java
| `-- com
| `-- example
| `-- projects
| `-- SampleAction.java
|-- resources
| |-- images
| | `-- sampleimage.jpg
| `-- sampleresource
`-- webapp
|-- WEB-INF
| `-- web.xml
|-- index.jsp
`-- jsp
`-- websource.jsp
18. War Structure and Management Plugin Example
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.0</version>
<configuration>
<webappDirectory>/container/deploy/dir</webappDirectory>
</configuration>
</plugin>
19. War Overlay Often handy to build component oriented wars.
Overlay multiple war files to create actual war file.
Continuum and Archiva do this is redback for shared security and user management bits Add slide showing overlay
Add slide showing overlay
20. Linking into Build Dependency management scoping is key
Dig into your war file and see what is in there
Don’t be afraid, its doesn’t bite
<scope>provided</scope> can be your friend
Other Options:
<warSourceExcludes>WEB-INF/lib/*.jar</warSourceExcludes>
21. Three different usages War:war - standard war creation
War:exploded - builds out war in exploded format in target dir
War:inplace - builds out webapp in src/main/webapp
Dependency Management scoping key for war usability
22. War Overlay I - Clean <plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-clean-plugin</artifactId>
<version>2.1.1</version>
<!-- This configuration is added to cleanup from war:inplace -->
<configuration>
<filesets>
<fileset>
<directory>${basedir}/src/main/webapp</directory>
<includes>
<include>images/redback</include>
<!-- Images from other wars -->
<include>template/</include>
<!-- validation.js -->
<include>template/redback</include>
<!-- Templates from other wars -->
<include>WEB-INF/classes</include>
<!-- Classes and Resources from other wars -->
<include>WEB-INF/lib</include>
</includes>
</fileset>
</filesets>
</configuration>
</plugin>
23. War Overlay II - War <plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.0.1</version>
<configuration>
<archiveClasses>false</archiveClasses>
<dependentWarExcludes>META-INF/**,WEB-INF/web.xml,WEB-INF/classes/xwork.xml,WEB-INF/lib/**
</dependentWarExcludes>
</configuration>
<executions>
<execution>
<phase>compile</phase>
<goals>
<!-- Needed to get the plexus-security war overlay to do its thing before jetty:run -->
<goal>inplace</goal>
</goals>
</execution>
</executions>
</plugin>
24. Jetty Configuration <plugin>
<groupId>org.mortbay.jetty</groupId>
<artifactId>maven-jetty-plugin</artifactId>
<version>6.1.0</version>
<configuration>
<scanIntervalSeconds>10</scanIntervalSeconds>
<contextPath>/</contextPath>
<jettyEnvXml>${basedir}/src/jetty-env.xml</jettyEnvXml>
<connectors>
<connector implementation="org.mortbay.jetty.nio.SelectChannelConnector">
<port>9090</port>
<maxIdleTime>60000</maxIdleTime>
</connector>
</connectors>
</configuration>
<dependencies>
<dependency>
<groupId>org.apache.derby</groupId>
<artifactId>derby</artifactId>
<version>10.1.3.1</version>
</dependency>
</dependencies>
</plugin>
25. Testing Wars I jetty-maven-plugin for ‘click testing’
mvn jetty:run
Integration testing a bit more involved… Example of jetty maven configuration from continuum for thisExample of jetty maven configuration from continuum for this
26. TestingWars II generate-resources
dependency-maven-plugin
Unzip the webapp
Prepare provided dependencies
package
maven-antrun-plugin
Copy container configuration
Copy provided dependencies
pre-integration-test
selenium-maven-plugin
Start server
cargo-maven2-plugin
Start container
integration-test
maven-antrun-plugin
Check continuum started
maven-surefire-plugin
Run tests
Post-integration-test
Cargo-maven2-plugin
Stop container
27. Scoping War Dependencies Two Approaches, different scoping
Deploying Wars
Integrating into Ears Mentioning this too many timesMentioning this too many times
28. Ear Structure and Management Directory Layout
No specific directories required
Dependencies are key to ear files
Automatic application.xml creation
MANIFEST.MF Creation
29. Ear Structure and Management Plugin Example
<plugin>
<artifactId>maven-ear-plugin</artifactId>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
</manifest>
</archive>
</configuration>
</plugin>
30. Linking into Build Just do it…
Then triage.
Primary recommendation, keep your project modular
Test your modules
Use ear module as simply the aggregation of the project
packaging
31. Supported Ear Modules ejb3Module - ejb3 (Enterprise Java Bean version 3)
ejbClientModule - ejb-client (Enterprise Java Bean Client)
ejbModule - ejb (Enterprise Java Bean)
jarModule - jar (Java Archive)
harModule - har (Hibernate Archive)
parModule - par (Plexus Archive)
rarModule - rar (Resource Adapter Archive)
sarModule - sar (JBoss Service Archive)
webModule - war (Web Application Archive)
wsrModule - wsr (JBoss Web Service Archive)
32. Testing Ears Functionally the same kind of process as the war integration testing
use cargo
Bind start app server to pre-integration-test phase
Start Selenium server
Run any surefire tests
Bind stop app server to post-integration-test
33. Scoping Ear Dependencies Learn Dependency Management in parent poms
Love it
Plan for ear deployment, scope things that are used by multiple war and ejb’s as provided or test in those poms
Scope for inclusion in ear, leave versioning to the dependencyManagement, its why it is there
34. Application Deployment Options Cargo - cargo.codehaus.org
Supported containers
Geronimo 1.x - geronimo1x
JBoss 3.x, 4.x - jboss3x, jboss4x
Jetty 4.x, 5.x, 6.x - jetty4x, jetty5x, jetty6x
jo! 1.x - jo1x
OC4J 9.x - oc4j9x
Orion 1.x, 2.x - orion1x, orion2x
Resin 2.x, 3.x - resin2x, resin3x
Tomcat 3.x, 4.x, 5.x - tomcat3x, tomcat4x, tomcat5x
WebLogic 8.x - weblogic8x
Maven2 plugin support
Deployment area largely untargeted by maven conventions
Hard to standardize in real world
35. Tips and Tricks Got a 300meg ear file?
Check the scoping
Pull apart the artifacts and look for jar duplication
Understand Java EE classloaders Add some of eric’s tips
Add some of eric’s tips
36. Tips and Tricks II <build>
<plugins>
<plugin>
<artifactId>maven-ejb-plugin</artifactId>
<configuration>
<ejbVersion>3.0</ejbVersion>
<classifier>${server.type}</classifier>
</configuration>
</plugin>
</plugins>
</build>
37. Using Archetypes maven-archetype-j2ee-simple
Sample aggregate project
Geronimo sample archetypes
Many jetty sample archetypes
http://www.webtide.com/resources.jsp
38. Questions? Jesse McConnell - jmcconnell@apache.org
Resources
Better Builds with Maven
Maven: The Definitive Guide