mardi 2 mars 2010

J2EE : EAR / WAR / JAR / EJB

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>

Aucun commentaire:

Enregistrer un commentaire