Nov 152008
 

Zuletzt habe ich über das Beschleunigen von lokalen JEE-Deployments geschrieben. Für das Beschleunigen von JEE-Deployments ist meiner Einschätzung nach zwingend das exploded Deployment notwendig. Dabei wird ein EAR oder WAR nicht als Archiv-Datei sondern als entpackte Verzeichnisstruktur deployt. Leider ist das Deployment von exploded EARs und WARs noch nicht durch die JEE-Spezifikation abgedeckt. Daher hat jeder JEE Container dabei so seine Eigenheiten. Die folgenden Zeilen liefern ein paar wichtige Informationen zum lokalen Deployment von explodierten EARs unter Glassfish V2.

Explodierte Verzeichnisstruktur

Für alle Schnell-Checker: So sieht das Verzeichnis-Layout meiner Beispiel-Applikation aus:

Explodierte EAR-Verzeichnisstruktur für Glassfish

Explodierte EAR-Verzeichnisstruktur für Glassfish

Der Deskriptor “application.xml” des EAR sieht wie folgt aus:

<?xml version="1.0" encoding="UTF-8"?>
<application xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee" xmlns:application="http://java.sun.com/xml/ns/javaee/application_5.xsd"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/application_5.xsd"
    version="5">
    <display-name>codis vc</display-name>
    <module>
        <ejb>jboss-seam-2.1.0.SP1.jar</ejb>
    </module>
    <module>
        <ejb>codis_base.jar</ejb>
    </module>
    <module>
        <ejb>vc_core.jar</ejb>
    </module>
    <module>
        <ejb>vc_business.jar</ejb>
    </module>
    <module>
        <web>
            <web-uri>vc_web.war</web-uri>
            <context-root>vc</context-root>
        </web>
    </module>
    <library-directory>/lib</library-directory>
</application>

Wichtig ist, dass alle Module des EAR explodiert vorliegen. Ein Mischbetrieb von explodierten und verpackten Modulen innerhalb einer Applikation wird von Glassfish V2 nicht unterstützt. Daher muss auch das verwendete Seam-Framework, welches als EJB-Modul einzubinden ist, entpackt vorliegen. Dies ist zum Beispiel in JBoss 4.2.2 anders.

Die Verzeichnisnamen der explodierten EAR-Module sind die URIs aus “application.xml” mit dem Unterschied, dass Glassfish statt “.jar” den Suffix “_jar” bzw. statt “.war” den Suffix “_war” voraussetzt.

Diese Besonderheiten sind sicherlich ein Grund, warum das Glassfish-Plugin für Eclipse WTP aktuell kein Deployment von explodierten EARs unterstützt.

Exploded JARs innerhalb des EAR-Verzeichnis

Zur Strukturierung der Applikation ist die Aufteilung in mehrere Softwareprojekte notwendig, die jeweils ein Artefakt (JAR bzw. WAR) erzeugen. Durch diese Unterteilung werden Abhängigkeiten innerhalb des Systems über die Projektabhängigkeiten schon grob eingeschränkt.

Um JAR-Dateien auch explodiert innerhalb des EAR deployen zu können, müssen diese als Module im Deskriptor “application.xml” definiert werden. Bisher habe ich keine andere elegante Möglichkeit gefunden. Möglich wäre noch die Angabe von Classpath-Referenzen auf die JAR-Verzeichnisse mittels “META-INF/manifest.mf” in den EAR-Modulen, welche die JARs benötigen.

Module die in “application.xml” als JAR definiert werden, sind nach JEE-Spezifikation die Application Clients. Dies kann zum Beispiel eine Swing-Anwendung sein, die als Client fungiert. Im EAR-Deskriptor sieht ein JAR-Modul wie folgt aus:

<module>
  <java>vc_core.jar</java>
</module>

Glassfish versucht diese JAR-Module per Java WebStart bereitzustellen. Dabei prüft der Glassfish Deployer die Datei “META-INF/MANIFEST.MF” auf den Eintrag “Main-class”. Dieser Eintrag muss den vollqualifizierte Klassenname der Startklasse enthalten, für welche die main-Methode aufgerufen wird. Ist dieser Eintrag nicht vorhanden, so meldet Glassfish eine Warnung:

[#|2008-11-16T08:50:38.859+0100|WARNING|sun-appserver9.1|javax.enterprise.system.tools.deployment|
_ThreadID=15;_ThreadName=Timer-40;vc_business.jar;_RequestID=5
16b05a8-8e7f-4bd9-a448-ea5184b4280e;|App client vc_business.jar did not specify
Main-Class in its manifest as described in the Java EE specification; 
no annotations in this app client will be processed|#]

Kurz danach wirft Glassfish eine Exceptions ins “server.log”:

[#|2008-11-16T08:50:41.187+0100|SEVERE|sun-appserver9.1|javax.enterprise.system|
_ThreadID=15;_ThreadName=Timer-40;_RequestID=516b05a8-8e7f-4bd9-a448-ea5184b4280
e;|Error updating Java Web Start information for application vc_app
java.lang.NullPointerException
        at com.sun.enterprise.appclient.jws.AppclientJWSSupportInfo.prepareApplication(AppclientJWSSupportInfo.java:1221)
        at com.sun.enterprise.appclient.jws.AppclientJWSSupportInfo.startJWSServicesForApplication(AppclientJWSSupportInfo.java:475)
        at com.sun.enterprise.appclient.jws.AppclientJWSSupportManager.handleApplicationEvent(AppclientJWSSupportManager.java:156)

Das ist unschön, trotzdem ist das JAR-Modul deployt. Andere Module im EAR können auf die Klassen des JAR-Modules zugreifen.

Um den obigen Fehler im Log zu vermeiden, verwende ich statt dessen EJB-Module, obwohl ich aktuell gar keine EJBs sondern ausschließlich Seam-Beans verwende. Lediglich ein Dummy-EJB muss in jedem EJB-Modul enthalten sein, sonst beschwert sich Glassfish () und deployt das EJB-Modul nicht.

Damit ist für mich das Thema exploded Deployment in Glassfish V2 gelöst. Bleibt nur zu hoffen, dass folgende JEE-Spezifikationen das explodierte Deployment endlich standardisieren. Für die effiziente Entwicklung von JEE-Applikationen ist das aus meiner Sicht absolut notwendig.

  2 Responses to “Exploded EAR Deployment in Glassfish V2 mit Seam 2.1”

  1. Vielen Dank für den Artikel. Das ist genau das Problem an dem wir gerade hängen.
    Wie sieht es denn mit externen Libraries aus die wir mit deployen wollen (Hibernate und IceFaces zum Beispiel).
    Müssen wir die dann auch exploden oder können die als Jar drin bleiben?

    Danke aus Stuttgart

  2. Hallo Christian,

    die Bibliotheken sollten als JARs deployt werden – schließlich macht Ihr ja keine Änderungen darin.
    Um was für ein Projekt handelt es sich denn?

    Grüße,
    Marc

 Leave a Reply

(required)

(required)

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>