Comment faire pour remplacer les fichiers dans le fichier WAR pendant maven build?
J'ai un Java webapp projet que je développe dans Eclipse (plus précisément MyEclipse 10) et de construire à l'aide de Maven 3.
J'ai le schéma suivant (en incluant seulement les fichiers pertinents à mon problème :
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
Comme vous pouvez le voir, j'ai inclus un certain nombre de fichiers de configuration. Celui qui se trouvent à leur emplacement approprié dans le cadre du projet struture, c'est à dire à l'intérieur de src/main/resources
et src/main/webapp
sont ceux que j'utilise régulièrement quand je travail dans MyEclipse. Je peux utiliser MyEclipse connecteurs de mise à jour automatique d'un déploiement par exemple, un Tomcat exemple sur ma machine de dev. Je viens de cliquer sur "serveur" et je puis de débogage. Pas besoin d'utiliser Maven à tous, dans ce contexte, en fait.
Ensuite, quand je veux créer une version pour un autre environnement, tels que le test ou de production, je lance mvn -P test clean install
et il construit une belle GUERRE.
Mon but est de remplacer les fichiers de configuration à l'intérieur de la finale de la GUERRE par ceux qui src/config/{environment}/
.
J'ai mis des profils dans mon pom.xml
:
<profiles>
<profile>
<id>test</id>
<properties>
<environment>test</environment>
</properties>
</profile>
<profile>
<id>prod</id>
<properties>
<environment>prod</environment>
</properties>
</profile>
</profiles>
Alors, j'essaye de copier ces ressources à partir du profil spécifié (à l'aide de la environment
variable) à l'emplacement correct à l'intérieur de la GUERRE (ou le dossier temporaire qui sera compressé dans une GUERRE) :
<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>
Maintenant, cela semble fonctionner, sauf que le "standard" des ressources sont copiés dans le répertoire APRÈS cela, de sorte qu'ils remplacer ces fichiers. Donc, je finis toujours par exemple, avec la log4j.xml
de src/main/resources
au lieu de celui de dire src/main/configuration/prod/
Extrait de l'Maven de sortie :
[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]
Comme vous pouvez le voir sur la dernière ligne, des trucs de src/main/webapp
est copié d'APRÈS, donc d'écraser mes fichiers personnalisés 🙁
Ma question : Comment faire pour forcer Maven pour utiliser les fichiers "dans le profil activé" et en quelque sorte REMPLACER le "naturel" des fichiers ?
OriginalL'auteur Pierre Henry | 2012-10-04
Vous devez vous connecter pour publier un commentaire.
Comme indiqué dans la deuxième Q/A donnée par user944849, la solution la plus simple était de filtrer les fichiers d'origine de sorte qu'ils peuvent être remplacés par les fichiers à partir du profil du dossier.
J'ai donc ajouté un filtrage du standard de ressources :
Et à des ressources web :
Donc maintenant les 3 fichiers ne sont pas copiés dans la GUERRE du dossier. Dans l'étape suivante (webResources) ils sont copiés à partir du profil actif du dossier.
J'ai aussi ajouté un dossier par défaut contenant les 3 fichiers avec des valeurs communes. Les fichiers de ce dossier par défaut sont également copiés, mais seulement après que le profil du dossier. Comme les ressources ne sont pas remplacés, ils seront copiés uniquement si elles n'existent pas déjà. Ceci est utile si vous construisez sans un profil activé, ou si vous pouvez définir des valeurs sensibles par défaut, pas de chaque profil doit reproduire le fichier si c'est identique.
Structure du dossier config:
Et la webResources section de mon pom.xml:
OriginalL'auteur Pierre Henry
Prendre un coup d'oeil à une de ces questions/réponses. On peut travailler pour vous.
Exécuter une tâche ant dans maven build phase d'avant guerre est emballé?
Fichiers ont été écrasées dans le projet maven lors de la construction d'une guerre
Q2 : Sur quelque chose ici. J'ai essayé à l'aide de
packagingExcludes
mais il ne fonctionne pas. RessemblewarSourceExcludes
pourrait faire l'affaire.OriginalL'auteur user944849
une autre tentative 🙂
J'ai joué avec la superposition de paramètre. Je pense que seul remplace les fichiers à l'intérieur d'une webapp dossier que vous avez dans un autre fichier war à l'intérieur de la webapp. Ce n'est donc pas quelque chose de parfait pour votre installation.
Encore mentionné ci-dessus webResource paramètre peut le faire:
Les profils activés vont ajouter d'autres dossiers à la guerre de fichier. Donc ça devrait faire l'affaire!
OriginalL'auteur wemu
Je vois que vous utilisez les mêmes ressources, mais avec des configurations différentes dans chaque profil (test et prod).
Donc, je vous suggère d'utiliser une configuration comme ceci:
Dans ce scénario, j'ai deux profils, chacun est activé à l'aide de "env" paramètre.
Chaque profil est un fichier de filtre de vos ressources, de mettre votre log4j.xml, lattes.propriétés, context.xml les fichiers dans le répertoire src/main/resources et utiliser des variables à utiliser à la configuration de chaque profil.
Espère que ça aide.
OriginalL'auteur chavocarlos
Je pense que vous avez besoin de superposer la guerre des fichiers. Soit en créant une dépendance dans chaque profil de type guerre au lieu de pot, qui superposera les fichiers dans votre fichier war.
Une autre possibilité pourrait être la superposition de configuration de l'maven-guerre-plugin.
de sorte que le profil d'activer les fichiers que vous voulez avoir copiés sur les modèles actuels. Il est assez peu de documentation sur le site plugin aussi bien avec quelques exemples
Espère que fonctionne!
Je pense que vous n'avez pas besoin d'utiliser une guerre extérieure fichier si vous utilisez maven-guerre-plugin et les superpositions. L'id/artifactId/groupId paramètres semblent être facultatif, si vous n'avez pas besoin de mettre de l'environnement config dans un module séparé.
la guerre-plugin semble fonctionner dans le package de phase: maven.apache.org/guides/introduction/... alors que les ressources plugin fonctionne plus tôt dans le processus-ressources. Je ne pense pas de cette manière que le travail de tromper la guerre-plugin.
OriginalL'auteur wemu
Ici est une version plus simple des solutions ci-dessus qui s'appuie uniquement sur un simple fragment inséré dans pom.xml.
Construire la valeur par défaut (poste de travail local) webapp avec:
Ajouter un environnement paramètre de ligne de commande pour copier des fichiers à partir d'un environnement spécifique répertoire comme ressources-prod à la cible WEB-INF/classes répertoire:
Ajouter ceci à l'intérieur de l'élément du projet de pom.xml:
Plus d'infos et lien vers exemple de travail.
OriginalL'auteur mkvalsvik