Reputation: 1155
I have a handful or EJB jar modules which also include their web resources as described in in this question.
I would now like to deploy this as part of an EAR.
Now, I could do this as a war without any issues and that is my backup plan. However, I would like to understand if it is possible to deploy multiple "web fragment" jars into an ear to form a complete web application without having a war file in there to combine it all together.
Additionally, If I have multiple war files that depend on one or more of these jars, will I have to build them such that these jars are duplicated within the WEB-INF/lib of the war files even if the war files then end up within the same ear?
In this case, if the jar files include entities, would they also be needed in the root of the ear so that a global persistence unit can be defined?
I am on JBoss 7 though I would prefer a standard container independent solution if possible.
Upvotes: 4
Views: 4930
Reputation: 1302
This will work on any JEE5 compliant server.
Let's assume you have
You want to package it all into an EAR file called myapp.ear.
The myapp.ear directory structure will look like this:
myapp.ear:
META-INF/application.xml
myejb1.jar
myejb2.jar
mywebapp1.war
mywebapp2.war
lib/log4j.jar
lib/mycommon.jar
The contents of your META-INF/application.xml will contain
<?xml version="1.0" encoding="UTF-8"?>
<application xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="5"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/application_5.xsd">
<module>
<ejb>myejb1.jar</ejb>
</module>
<module>
<ejb>myejb2.jar</ejb>
</module>
<module>
<web>
<web-uri>mywebapp1.war</web-uri>
<context-root>webapp1</context-root>
</web>
</module>
<module>
<web>
<web-uri>mywebapp2.war</web-uri>
<context-root>webapp2</context-root>
</web>
</module>
<library-directory>lib</library-directory>
</application>
You will be able to access your web apps via the URL
http://myJBossServer.url/webapp1/
http://myJBossServer.url/webapp2/
You can also share static resources like CSS, images, JavaScript among multiple webapps. For example, I have a static-content.jar file with this directory layout:
static-content.jar:
META-INF/resources/css/my.css
META-INF/resources/img/my.jpg
META-INF/resources/js/jQuery.js
META-INF/resources/js/node.js
I put the static-content.jar in the WEB-INF/lib directory on both my webapps during build time. Now
http://myJBossServer.url/webapp1/css/my.css
http://myJBossServer.url/webapp2/css/my.css
have the same source from static-content.jar.
If I wanted to override the default my.css in webapp2 only, I can put the modified my.css into the mywebapp2.war directly.
mywebapp2.war
css/my.css
WEB-INF/lib/static-content.jar
The css/my.css in the WAR will override the my.css from static-content.jar
Upvotes: 3