Comment parteger des jars entre une ou plusieurs webapps, et par exemples des modules ejbs ?supposons que nous ayons une application de type EAR nommé
monApplicationEntreprise.ear.
Ce dernier est composé de 2 webApps (frontOffice.war, backOffice.war), et de 2 modules EJBs nommés frontOffficeServices.jar et backOfficeServices.jar). Chacun de ces jar ont besoin de framework.jar.
1) Une première méthode consisiterais à copier les jars dans chacun des répertoires WEB-INF/lib de chacune des webapps. Cependant, cela conduit à une augmentation importante de la taille des EAR.
Afin de ne pas copier ce jar, nous allons le mettre dans l'EAR au niveau APP-INF/LIB, et la référencer dans le MANIFEST des webapps et des ejbs.
Voici la cible :
monApplicationEntreprise.ear
|
|-- META-INF
| |-- application.xml
|
|-- APP-INF
| |-- lib
| |-- framework.jar
|
|-- frontOffice.war
| |-- META-INF
| |--MANIFEST.MF
|
|-- backOffice.war
| |-- META-INF
| |--MANIFEST.MF
|
|-- backOfficeServices.jar
| |-- META-INF
| |--MANIFEST.MF
| |--ejb-jar.xml
|
|-- frontOfficeServices.jar
|-- META-INF
|--MANIFEST.MF
|--ejb-jar.xml
Voici pour mémoire, le descripteur de deploiement de EAR:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=windows-1250">
<meta name="generator" content="PSPad editor, www.pspad.com">
<title>Nouveau2</title>
</head>
<body>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE application PUBLIC
"-//Sun Microsystems, Inc.//DTD J2EE Application 1.3//EN"
"http://java.sun.com/dtd/application_1_3.dtd">
<application>
<display-name>mon application entreprise</display-name>
<description>EAR de mon application entreprise frontOffice</description>
<module>
<ejb>frontOfficeServices.jar</ejb>
</module>
<module>
<ejb>backOfficeServices.jar</ejb>
</module>
<module>
<web>
<web-uri>frontOffice.war</web-uri>
<context-root>/frontOffice</context-root>
</web>
</module>
<module>
<web>
<web-uri>backOffice.war</web-uri>
<context-root>/backOffice</context-root>
</web>
</module>
</application>
</body>
</html>
Ensuite, pour chacune des applications, il nous faut éditer les MANIFEST.MF des applications, et y ajouter la balise classpath (attention, il faut le couper au 60ième caractères, le plus simple étant d'utiliser des outils comme maven pour générer l'ensemble ...)
Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Created-By: Apache Maven
Built-By: enwoo
Build-Jdk: 1.4.2_19
buildDate:
svnrevision:
Class-Path: APP-INF/lib/framework.jar APP-INF/ APP-INF/lib/lo
g4j-1.2.11.jar
Voici pour mémoire un exemple de descripteur d'ejbs:
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=windows-1250">
<meta name="generator" content="PSPad editor, www.pspad.com">
<title>ejb-jar</title>
</head>
<body>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE ejb-jar PUBLIC "-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 2.0//EN" "http://java.sun.com/dtd/ejb-jar_2_0.dtd">
<ejb-jar>
<display-name>frontOfficeServices</display-name>
<enterprise-beans>
<session>
<display-name>FrontOfficeServices</display-name>
<ejb-name>FrontOfficeServices</ejb-name>
<home>com.ejb.FrontOfficeServicesHome</home>
<remote>com.fr.sncf.fret.boctarification.ejb.FrontOfficeServices</remote>
<local-home>com.ejb.FrontOfficeServicesLocalHome</local-home>
<local>com.ejb.FrontOfficeServicesLocal</local>
<ejb-class>com.ejb.FrontOfficeServicesBean</ejb-class>
<session-type>Stateless</session-type>
<transaction-type>Container</transaction-type>
</session>
</enterprise-beans>
<assembly-descriptor>
<container-transaction>
<method>
<ejb-name>FrontOfficeServices</ejb-name>
<method-name>*</method-name>
</method>
<trans-attribute>Required</trans-attribute>
</container-transaction>
</assembly-descriptor>
</ejb-jar>
</body>
</html>