115 votes

Propriété Maven2 qui indique le répertoire parent

J'ai un projet multi-modules, comme celui-ci :

main-project/
    module1/
    module2/
        sub-module1/
        sub-module2/
        sub-module3/
        ...
    module3/
    module4/
    ...

J'ai besoin de définir un ensemble de propriétés (qui dépendent de l'environnement sur lequel je veux libérer mon projet) dans Maven2. Je n'utiliserai pas <properties> car il y a beaucoup de propriétés... Ainsi, j'utilise le Propriétés du plugin Maven2 .

Les fichiers de propriétés sont situés dans le répertoire main-project/ répertoire. Comment puis-je définir le bon répertoire dans le pom.xml principal, afin de spécifier à tous les enfants où trouver le fichier de propriétés ?

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>properties-maven-plugin</artifactId>
    <version>1.0-alpha-1</version>
    <executions>
        <execution>
            <phase>initialize</phase>
            <goals>
                <goal>read-project-properties</goal>
            </goals>
            <configuration>
                <files>
                    <file>???/env_${env}.properties</file>
                </files>
            </configuration>
        </execution>
    </executions>
</plugin>

Si je ne mets que <file>env_${env}.properties</file> alors, lorsque Maven2 compilera le premier module, il ne trouvera pas la balise main-project/env_dev.properties fichier. Si je règle <file>../env_${env}.properties</file> alors une erreur sera levée au niveau du parent, ou à tout niveau de sous-module...

2 votes

Il suffit d'utiliser ${maven.multiModuleProjectDirectory}

180voto

Clay Points 1065

Essayez de définir une propriété dans chaque pom pour trouver le répertoire principal du projet.

Dans le parent :

<properties>
    <main.basedir>${project.basedir}</main.basedir>
</properties>

Chez les enfants :

<properties>
    <main.basedir>${project.parent.basedir}</main.basedir>
</properties>

Dans les petits-enfants :

<properties>
    <main.basedir>${project.parent.parent.basedir}</main.basedir>
</properties>

0 votes

Même si cette solution n'est pas parfaite (je dois définir cette propriété dans chaque pom.xml), elle ne nécessite aucun plugin supplémentaire, et est assez simple ! Merci pour cette idée.

20 votes

Ces propriétés préétablies ont-elles été supprimées ? ${parent.basedir} ne donne plus rien en 3.0.4...

9 votes

Ouais, ça ne marche pas. ${projet.parent.basedir} est évalué à null.

15voto

romaintaz Points 32120

J'ai trouvé une solution pour résoudre mon problème : je recherche les fichiers de propriétés en utilisant le plugin Groovy Maven.

Comme mon fichier de propriétés est nécessairement dans le répertoire courant, dans ../ ou dans ../.., j'ai écrit un petit code Groovy qui vérifie ces trois dossiers.

Voici l'extrait de mon pom.xml :

<!-- Use Groovy to search the location of the properties file. -->
<plugin>
    <groupId>org.codehaus.groovy.maven</groupId>
    <artifactId>gmaven-plugin</artifactId>
    <version>1.0-rc-5</version>
    <executions>
        <execution>
            <phase>validate</phase>
            <goals>
                <goal>execute</goal>
            </goals>
            <configuration>
                <source>
                    import java.io.File;
                    String p = project.properties['env-properties-file'];
                    File f = new File(p); 
                    if (!f.exists()) {
                        f = new File("../" + p);
                        if (!f.exists()) {
                            f = new File("../../" + p);
                        }
                    }
                    project.properties['env-properties-file-by-groovy'] = f.getAbsolutePath();
            </source>
            </configuration>
        </execution>
    </executions>
</plugin>
<!-- Now, I can load the properties file using the new 'env-properties-file-by-groovy' property. -->
<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>properties-maven-plugin</artifactId>
    <version>1.0-alpha-1</version>
    <executions>
        <execution>
            <phase>initialize</phase>
            <goals>
                <goal>read-project-properties</goal>
            </goals>
            <configuration>
                <files>
                    <file>${env-properties-file-by-groovy}</file>
                </files>
            </configuration>
        </execution>
    </executions>
</plugin>

Cela fonctionne, mais je n'aime pas vraiment ça.

Donc, si vous avez une meilleure solution, n'hésitez pas à la poster !

12voto

Jared Points 698

Le problème tel que je le vois est que vous ne pouvez pas obtenir le chemin absolu d'un répertoire parent dans maven.

<br /> J'ai entendu parler de ça comme d'un anti-modèle. mais pour chaque anti-modèle, il existe un cas d'utilisation réel et légitime, et j'en ai assez que maven me dise que je ne peux suivre que leurs modèles. </rant>

La solution que j'ai trouvée est donc d'utiliser antrun. Essayez ceci dans le pom.xml de l'enfant :

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-antrun-plugin</artifactId>
    <version>1.7</version>
    <executions>
        <execution>
            <id>getMainBaseDir</id>
            <phase>validate</phase>
            <goals>
                <goal>run</goal>
            </goals>
            <configuration>
                <exportAntProperties>true</exportAntProperties>
                <target>
                    <!--Adjust the location below to your directory structure -->
                    <property name="main.basedir" location="./.." />
                    <echo message="main.basedir=${main.basedir}"/>
                </target>
            </configuration>
        </execution>
    </executions>
</plugin>

Si vous exécutez mvn verify vous devriez voir quelque chose comme ceci :

main:
     [echo] main.basedir=C:\src\parent.project.dir.name

Vous pouvez alors utiliser ${main.basedir} dans l'un des autres plugins, etc. J'ai mis du temps à trouver cette solution, j'espère que cela aidera quelqu'un d'autre.

0 votes

Comment puis-je le transmettre à maven-surefire-plugin ?

5voto

user1774153 Points 21

Dans mon cas, cela fonctionne comme suit :

...
<properties>
  <main_dir>${project.parent.relativePath}/..</main_dir>
</properties>
...

<plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>properties-maven-plugin</artifactId>
        <version>1.0-alpha-1</version>
        <executions>
          <execution>
            <phase>initialize</phase>
            <goals>
              <goal>read-project-properties</goal>
            </goals>
            <configuration>
              <files>
                 <file>${main_dir}/maven_custom.properties</file>
              </files>
            </configuration>
          </execution>
        </executions>
</plugin>

5voto

Vic Points 862

Le petit profil suivant a fonctionné pour moi. J'avais besoin d'une telle configuration pour CheckStyle, que j'ai mise dans le fichier config dans la racine du projet, de sorte que je puisse l'exécuter à partir du module principal et des sous-modules.

<profile>
    <id>root-dir</id>
    <activation>
        <file>
            <exists>${project.basedir}/../../config/checkstyle.xml</exists>
        </file>
    </activation>
    <properties>
        <project.config.path>${project.basedir}/../config</project.config.path>
    </properties>
</profile>

Cela ne fonctionnera pas pour les modules imbriqués, mais je suis sûr qu'il peut être modifié pour cela en utilisant plusieurs profils avec différents exists 's. (Je n'ai aucune idée de la raison pour laquelle il devrait y avoir "../ " dans la balise de vérification et juste " " dans la propriété surchargée elle-même, mais cela ne fonctionne que de cette façon).

0 votes

Je ne sais pas pourquoi cela fonctionne (le ../ supplémentaire) mais cela semble être la solution la plus propre (j'avais aussi des problèmes avec la configuration checkstyle.xml).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X