As I explained in my previous blog entry about JEE6 ear packaging, there is a flexible and powerful way to deploy EARs containing JEE component libraries.
Using maven makes it much easy to build such ear deployment units. The interessting part of the pom.xml of the ear module looks something like this:
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-ear-plugin</artifactId> <version>2.6</version> <configuration> <version>6</version> <modules> <webModule> <groupId>myweb</groupId> <artifactId>imixs-web</artifactId> <contextRoot>/test</contextRoot> </webModule> <ejbModule> <groupId>myejb</groupId> <artifactId>imixs-ejb</artifactId> </ejbModule> <JarModule> <groupId>org.imixs.workflow</groupId> <artifactId>imixs-workflow-engine</artifactId> <bundleDir>/</bundleDir> </JarModule> </modules> </configuration> </plugin> </plugins> ....
In this example the artefact ‘imixs-workflow-engine’ is a component library containingg EJBs. You can refere to those libraries from your ejb module (in this example ‘myejb’) by using the ‘manifestEntries’ tag in your maven ejb module configuration. This is what I explained here.
But what if you need some more additional external libraries containing non-jee-components (simple pojo’s like for example apache commons-xx.jars) ?
You can add those dependencies to your ear pom.xml – so these jars will also become part of the ear root directory. But now you need to add them again to the manifest file of your ejb module if you need access to these libraries. And this will result in a strange situation because indirect dependencies will make it impossible for you to manage your manifest file manually.
I run in this situation when a need the apache fop-1.0 library in one of my ejb components.
But the solution is again quite simple when using maven and the ear-plugin. The plugin provides a configuration tag named ‘defaultLibBundleDir’. And you simply need to the the value to ‘lib’ to get all your libraries moved in the default lib directory of an ear:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-ear-plugin</artifactId> <version>2.6</version> <configuration> <version>6</version> <defaultLibBundleDir>lib</defaultLibBundleDir> <modules> ..... .... </plugin>
But you need to be careful because also your jee-component libraries will be moved into that location if you did not overwrite the default behaviour now. You can do this by declaring each of your jee component libraries as a ‘JarModule’ where you specifiy the ‘bundleDir’ with ‘/’:
.... <module> .... <JarModule> <groupId>org.imixs.workflow</groupId> <artifactId>imixs-workflow-core</artifactId> <bundleDir>/</bundleDir> </JarModule> </module> ...
This will result in a ear structure where your own jee-components will become part of the root of your ear, and all other library dependencies will be moved to the /lib directory of your ear. So any libary can be seen from your ejb, web and component modules. And you jee-component.jars will still be parsed for JEE annotations during deployment.
I hope this helps you to build you own custom enterprise applications using all the strength of JEE.