2009-10-06 10 views
5

J'ai un projet multi-module et je voudrais définir un seul fichier de filtre qui appliquera des propriétés à tous les modules enfants. Par exemple, je voudrais avoir la structure suivante:Comment partager un fichier de filtre parmi les modules Maven2?

parent
- filter.properties
- module1
    - Resource1
- module2
    - ressource2

tel que lorsque je bu ild parent, il appliquerait le filtre à resource1 et resource2 lorsque les modules enfants sont construits.

Si je crée la structure ci-dessus et que je définis le filtre dans le POM du parent, la construction échoue car elle s'attend à ce que le filtre soit défini dans chaque module enfant ... Y at-il un moyen simple de le faire? ?

Répondre

4

This answer décrit comment étendre les propriétés-maven-plugin pour permettre aux fichiers de propriétés d'être partagés entre les projets. Si vous utilisez ce plugin, les propriétés seront mises à la disposition de la construction, et peuvent donc être utilisées lors du filtrage des ressources. Alternativement, vous pouvez spécifier un fichier de filtre en tant qu'artefact attaché sur une construction, afin qu'il soit disponible dans le référentiel, puis utiliser le plugin de dépendance pour télécharger le fichier de filtre, enfin spécifier que le filtre utilise le fichier partagé.

Pour fixer le filtre à votre génération parent, utilisez le but de joindre build-helper-maven-plugin:

<plugin> 
    <groupId>org.codehaus.mojo</groupId> 
    <artifactId>build-helper-maven-plugin</artifactId> 
    <version>1.3</version> 
    <executions> 
     <execution> 
     <id>attach-artifacts</id> 
     <phase>package</phase> 
     <goals> 
      <goal>attach-artifact</goal> 
     </goals> 
     <configuration> 
      <artifacts> 
      <artifact> 
       <file>src/main/resources/shared-filter.properties</file> 
       <type>properties</type> 
       <classifier>filter</classifier> 
      </artifact> 
      </artifacts> 
     </configuration> 
     </execution> 
    </executions> 
    </plugin> 

Lorsque le projet d'accueil du filtre est déployé, le filtre sera maintenant attaché à côté.

Pour télécharger le fichier de filtre dans votre projet, utilisez l'objectif copie-dépendances de maven-dependency-plugin pour télécharger le fichier:

<plugin> 
    <artifactId>maven-dependency-plugin</artifactId> 
    <executions> 
     <execution> 
     <id>copy</id> 
     <phase>generate-sources</phase> 
     <goals> 
      <goal>copy</goal> 
     </goals> 
     <configuration> 
      <artifactItems> 
      <artifactItem> 
       <groupId>name.seller.rich</groupId> 
       <artifactId>shared</artifactId> 
       <version>1.0.0</version> 
       <classifier>filter</classifier> 
       <type>properties</type> 
       <overWrite>false</overWrite> 
       <destFileName>shared-filter.properties</destFileName> 
      </artifactItem> 
      </artifactItems> 
      <outputDirectory> 
      ${project.build.directory}/filters 
      </outputDirectory> 
     </configuration> 
     </execution> 
    </executions> 
    </plugin> 

Si la configuration du plug-in de dépendance est définie dans votre projet parent, tous les autres projets peuvent hérite de la configuration et n'aura pas besoin de la redéfinir.

Ensuite, utiliser le filtre téléchargé:

<filters> 
    <filter>${project.build.directory}/filters/shared-filter.properties</filter> 
</filters> 
<resources> 
    <resource> 
    <directory>src/main/resources</directory> 
    <filtering>true</filtering> 
    </resource> 
</resources> 
+0

+1 Bonne réponse Rich. Jamais entendu parler de cela: http://www.mail-archive.com/[email protected]/msg00202.html? –

+0

Merci Rich, ça devrait marcher pour moi. Pas tout à fait aussi simple que j'avais espéré bien :) – David

+0

J'ai essayé la solution ci-dessus, cela fonctionne partiellement. quand j'essaye de faire mvn install il copie les ressources mais à la fin il essaye aussi de les déployer dans le dépôt et pendant ce temps il cherche la ressource dans src/main/resource du sous-module et j'obtiens l'exception suivante – user373201

4

Je ne sais pas si cela est une option, mais, au lieu de définir les propriétés dans un fichier externe, vous pouvez également les définir dans la section des propriétés de votre pom.xml et vous obtiendrez le même effet:

<project> 
    ... 
    <properties> 
    <my.filter.value>hello</my.filter.value> 
    </properties> 
</project> 

Ainsi, la définition <properties> dans la pom-mère devrait vous permettre de filtrer les modules enfants facilement.

+0

+1 pour l'approche simple –

0

vous pouvez également partager le filtre en utilisant un chemin absolu pour le filtre de votre parent pom.xml

Puisque le chemin est fonction de l'environnement (eclipse windows/linux eclipse/buildserver) vous pouvez mettre le préfixe de chemin ou une partie dans les paramètres.Profil xml

Questions connexes