Gewusst wie: überschreiben von Dateien in die war-Datei während des maven-build?
Ich habe ein Java-webapp-Projekt, das ich entwickle in Eclipse (genauer gesagt MyEclipse 10) und bauen mit Maven 3.
Habe ich das folgende layout (einschließlich nur relevanten Dateien zu meinem problem :
project root
|-- src
| |-- main
| | |-- java
| | |-- resources
| | | |-- log4j.xml
| | | +-- struts.properties
| | |-- webapp
| | | |-- META-INF
| | | | +--context.xml
| | |-- config
| | | |-- test
| | | | |--log4j.xml
| | | | |--struts.properties
| | | | +--context.xml
| | | +-- prod
| | | | |--log4j.xml
| | | | |--struts.properties
| | | | +--context.xml
| +--test
+--pom.xml
Wie Sie sehen können, habe ich eine Reihe von Konfigurations-Dateien. Derjenige, der bei Ihrer ordnungsgemäßen Position innerhalb der Projekt-Struktur, D. H. die innerhalb src/main/resources
und src/main/webapp
sind diejenigen, die ich regelmäßig, wenn ich in MyEclipse. Die ich verwenden kann, MyEclipse-Steckverbinder zur automatischen Aktualisierung einer Bereitstellung, um z.B. einen Tomcat-Instanz auf meine dev-Maschine. Ich klicken Sie einfach auf "run server" und ich kann Debuggen. Keine Notwendigkeit für die Verwendung von Maven an alle, die in diesem Kontext tatsächlich.
Dann, wenn ich bauen möchte, eine Freigabe für eine andere Umgebung, wie z.B. Test oder in der Produktion, ich Lauf mvn -P test clean install
und es baut einen schönen KRIEG.
Mein Ziel ist, ersetzen Sie die Konfigurations-Dateien, die sich im letzten KRIEG durch die in der src/config/{environment}/
.
Habe ich profile in meinem pom.xml
:
<profiles>
<profile>
<id>test</id>
<properties>
<environment>test</environment>
</properties>
</profile>
<profile>
<id>prod</id>
<properties>
<environment>prod</environment>
</properties>
</profile>
</profiles>
Dann versuche ich zu kopieren, diese Ressourcen aus dem angegebenen Profil (mit der environment
variable) auf die richtige Position im KRIEG (oder dem temporären Ordner, der gezippt werden in einem KRIEG) :
<webResources>
<resource>
<directory>/src/main/config/${environment}</directory>
<targetPath>META-INF/</targetPath>
<includes>
<include>context.xml</include>
</includes>
</resource>
<resource>
<directory>src/main/config/${environment}</directory>
<targetPath>WEB-INF/classes/</targetPath>
<includes>
<include>
struts.properties
</include>
<include>
log4j.xml
</include>
</includes>
</resource>
</webResources>
Nun, dies scheint zu funktionieren, außer, dass der "standard" Ressourcen kopiert werden in das Verzeichnis NACH diesem, so dass Sie diese Dateien überschrieben. Also ich habe immer am Ende mit z.B. der log4j.xml
aus src/main/resources
statt aus sagen src/main/configuration/prod/
Auszug aus dem Maven-Ausgang :
[INFO] Processing war project
[INFO] Copying webapp webResources [D:\workspace\MyProject/src/main/config/prod] to [D:\workspaces\SITEL\Webfauna\target\Webfauna]
[INFO] Copying webapp webResources [D:\workspace\MyProject\src/main/config/prod] to [D:\workspaces\SITEL\Webfauna\target\Webfauna]
[INFO] Copying webapp resources [D:\workspace\MyProject\src\main\webapp]
Wie Sie sehen können, die auf die Letzte Zeile, die Sachen von src/main/webapp
kopiert NACH, so überschreiben Sie meine benutzerdefinierte Dateien 🙁
Meine Frage : Wie force Maven zu verwenden, die Dateien "von der aktivierten Profil" und irgendwie ÜBERSCHREIBEN der "natürlichen" - Dateien ?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wie bereits in der zweiten F/A gegeben durch user944849, die einfachste Lösung war, heraus zu filtern, die original-Dateien, so dass Sie kann ersetzt werden durch Dateien aus dem Profil-Ordner.
So, ich habe die Filterung von standard-Ressourcen :
- Und zu den web-Ressourcen :
So, jetzt die 3 Dateien nicht kopiert in den KRIEG-Ordner. Im nächsten Schritt (webResources) Sie kopieren sich aus dem aktiven Profil-Ordner.
Ich habe auch einen Standard-Ordner mit den 3 Dateien mit gemeinsamen Werten. Die Dateien aus dem default Ordner auch kopiert, aber nur nach dem Profil-Ordner ersetzt. Als Ressourcen werden nicht überschrieben, Sie werden nur kopiert, wenn Sie nicht bereits vorhanden sind. Dies ist nützlich, wenn Sie bauen, ohne ein Profil aktiviert, oder wenn Sie definieren können, sinnvolle default-Werte, kein jedes Profil braucht, um zu replizieren, wenn die Datei identisch ist.
Struktur der config-Ordner:
Und das webResources Abschnitt meines pom.xml:
Werfen Sie einen Blick auf diese beiden Fragen/Antworten. Man kann für Sie arbeiten.
Führen Sie eine ant-task im maven-build-phase vor dem Krieg ist es verpackt?
Dateien wurden überschrieben maven-Projekt beim Bau eines Krieges
packagingExcludes
aber es hat nicht funktioniert. Sieht aus wiewarSourceExcludes
könnte den trick tun.weiterer Versuch 🙂
Ich habe gespielt, um mit dem overlay-parameter. Ich denke, das ersetzt nur Dateien im webapp-Ordner, den Sie in einem anderen Krieg-Datei in den webapp-Ordner. So, dass ist nicht das richtige für Ihr setup.
Doch die oben genannten webResource-parameter können dies tun:
Den aktivierten Profilen wird fügen Sie zusätzliche Ordner, um die war-Datei. Damit sollte den trick tun!
Ich sehen, dass Sie möchten, verwenden Sie die gleichen Ressourcen, aber mit unterschiedlicher Konfiguration in jedem Profil (test und prod).
So, ich schlage vor, Sie verwenden eine Konfiguration wie diese:
In diesem Szenario habe ich zwei profile, die jeweils aktiviert ist mit "env" - parameter.
Jedes Profil verfügt über einen Datei-filter, wie Sie Ihre Ressourcen, setzen Sie Ihre log4j.xml Verstrebungen.Eigenschaften, context.xml Dateien in src/main/resources und die Verwendung von Variablen zu verwenden, rechts-Konfiguration in jedem Profil.
Hoffe, das hilft.
Ich glaube, Sie brauchen, um die overlay-war-Dateien. Entweder erstellen Sie eine Abhängigkeit in jedem Profil von Art Krieg statt jar, das wird die overlay-Dateien im aktuellen war-Datei.
Eine weitere Möglichkeit könnte sein, die overlay-Konfiguration des maven-war-plugin.
also das Profil aktivieren würden die Dateien, die Sie kopiert haben, über das aktuelle. Es ist einiges an Dokumentation auf der plugin-Seite als auch mit einigen Beispielen
Hoffe, das funktioniert!
Hier ist eine einfachere version der oben genannten Lösungen, die sich nur auf ein einfaches snippet eingefügt pom.xml.
Bauen Sie die Standardeinstellung (lokale Arbeitsstation) webapp mit:
Hinzufügen einer Umgebung Kommandozeilen-parameter, um Dateien von einem Umwelt-spezifische Verzeichnis wie die Ressourcen-prod, um die Ziel-WEB-INF/classes-Verzeichnis:
Fügen Sie diese im Projekt-element pom.xml:
Weitere Infos und link zu Beispiel.