2009-09-01 4 views
7

j'ai défini un miroir local pour tous les dépôts dans le fichier settings.xml:Maven ne remplace pas une variable dans « settings.xml » quand il est invoqué

<mirror> 
    <id>myMirror</id> 
    <mirrorOf>*</mirrorOf> 
    <url>file://${mypath}/maven/.m2/repository</url> 
</mirror> 

Je veux que mon miroir pour pointer vers un chemin local, dans ce cas, le chemin est:

file://${mypath}/maven/.m2/repository 

Où $ {} monchemin est une variable que je passe quand j'invoque Maven:

mvn -Dmypath="/D:/test" package 

Le problème est que Maven ne remplace pas la variable lorsqu'elle est invoquée. Je peux voir que cette erreur se passe par l'inspection du journal de construction. Par exemple, Maven signale qu'il est en train de télécharger un fichier à partir du fichier: // $ {mypath} /maven/.m2/repository lorsque le fichier correct est: /// D: /test/maven/.m2/repository.

J'ai également noté que Maven remplace correctement ma variable lorsqu'elle est insérée dans la balise enfant url de la balise référentiel:

<repository> 
     <id>central</id> 
     <url>http://${mypath}/maven/.m2/repository</url> 
</repository> 

La construction fonctionne correctement lorsque je remplace la variable dans mon settings.xml par l'URL complète comme dans l'exemple ci-dessous:

<mirror> 
     <id>myMirror</id> 
     <mirrorOf>*</mirrorOf> 
     <url>file:///D:test/maven/.m2/repository</url> 
</mirror> 

Répondre

11

La substitution de propriétés dans settings.xml ne fonctionne pas comme prévu. Il remplacera les propriétés à l'intérieur de l'élément profiles (comme vous l'avez vu, il se substitue à l'URL de votre référentiel, qui sera définie dans un profil), mais pas aux éléments en dehors des profils (comme vous l'avez vu dans le section des miroirs). Ce distinction est créé car l'élément de profil dans le fichier settings.xml est une version tronquée de l'élément de profil pom.xml. C'est un mécanisme permettant de configurer la configuration dans votre POM, donc la substitution de propriété est autorisée dans les éléments de profils puisqu'ils font effectivement partie du POM.

Les parties des paramètres en dehors de l'élément profiles représentent la configuration de la plate-forme, elles ne sont pas censées être affectées par des générations individuelles, elles ne sont donc pas remplacées par les propriétés de ligne de commande. Cela a du sens, mais n'est vraiment clair nulle part.

EDIT: dans the settings page de la documentation mavens, dans la dernière phrase de la section d'aperçu rapide (tout à fait caché), il déclare:

Notez que les propriétés définies dans les profils au sein du settings.xml ne peuvent pas être utilisés pour l'interpolation.


Il existe une solution bien, vous pouvez remplacer variables d'environnement dans le settings.xml.Si vous définissez la variable d'environnement:

set M2_MIRROR=D:\test 

et configurer l'URL du référentiel comme suit:

<url>file://${M2_MIRROR}/maven/.m2/repository</url> 

Invoquez ensuite Maven comme normal, la variable d'environnement est substitué et votre construction devrait fonctionner selon les besoins.

+1

N'est-ce pas supposé être '$ {env.M2_MIRROR}'. – OrangeDog

0

Il est probablement un bug - malheureusement remplacement de la propriété ne semble pas être cohérente dans les plugins Maven. J'ai moi-même rencontré un bug en spécifiant plus de deux propriétés dans un élément de configuration dans un autre plugin.

1

Le paramètre settings.xml n'est pas interpolé comme le pom l'est, donc la propriété ne peut pas être utilisée comme indiqué ci-dessus.

+0

Oui, c'est possible. Comme je l'ai dit dans la question, j'ai pu insérer la variable dans la balise url imbriquée dans la balise du référentiel. Notez que ce tag de référentiel que j'ai mentionné se trouve dans le fichier 'settings.xml' et non dans un fichier pom. –

+0

Désolé j'ai mal lu. La partie de profil est interpolée mais tous les paramètres de base ne sont pas, par exemple, il ne fonctionne pas bien si vous essayez d'utiliser une propriété pour votre référentiel local non plus. –

+0

Ceci est correct, mais il n'est pas clair d'après votre réponse pourquoi vous ne pouvez pas définir les propriétés en dehors de l'élément profiles, j'ai essayé d'élaborer avec ma réponse –

2

C'est une vieille question maintenant, mais de Maven 3, et probablement avant, vous pouvez vous référer à l'environnement vars, si vous préfixe « env »

Je fais comme ceci:

<localRepository>${env.M2_LOCAL_REPO}</localRepository> 

Ensuite, chaque développeur définit M2_LOCAL_REPO à un emplacement approprié.

Questions connexes