SlideShare a Scribd company logo
Juggling Java EE with
Enterprise Apache Maven
Jesse McConnell -
jmcconnell@apache.org
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
Is this you?
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
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
You should end up with…
Maven Lifecycle
• Supported since the beginning with maven
2
• Java EE artifact linkage is managed through
dependencies
• Artifact construction dictated by <type/>
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
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
EJB Structure and Management
• <packaging>ejb</packaging>
• Directory Layout
|-- pom.xml
`-- src
`-- main
`-- resources
`-- META-INF
`-- ejb-jar.xml
EJB Structure and Management
• Plugin Example
<plugin>
<artifactId>maven-ejb-plugin</artifactId>
<configuration>
<generateClient>true</generateClient>
</configuration>
</plugin>
Linking into Build
• Validates ejb-jar.xml file existence
• Unless you specify ejbVersion 3.0
Testing EJB Code
• Best bet is testing modularly like with
normal junit testing.
• Otherwise test when in ear and under
typical ejb conditions
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
Linking into Build
• Consider services, clients, resource libraries
• Common project layout
• Annotations of services
– All kind of implementation specific
– Real deal is testing them
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
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
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>
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
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>
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
War Overlay I - Clean
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-clean-plugin</artifactId>
<version>2.1.1</version>

<configuration>
<filesets>
<fileset>
<directory>${basedir}/src/main/webapp</directory>
<includes>
<include>images/redback</include>

<include>template/</include>

<include>template/redback</include>

<include>WEB-INF/classes</include>

<include>WEB-INF/lib</include>
</includes>
</fileset>
</filesets>
</configuration>
</plugin>
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>

<goal>inplace</goal>
</goals>
</execution>
</executions>
</plugin>
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>
<systemProperties>
<systemProperty>
<name>appserver.base</name>
<value>${project.build.directory}/appserver-base</value>
</systemProperty>
<systemProperty>
<name>appserver.home</name>
<value>${project.build.directory}/appserver-home</value>
</systemProperty>
<systemProperty>
<name>derby.system.home</name>
<value>${project.build.directory}/appserver-base/logs</value>
</systemProperty>
</systemProperties>
Testing Wars I
• jetty-maven-plugin for ‘click testing’
– mvn jetty:run
• Integration testing a bit more involved…
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
Scoping War Dependencies
• Two Approaches, different scoping
– Deploying Wars
– Integrating into Ears
Ear Structure and Management
• Directory Layout
– No specific directories required
– Dependencies are key to ear files
• Automatic application.xml creation
• MANIFEST.MF Creation
Ear Structure and Management
• Plugin Example
<plugin>
<artifactId>maven-ear-plugin</artifactId>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
</manifest>
</archive>
</configuration>
</plugin>
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
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)
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
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
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
Tips and Tricks
• Got a 300meg ear file?
– Check the scoping
– Pull apart the artifacts and look for jar
duplication
– Understand Java EE classloaders
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>
<profiles>
<profile>
<id>prod</id>
<properties>
<ejb.jdbc.url>jdbc:odbc:prod;UID=prod;PWD=p4ssw0rd</ejb.jdbc.url>
<server.type>prod</server.type>
</properties>
</profile>
<profile>
<id>test</id>
<properties>
<ejb.jdbc.url>jdbc:odbc:test;UID=test;PWD=p4ssw0rd</ejb.jdbc.url>
<server.type>test</server.type>
</properties>
</profile>
<profile>
<id>dev</id>
<properties>
<ejb.jdbc.url>jdbc:derby:dev</ejb.jdbc.url>
<server.type>dev</server.type>
</properties>
</profile>
</profiles>
Using Archetypes
• maven-archetype-j2ee-simple
– Sample aggregate project
• Geronimo sample archetypes
• Many jetty sample archetypes
– http://www.webtide.com/resources.jsp
Questions?
• Jesse McConnell - jmcconnell@apache.org
• Resources
– Better Builds with Maven
– Maven: The Definitive Guide

More Related Content

Juggling Java EE with Enterprise Apache Maven

  • 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
  • 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/>
  • 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 |-- pom.xml `-- src `-- main `-- resources `-- META-INF `-- ejb-jar.xml
  • 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
  • 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> <systemProperties> <systemProperty> <name>appserver.base</name> <value>${project.build.directory}/appserver-base</value> </systemProperty> <systemProperty> <name>appserver.home</name> <value>${project.build.directory}/appserver-home</value> </systemProperty> <systemProperty> <name>derby.system.home</name> <value>${project.build.directory}/appserver-base/logs</value> </systemProperty> </systemProperties>
  • 25. Testing Wars I • jetty-maven-plugin for ‘click testing’ – mvn jetty:run • Integration testing a bit more involved…
  • 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
  • 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
  • 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> <profiles> <profile> <id>prod</id> <properties> <ejb.jdbc.url>jdbc:odbc:prod;UID=prod;PWD=p4ssw0rd</ejb.jdbc.url> <server.type>prod</server.type> </properties> </profile> <profile> <id>test</id> <properties> <ejb.jdbc.url>jdbc:odbc:test;UID=test;PWD=p4ssw0rd</ejb.jdbc.url> <server.type>test</server.type> </properties> </profile> <profile> <id>dev</id> <properties> <ejb.jdbc.url>jdbc:derby:dev</ejb.jdbc.url> <server.type>dev</server.type> </properties> </profile> </profiles>
  • 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

Editor's Notes

  1. What goes here?
  2. Add slide showing overlay
  3. Example of jetty maven configuration from continuum for this
  4. Mentioning this too many times
  5. Add some of eric’s tips