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 souhaite publier mon projet) dans Maven2. Je n'utiliserai pas <properties>
car il y a beaucoup de propriétés ... Ainsi, j'utilise le plugin Properties Maven2 .
Les fichiers de propriétés se trouvent dans le 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 mets seulement <file>env_${env}.properties</file>
, alors quand Maven2 compile le premier module, il ne trouvera pas le main-project/env_dev.properties
fichier. Si je définis <file>../env_${env}.properties</file>
, une erreur sera générée au niveau du parent, ou à n'importe quel niveau de sous-module ...
la source
${maven.multiModuleProjectDirectory}
Réponses:
Essayez de définir une propriété dans chaque pom pour trouver le répertoire principal du projet.
Chez le parent:
Chez les enfants:
Chez les petits-enfants:
la source
${parent.basedir}
ne analyse plus rien dans la version 3.0.4 ...${project.basedir}/..
mais cela ne fonctionne vraiment que dans les projets multi-modules qui sont dans une hiérarchie de répertoires stricte.file.separator
variable comme ceci<main.basedir>${project.basedir}${file.separator}..</main.basedir>
Au moins dans la version actuelle de maven (3.6.0), vous pouvez utiliser
${maven.multiModuleProjectDirectory}
la source
Utilisez directory-maven-plugin avec le but directory-of .
Contrairement à d'autres suggestions:
Le plugin vous permet de définir une propriété de votre choix sur le chemin absolu de l'un des modules du projet. Dans mon cas, je l'ai défini sur le module racine ... Dans mon projet root pom:
Dès lors, $ {myproject.basedir} dans tout sous-module pom a toujours le chemin du module racine du projet. Et bien sûr, vous pouvez définir la propriété sur n'importe quel module, pas seulement la racine ...
la source
J'ai trouvé une solution pour résoudre mon problème: je recherche les fichiers de propriétés à l'aide du plugin Groovy Maven.
Comme mon fichier de propriétés est forcément dans le répertoire courant, en ../ ou en .. / .., j'ai écrit un petit code Groovy qui vérifie ces trois dossiers.
Voici l'extrait de mon pom.xml:
Cela fonctionne, mais je n'aime pas vraiment ça.
Alors, si vous avez une meilleure solution, n'hésitez pas à poster!
la source
Donc, le problème que je vois est que vous ne pouvez pas obtenir le chemin absolu vers un répertoire parent dans maven.
<rant> J'ai entendu parler de cela 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 marre des maven qui me disent que je ne peux que suivre leurs modèles. </ diatribe>
Donc le travail autour que j'ai trouvé était d'utiliser antrun. Essayez ceci dans le fichier enfant pom.xml:
Si vous exécutez,
mvn verify
vous devriez voir quelque chose comme ceci:Vous pouvez ensuite utiliser
${main.basedir}
n'importe lequel des autres plugins, etc. Il m'a fallu un certain temps pour comprendre cela, alors j'espère que cela aidera quelqu'un d'autre.la source
Une autre alternative:
dans le pom parent, utilisez:
Dans les enfants poms, vous pouvez référencer cette variable.
Mise en garde principale: cela vous oblige à toujours exécuter la commande à partir du répertoire pom parent principal. Ensuite, si vous souhaitez exécuter des commandes (test par exemple) uniquement pour un module spécifique, utilisez cette syntaxe:
test mvn - projets
La configuration de surefire pour paramétrer une variable "path_to_test_data" peut alors être:
la source
Le petit profil suivant a fonctionné pour moi. J'avais besoin d'une telle configuration pour CheckStyle, que j'ai placée dans le
config
répertoire à la racine du projet, afin de pouvoir l'exécuter à partir du module principal et des sous-modules.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
exists
des s différents . (Je ne sais pas pourquoi il devrait y avoir "../ .." dans la balise de vérification et juste ".." dans la propriété overriden elle-même, mais cela ne fonctionne que de cette manière.)la source
Dans mon cas, cela fonctionne comme ceci:
la source
J'ai trouvé une solution pour résoudre ce problème: utilisez $ {parent.relativePath}
la source
Vous êtes dans le projet C, le projet C est un sous-module de B et B est un sous-module de A. Vous essayez d'accéder au
src/test/config/etc
répertoire du module D à partir du projet C.D est également un sous-module de A. L'expression suivante permet d'obtenir le chemin URI:la source
la source
Dans une réponse à une autre question j'ai montré comment l'extension maven-properties-plugin pouvait être étendue pour utiliser des descripteurs de propriété externes définis dans les dépendances Maven.
Vous pouvez étendre cette idée pour avoir plusieurs fichiers JAR descripteurs, chacun avec le nom de l'environnement faisant partie de artifactId, contenant un $ {env} .properties. Ensuite, vous pouvez utiliser la propriété pour sélectionner le fichier jar et propriétés approprié, par exemple:
la source
Je viens d'améliorer le script groovy ci-dessus pour écrire la propriété dans le fichier de propriétés parent racine:
la source
Je pense que si vous utilisez le modèle d'extension utilisé dans l'exemple pour le plugin findbugs & multimodule, vous pourrez peut-être définir des propriétés globales liées aux chemins absolus. Il utilise un haut
exemple pour multi module
Le pom de niveau supérieur a un projet build-config indépendant et un parent d'application pour les modules du projet multimodule. L'app-parent utilise l'extension pour se lier au projet build-config et en obtenir des ressources. Ceci est utilisé pour transporter les fichiers de configuration communs vers les modules. Cela peut également être un canal pour les propriétés. Vous pouvez écrire le répertoire supérieur dans un fichier de propriétés consommé par build-config. (cela semble trop complexe)
Le problème est qu'un nouveau niveau supérieur doit être ajouté au projet multi-module pour que cela fonctionne. J'ai essayé de m'éloigner d'un projet de configuration de construction vraiment sans rapport, mais il était baveux et semblait fragile.
la source
Cela étend la réponse de romaintaz, qui est géniale en ce qu'elle résout le problème et souligne également clairement la fonctionnalité manquante de maven. J'ai choisi une version ultérieure du plugin et ajouté le cas où le projet pouvait avoir plus de 3 niveaux de profondeur.
J'ai choisi de ne pas utiliser de propriété pour définir le nom de fichier. Notez que si le build.properties n'est pas trouvé, cela tournera pour toujours. J'ai ajouté une détection de répertoire .git, mais je ne voulais pas trop compliquer la réponse afin qu'elle ne soit pas affichée ici.
la source
J'avais besoin de résoudre un problème similaire pour le référentiel local placé dans le projet principal du projet multi-module. Essentiellement, le vrai chemin était
${basedir}
/ lib. Enfin, j'ai réglé cela dans monparent.pom
:Cela
basedir
montre toujours au module local actuel, il n'y a aucun moyen d'obtenir le chemin vers le projet "maître" (la honte de Maven). Certains de mes sous-modules sont un répertoire plus profond, certains sont deux répertoires plus profonds, mais tous sont des sous - modules directs du parent qui définit l'URL du dépôt.Cela ne résout donc pas le problème en général. Vous pouvez toujours le combiner avec la réponse acceptée de Clay et définir une autre propriété - fonctionne bien et doit être redéfini uniquement pour les cas où la valeur de
parent.pom
n'est pas assez bonne. Ou vous pouvez simplement reconfigurer le plugin - ce que vous ne faites que dans les artefacts POM (parents d'autres sous-modules). La valeur extraite dans la propriété est probablement meilleure si vous en avez besoin à plus d'endroits, en particulier lorsque rien dans la configuration du plugin ne change.Utiliser
basedir
dans la valeur était la partie essentielle ici, car l'URLfile://${project.parent.relativePath}/lib
ne voulait pas faire l'affaire (j'ai supprimé une barre oblique pour la rendre relative). Utiliser une propriété qui me donne un bon chemin absolu, puis en sortir relatif était nécessaire.Lorsque le chemin n'est pas une URL / URI, ce n'est probablement pas un problème à supprimer
basedir
.la source
J'ai accédé au répertoire ci-dessus en utilisant $ {basedir} .. \ src \
la source
sub-module1
, il pointera sur le répertoire demodule2
, pas sur lemain-project
.Avez-vous essayé
../../env_${env}.properties
?Normalement, nous faisons ce qui suit lorsque module2 est au même niveau que les sous-modules
Je pense que le ../ .. vous permettrait de monter de deux niveaux. Sinon, vous pouvez contacter les auteurs du plug-in et voir s'il s'agit d'un problème connu.
la source