Modernisierung: EAR bauen mit Gradle, aber bitte mit WAR

Die Aufgabe klingt erstmals einfach, und die Antwort auf die Frage “geht das auch noch, wenn wir auf Gradle umsteigen?” beantwortet man ganz gerne mit “ja, das müsste out-of-the-box problemlos möglich sein.”

Es geht hierbei um eine gar nicht so nicht-alltägliche Aufgabe. Eine Webapplikation in Form eines WAR Archives soll für das Deployment auf dem Applikationsserver in ein EAR gepackt werden. Für bestehende Buildprozesse, zum Beispiel Ant-basierend oder auch Eclipse, stellt dies keine größere Hürde dar, handelt es sich doch um ein in der Spezifikation vorgesehenes Szenarium.

Das Webprojekt ist – wie erwartet – durch das WAR Plug-In schnell auf Gradle umgestellt, sodass das gewünschte WAR erzeugt wird.

apply plugin: 'war'

version = '1.0'
jar {
    manifest {
        attributes 'Implementation-Title': 'Meine Web Applikation', 'Implementation-Version': version
    }
}

repositories {
    mavenCentral()
}


dependencies {
....
}

Unser Deployment soll allerdings, wie erwähnt, aus einem EAR-File bestehen. Gradle wird neben dem WAR Plug-In auch mit einem EAR Plug-In ausgeliefert.
apply plugin: 'ear' baut allerdings direkt das EAR-File mit den kompilierten Klassen auf oberster Ebene. Ein Einbetten eines WAR-Files für die Webapplikation findet nicht statt, wenn wir versuchen das Plug-In zusätzlich zu unserem WAR Plug-In im Buildfile zu verwenden.
Hierfür muss ein weiteres Gradle Projekt angelegt werden (Gradle Multi Project Builds), welches den EAR Build-Prozess übernimmt und unsere gepackte Webapplikation mit einbindet. Somit entsteht ein zweites Build-File, welches ausschließlich für das Bauen des Enterprise Archives zuständig ist.

apply plugin: 'ear'
version = '1.0'
jar {
    manifest {
        attributes 'Implementation-Title': 'Meine EAR Applikation', 'Implementation-Version': version
    }
}

repositories {
    mavenCentral()
}

dependencies {   
    deploy project(path:':TheInnerWar')
}

Damit das WAR-Projekt gefunden wird und beide Projekte im Filesystem zusätzlich auf einer Ebene liegen, ist zusätzlich noch in der settings.gradle-Datei im EAR Build-Projekt

includeFlat 'TheInnerWar'

erforderlich.

Bauen wir nun das EAR-Projekt, so erscheint auch unser EAR-File. Ein Blick in das File lässt uns allerdings erstaunen. Obwohl wir das WAR Plug-In angegeben haben, liegt unsere Applikation leider nicht als WAR-File vor. Stattdessen wird von Gradle ein JAR-File erzeugt und dem Enterprise Archive hinzugefügt. Die Gradle Dokumentation schweigt sich hierbei leider aus, wie das Verhalten überschrieben werden kann.

deploy project(path:':TheInnerWar', configuration:'archives')

löst unser Problem. Wir erhalten nun ein EAR, und unsere Webanwendung liegt darin als WAR-File vor.

Short URL for this post: http://wp.me/p4nxik-2k1
This entry was posted in Build, config and deploy, Did you know? and tagged , , . Bookmark the permalink.

One Response to Modernisierung: EAR bauen mit Gradle, aber bitte mit WAR

  1. Bei der Web-Applikation hat die Angabe des Manifest unter “jar” keine Wirkung bei mir (Zeile 4). Es sollte die “war”-Task manipuliert werden, dann erscheint “Meine Web Applikation” auch im WAR. Sonst: Danke!

Leave a Reply