Deployment mit Maven 2, Cargo und Glassfish

Hallo zusammen,

da ich schon lange keine richtig guten Technischen Beiträge hier im Blog verfasst habe, wirds allerhöchste Zeit.

Die regelmäßigen Leser wissen, dass ich ein kleines Spielwiesenprojekt habe, in dem ich immer wieder mal neue Sachen ausprobiere, heute hatte ich ein wenig Zeit, und ich habe mir vorgenommen, das ganze Projekt (ein EAR) mittels Maven und Cargo deploybar zu machen.

Cargo ist eine sehr einfache Java-API mit folgendem Ziel:

Cargo is a thin wrapper that allows you to manipulate Java EE containers in a standard way.

Das schöne ist, dass Cargo auch über ein Maven-Plugin verfügt, und da mein Demo-Projekt zufälligerweise auch auf Maven basiert, kann mit Hilfe des Cargo Plugins problemlos ein Deployment in eine installierte ApplicationServer-Instanz vorgenommen werden.

Um das Ganze in Aktion zu sehen, empfehle ich dringend, das Demoprojekt auszuchecken, und zwar von hier mit Hilfe des Befehls :

git clone git://github.com/dilgerma/wicket-ejb-maven-prototype.git git-project

Um das Projekt starten zu können sollte man sich einen Glassfish-AS V3 lokal installieren. Einzige Anpassung
die notwendig ist, ist der Pfad zum AS, der in der pom des Maven-Artefaktes in base/ear/pom.xml angepasst werden muss.
Die Property heißt: appserv.dir und muss auf das Glassfish-Verzeichnis zeigen (z.B. /opt/glassfishV3).

Das Projekt verwendet die Derby-DB, die mit dem GlassfishV3 zusammen ausgeliefert wird. Diese sollte zuvor gestartet werden,
und zwar im Glassfish-AS/bin Verzeichnis mit dem Befehl:

GLASSFISH_HOME/bin/asadmin start-database

Um das Projekt zu starten sollte einmalig das Projekt durchgebaut werden, und zwar im base-Projekt mit folgendem Befehl:

mvn clean install -Preal

und anschließend im ear Modul:

mvn cargo:start

Dieser Befehl startet sowohl den Application-Server und führt ebenfalls das Deployment des soeben gebauten EAR-Archives
aus. Im folgenden gehe ich noch ein wenig auf die Konfiguration ein, hauptsächlich für mich selbst zur Dokumentation.

Um das EAR-Deployment mit Cargo zu konfigurieren muß zunächst das dazu notwendige Maven-Cargo-Plugin konfiguriert werden, hierzu brauchen wir folgende Repositories, die in der Base-Pom deklariert sind.

<plugin> <groupId>org.codehaus.cargo</groupId> <artifactId>cargo-maven2-plugin</artifactId> <version>1.0.5-SNAPSHOT</version></plugin>

Die restliche Konfiguration erfolgt direkt in der pom.xml des EAR-Projektes.

Was wir hier benötigen ist das cargo-maven2-plugin.

<build> <finalName>hp-app</finalName> <plugins> <plugin> <groupId>org.codehaus.cargo</groupId> <artifactId>cargo-maven2-plugin</artifactId> <version>1.0.5-SNAPSHOT</version> <!-- Configuration Details in http://cargo.codehaus.org/Maven2+Plugin+Reference+Guide#Maven2PluginReferenceGuide-configurationlocatedBlockquote--> <configuration> <container> <containerId>${appserv.cargo.id}</containerId> <home>${appserv.dir}</home> <type>installed</type> </container> <configuration> <type>standalone</type> <properties> <cargo.hostname>localhost</cargo.hostname> </properties> <configfiles> <configfile> <!--file>${appserv.dir}/glassfish/domains/${glassfish.domain}/config/domain.xml</file--> <file>src/main/resources/glassfish-config/domain.xml</file> <todir>cargo-domain/config</todir> </configfile> </configfiles> <deployables> <deployable> <groupId>de.md</groupId> <artifactId>ear</artifactId> <type>ear</type> </deployable> </deployables> </configuration> </configuration> </plugin></plugins>

Betrachten wir die Konfiguration noch ein wenig genauer:

Zunächst deklarieren wir mal die Abhängigkeit auf das cargo2-plugin (hier in der Version 1.0.5-SNAPSHOT).

Das Plugin selbst hat aber wenig Nutzen, es muss konfiguriert werden.
Hierfür gibt es den Configuration-Tag innerhalb jeder Plugin-deklaration.

Was zunächst konfiguriert werden muss ist der Container selbst, dieser Konfigurationsteil konfiguriert quasi
das Cargo-Plugin und den verwendeten AS.

<container> <containerId>${appserv.cargo.id}</containerId><home>${appserv.dir}</home> <type>installed</type> </container>
Eine gute Referenz für die Konfiguration von Cargo findet sich hier.

