Wie überschreiben Sie Dateien in der WAR-Datei während des Maven-Builds?

8

Ich habe ein Java-Webapp-Projekt, das ich in Eclipse (genauer MyEclipse 10) entwickle und mit Maven 3 erstelle.

Ich habe folgendes Layout (einschließlich nur der für mein Problem relevanten Dateien:

%Vor%

Wie Sie sehen können, habe ich eine Reihe von Konfigurationsdateien hinzugefügt. Diejenigen, die sich an ihrem richtigen Ort innerhalb der Projektstruktur befinden, d. H. Innerhalb von src/main/resources und src/main/webapp , sind diejenigen, die ich routinemäßig verwende, wenn ich in MyEclipse arbeite. Ich kann MyEclipse-Connectors verwenden, um eine Bereitstellung automatisch auf z. eine Tomcat-Instanz auf meinem Dev-Rechner. Ich klicke einfach auf "Server ausführen" und ich kann debuggen. In diesem Zusammenhang muss Maven überhaupt nicht verwendet werden.

Wenn ich dann ein Release für eine andere Umgebung erstellen möchte, wie Testen oder Produzieren, führe ich mvn -P test clean install aus und es erstellt einen netten WAR.

Mein Ziel ist es, die Konfigurationsdateien in der endgültigen WAR durch die in src/config/{environment}/ zu ersetzen.

Ich habe Profile in meinem pom.xml :

gesetzt %Vor%

Dann versuche ich, diese Ressourcen aus dem angegebenen Profil (mit der environment -Variablen) an die richtige Stelle innerhalb der WAR-Datei (oder des temporären Ordners, der in eine WAR-Datei gepackt wird) zu kopieren:

%Vor%

Nun scheint das zu funktionieren, außer dass die "Standard" -Ressourcen in das Verzeichnis AFTER kopiert werden, also überschreiben sie diese Dateien. So komme ich immer mit z. der log4j.xml von src/main/resources anstelle von dem% s von src/main/configuration/prod/

Auszug aus der Maven-Ausgabe:

%Vor%

Wie Sie in der letzten Zeile sehen können, werden Sachen von src/main/webapp NACH dem Kopieren kopiert und überschreiben meine benutzerdefinierten Dateien: (

Meine Frage: Wie kann Maven gezwungen werden, die Dateien "aus dem aktivierten Profil" zu verwenden und die "natürlichen" Dateien irgendwie zu ÜBERSCHREIBEN?

    
Pierre Henry 04.10.2012, 14:28
quelle

6 Antworten

9

Wie in der zweiten Frage / Antwort von user944849 angegeben, bestand die einfachste Lösung darin, die Originaldateien so zu filtern dass sie durch die Dateien aus dem Ordner des Profils ersetzt werden können.

Also habe ich die Filterung zu den Standardressourcen hinzugefügt:

%Vor%

Und zu den Webressourcen:

%Vor%

Nun werden die 3 Dateien nicht in den WAR-Ordner kopiert. Im nächsten Schritt (webResources) werden sie aus dem Ordner des aktiven Profils kopiert.

Ich habe auch einen Standardordner hinzugefügt, der die drei Dateien mit gemeinsamen Werten enthält. Die Dateien aus diesem Standardordner werden ebenfalls kopiert, aber nur nach den Ordnern des Profils. Da die Ressourcen nicht überschrieben werden, werden sie nur kopiert, wenn sie nicht bereits vorhanden sind. Dies ist nützlich, wenn Sie ohne aktiviertes Profil erstellen oder wenn Sie vernünftige Standardwerte definieren können, muss nicht jedes Profil die Datei replizieren, wenn sie identisch ist.

Struktur des Konfigurationsordners:

%Vor%

Und der Abschnitt webResources meiner pom.xml:

%Vor%     
Pierre Henry 05.10.2012, 06:44
quelle
1

ein weiterer Versuch:)

Ich habe mit dem Overlay-Parameter herumgespielt. Ich denke, das ersetzt nur Dateien innerhalb des Webapp-Ordners, die Sie in einer anderen WAR-Datei innerhalb des Webapp-Ordners haben. Das ist also nicht die perfekte Sache für dein Setup.

Der oben erwähnte webResource-Parameter kann dies jedoch tun:

%Vor%

Die aktivierten Profile fügen der WAR-Datei zusätzliche Ordner hinzu. Das sollte also reichen!

    
wemu 05.10.2012 12:32
quelle
1

Ich sehe, dass Sie die gleichen Ressourcen verwenden würden, aber mit unterschiedlichen Konfigurationen in jedem Profil (Test und Prod).

Also, ich empfehle Ihnen, eine Konfiguration wie diese zu verwenden:

%Vor%

In diesem Szenario habe ich zwei Profile, von denen jedes mit dem Parameter "env" aktiviert wird. Jedes Profil verfügt über eine Datei zum Filtern Ihrer Ressourcen, setzen Sie Ihre Dateien log4j.xml, struts.properties, context.xml in src / main / resources und verwenden Sie Variablen, um die richtige Konfiguration in jedem Profil zu verwenden.

Ich hoffe, das hilft.

    
chavocarlos 14.02.2013 22:38
quelle
1

Ich denke, du musst die Kriegsdateien überlagern. Entweder erstelle eine Abhängigkeit in jedem Profil vom Typ war anstelle von jar und überlagert die Dateien in deiner aktuellen WAR-Datei.

Eine andere Möglichkeit könnte die Overlay-Konfiguration des Maven sein. Kriegs-Plugin.

, damit das Profil die Dateien aktiviert, die Sie über die aktuellen kopieren möchten. Es gibt einige Dokumentationen auf der Plugin-Seite sowie einige Beispiele

Ich hoffe, das funktioniert!

    
wemu 04.10.2012 14:39
quelle
0

Hier ist eine einfachere Version der obigen Lösungen, die nur auf einem einfachen Snippet basiert, das in pom.xml eingefügt wurde.

Erstellen Sie die Standard-Webanwendung (lokale Arbeitsstation) mit:

%Vor%

Fügen Sie einen Umgebungsbefehlszeilenparameter hinzu, um Dateien aus einem umgebungsspezifischen Verzeichnis wie resources-prod in das Zielverzeichnis WEB-INF / classes zu kopieren:

%Vor%

Fügen Sie dies innerhalb des Projektelements von pom.xml hinzu:

%Vor%

Weitere Informationen und Link zum Arbeitsbeispiel .

    
mkvalsvik 14.02.2014 21:03
quelle