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.
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!