Über das Attribut containerId wird Cargo mitgeteilt, welcher AS denn tatsächlich im Einsatz ist, dies sind feste Strings und
können hier nachgelesen werden, für den Glassfish V3 lautet der String „glassfishv3“.

Das Attribut home verweist auf das Home-Verzeichnis des Glassfish-Servers.

Wichtig ist auf das Attribut type, dieses Attribut kann die Werte „installed„, „embedded“ und „remote“ annehmen.
Was ist aber der Unterschied? Im Normalfall (und wie ich in diesem Fall) wird das Plugin zur Entwicklungszeit verwendet, und hier
hauptsächlich um ein EAR in einen lokal installierten AS zu deployen. Deswegen wird von uns auch die Variante „installed“ verwendet, was
nichts anderes für Cargo bedeutet, als das der AS lokal bereits installiert ist.

Embedded bedeutet nichts anderes, als das der Container in der gleichen JVM und sogat im gleichen Thread wie Cargo ausgeführt wird. In diesem Fall ist es wichtig, dass die Container-Jars im Classpath verfügbar sind. Der einzige Container der aktuell den Embedded-Mode unterstützt ist der Jetty-Container in der Version 4,5 oder 6.

Damit wäre der Container vollständig konfiguriert. Was jetzt noch passieren muß ist die Konfiguration für das Cargo-Plugin selbst.

Hier verwenden wir folgenden Tag:

<configuration> <type>standalone</type> <properties> <cargo.hostname>localhost</cargo.hostname> </properties> <configfiles> <configfile><!--file&gt;${appserv.dir}/glassfish/domains/${glassfish.domain}/config/domain.xml&lt;/file--><br /> <file>src/main/resources/glassfish-config/domain.xml</file><todir>cargo-domain/config</todir> </configfile> </configfiles> <deployables> <deployable> <groupId>de.md</groupId><artifactId>ear</artifactId> <type>ear</type></deployable></deployables></configuration>

Zunächst ist es wichtig, den Typ der Konfiguration zu definieren. Folgende Werte sind prinzipiell möglich:standalone, existing und runtime.

Standalone-Konfiguration bedeutet, dass Cargo den Container jedesmal von neuem komplett neu aufsetzt.

Existing-Konfiguration bedeutet, dass Cargo eine bestehende Konfiguration wiederverwendet.

Runtime-Konfiguration bedeutet, das die Konfiguration erst zur Laufzeit festgelegt wird.

Im Idealfall verwendet man eine Existing-Konfiguration, da ansonsten alle Datenbank-settings etc. bei jedem Starten des Containers jedesmal neu gesetzt werden müssen. Leider, leider, leider unterstützt GlassfishV3 keine Verwendung von Existing-Konfigurationen. Um das zum Laufen zu bringen habe ich einige Zeit investieren müssen.

Versucht man eine Existing-Konfiguration zu verwenden stößt man auf folgende Fehlermeldung:


org.codehaus.cargo.container.ContainerException: Cannot create configuration. There's no registered configuration for the parameters (container [id = [glassfish3x], type = [installed]], configuration type [existing]). Valid types for this configuration are:
 - standalone

Nicht ganz einfach, daraus schlau zu werden, richtig? Und ständig die Konfigurationen für den AS neu aufzusetzen ist definitiv keine Option. Natürlich gibt es einen kleinen Workaround:).

Wir können einfach ein bestehendes Glassfish-Configuration-File wiederverwenden. Ich habe dieses File mal direkt im EAR-Projekt unter src/main/resources/glassfish-config/domain.xml bereitgestellt.

Eingebunden werden kann das Ganze auf folgende Art und Weise.

<configfiles>
    <configfile>
          <file>src/main/resources/glassfish-config/domain.xml</file>
          <todir>cargo-domain/config</todir>
    </configfile>
</configfiles>

Das Attribut file verweist auf das Konfigurationsfile, in diesem Fall ein Domain-Configuration-File des Glassfish.
Die Domain die Defaultmäßig von Cargo neu erzeugt wird heißt „cargo-domain „, dies läßt sich auch nicht ändern, soweit ich das bisher sehe. Das Konfigurationsfile muß also zur Laufzeit in das Config-Dir der
Cargo-Domain kopiert werden.
Das passiert mit dem Tag „todir„.

Zuletzt muß Cargo noch mitgeteilt werden, was überhaupt deployed werden kann.


<deployables>
 <deployable>
 <groupId>de.md</groupId>
 <artifactId>ear</artifactId>
 <type>ear</type>
 </deployable>
 </deployables>

Das wars, die Applikation fährt jetzt hoch, wird komplett deployed, die Konfiguration des Glassfish wird zur Laufzeit geladen.

Das einzige was ich noch nicht hinbekommen hab, ist das auch automatisch die Datenbank des Glassfish hochgefahren wird. Das muss momentan immer noch manuell passieren.

Ich hoffe, der Artikel machts dem Einen oder Anderen ein wenig einfacher. Über Kommentare freue ich mich natürlich.

Advertisements

Ein Gedanke zu „Deployment mit Maven 2, Cargo und Glassfish

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s