Ich glaube nicht, dass Sie das in einem Schritt tun können (eigentlich bin ich überrascht, dass Maven sich nicht über Ihr Setup beschwert und sich fragt, welches Programm angewendet wird) und ich würde vorschlagen, Profile zu verwenden und vielleicht zu filtern Verwalten Sie diesen Anwendungsfall.
Wenn deine web.xml
wirklich unterschiedlich sind, kannst du deine maven-war-plugin-Konfiguration in zwei Profile setzen. Oder, besser, könnten Sie sie in etwas wie das zusammenführen:
Und setzen Sie die env
-Eigenschaft in zwei Profilen, um die richtige web.xml
zur Build-Zeit aufzunehmen.
Wenn Ihre web.xml
ähnlich sind (d. h. wenn sich nur Werte in ihnen unterscheiden), können Sie Eigenschaften und ihre Werte in zwei Profilen definieren und sie mithilfe von Filtern anwenden. Etwas wie das:
Aktivieren Sie dann das eine oder das andere Profil, indem Sie die env-Eigenschaft in der Befehlszeile übergeben, z. B .:
%Vor%Eine andere Option wäre, die Werte in bestimmte Filter zu setzen und die richtige zur Erstellungszeit auszuwählen (wie in diesem Beitrag) ).
Es gibt wirklich viele Möglichkeiten, aber wie gesagt, ich glaube nicht, dass Sie das tun können, ohne den Build zweimal zu starten.
Weitere Ressourcen zu Profilen / Filtern:
Sie können dem Maven Assembly-Plugin mitteilen, dass es einfach zwei Assemblys generieren soll. Sie schreiben einfach eine Assembly-Deskriptordatei für jede Ausgabe, die Sie erstellen möchten, und listen sie in der Plugin-Konfiguration auf.
Zum Beispiel verwende ich es, um eine WAR-Datei und eine TGZ-Datei zu generieren, aber es gibt keinen Grund, warum Sie nicht zwei WARs auf die gleiche Weise machen können. Das mvn-Paket erzeugt dann beide Dateien.
%Vor% Ich würde generell vorschlagen, Profile zu verwenden und zwei dedizierte Builds auszuführen. Es sollte jedoch möglich sein, eine beliebige Anzahl von Artefakten mit dem Maven-Assembly-Plugin .
Ich denke, dies kann nur erreicht werden, indem man ein benutzerdefiniertes Maven-Plugin schreibt oder den Build-Lebenszyklus stört und den War-Assembly-Prozess zweimal ausführt (dies ist nur eine schwache Idee).
Vielleicht könnten Sie zwei Profile erstellen und das Ziel zweimal mit verschiedenen Profilen ausführen ( mvn -P prof1 package
, mvn -P prof2 package
), aber seien Sie vorsichtig mit den generierten Artefaktnamen, sie sollten nicht überschrieben werden. Oder Sie können möglicherweise ein benutzerdefiniertes Plugin erstellen, das andere Plugins verwendet und die beiden War-Dateien zusammenfügt.
Ich benutze zwar nicht Maven, aber Ivy , stattdessen sollten Sie Folgendes tun:
Lassen Sie Ihre eigene Anwendung in einem privaten Repository / ähnlich wie JAR mit ihren Abhängigkeiten / anderen statischen Inhalten veröffentlichen und dann individuelle Projekteinstellungen für die Erstellung der implementierungsspezifischen WARs der Anwendung mit kontextspezifischen Konfigurationen. Indem Sie nun eines der einzelnen Bereitstellungsprojekte erstellen, erhalten Sie die aktuelle Version Ihrer tatsächlichen Anwendung mit ihren spezifischen Build-Konfigurationen.
Ich gehe davon aus, dass Maven, da dies in Ivy trivial ist, es genauso leicht machen könnte.
Sort-of-hässlicher Hack (er bricht Mavens Idee, Absichten statt Aktionen zu deklarieren), arbeitete aber für mich: Ich musste zwei Kriege generieren, die die gleiche Backend-Codebasis hatten, aber auf den MVC-Controller-Paketen variierten .
Nachdem ich meinen Kopf mit mehreren Plugins geschlagen hatte, dachte ich "Hey, ich würde es leicht in Ameisen machen", was mich dazu brachte, <maven-antrun-plugin>
zu benutzen, um die Kriege während der "Paket" -Phase zu erzeugen alle Dateien). So ungefähr:
(Um fair zu sein, ich habe die Originaldatei nicht gelöscht, aber Sie sollten dazu in der Lage sein.)
In Ihrem Fall könnten Sie einen Krieg ohne die alternative web.xml verpacken, umbenennen / über die ursprüngliche web.xml verschieben und dann den zweiten Krieg verpacken.