Spécification de l'emplacement du référentiel local de Maven en tant que paramètre CLI

131

Est-il possible de définir l'emplacement du référentiel Maven local comme argument sur la ligne de commande Maven?

Le problème est que je n'utilise pas celui par défaut dans ~/.m2/repository. Cependant, j'ai vérifié un projet en cours de construction avec ses propres paramètres avec -s settings.xml. Ce settings.xml ne spécifie pas mon référentiel local, donc Maven utilise à ~/.m2/repositorynouveau utilise ... Je voudrais utiliser un emplacement de référentiel local autre que celui par défaut sans avoir à ajouter un <localRepository>élément dans les paramètres du projet.xml

J'ai essayé

  • -DlocalRepository="..."
  • $mvn invoker:run -s settings.xml clean install -DskipTests -DlocalRepositoryPath=
  • -Dsettings.localRepository

mais aucune de ces options ne fonctionne.

Je pense donc que je dois décider si je vais modifier un tiers settings.xml ou déplacer mon dépôt local vers ~

lisak
la source
Ce n'est évidemment pas de votre faute, mais les projets Maven ne devraient pas fournir un fichier settings.xml. Voir maven.apache.org/guides/mini/guide-configuring-maven.html
oberlies

Réponses:

258

utiliser la propriété maven maven.repo.local:

mvn -Dmaven.repo.local=$HOME/.my/other/repository clean install

Aucune modification settings.xmln'est nécessaire.

Petr Kozelka
la source
10
Le référentiel local doit être un chemin absolu, maven.apache.org/guides/mini/guide-configuring-maven.html .
luka5z
3
Sous Windows, utilisez `mvn -D" maven.repo.local "=% USER_HOME% /. My / other / repository clean
install`
Puis-je définir une variable d'environnement pour obtenir la même chose?
poudre366
@ Powder366 no, AFAIK
Petr Kozelka
En utilisant maven-3.6.3, le répertoire du référentiel local fonctionne comme un chemin relatif (au moins sur MacOS)
Ed Randall
8

Pour git:

alias mvn='mvn "-Dmaven.repo.local=$(git rev-parse --show-toplevel)/.m2/repository"'

Cela utilise un référentiel maven séparé dans chaque référentiel git

Andrew Sherman
la source
2

Une sorte de méthode hacky qui fonctionnerait est:

  1. Ajouter <localRepository>${m2.localRepository}</localRepository>à votre settings.xml
  2. Dans votre mvn.sh ou mvn.bat, ajoutez -Dm2.localRepository=<full path to home dir>/.m2/repository avant le "$ @" dans la commande qui est exécutée. Cela permettra à votre dépôt local par défaut de rester là où il devrait être.
  3. Vous pouvez maintenant utiliser mvn -Dm2.localRepository=... <phases/goals>. Étant donné que votre propriété système de ligne de commande est ajoutée à la ligne de commande après celle du script mvn, elle sera prioritaire. (Au moins, je suis à peu près sûr que cela fonctionne de cette façon sur Windows et Linux, mais les tests le diront.)
Ryan Stewart
la source
Cela n'aide pas, j'ai ajouté -Dm2.localRepository = "custom" avant "$ @" dans le script mvn, utilise toujours ~ / .m2 / repository ... puis j'ai également inclus -Dm2.localRepository = "custom" lors de l'exécution $ mvn, utilise toujours ~ / .m2 / repository ... simplement sans l'élément localRepository dans le settings.xml, il n'y a aucun moyen de le changer
lisak
@lisak: Avez-vous effectué l'étape 1 d'ajout de l'élément localRepository au settings.xml? J'ai testé cela, et cela fonctionne, sauf que vous ne pouvez pas utiliser l'alias '~' dans le script mvn. Vous devez mettre un chemin absolu, bien que vous puissiez probablement faire une autre astuce de script shell / batch pour contourner cela.
Ryan Stewart
Cela fonctionne, mais je n'ai vraiment pas d'explication ... Si je déclare localRepository dans $ M2_HOME / conf / settings.xml sans l'étape 2, il est remplacé par -s settings.xml et ne fonctionne pas, bien qu'à l'étape 2 cela fonctionne ... mais seule l'étape 2 sans localRepository dans $ M2_HOME / conf / settings.xml ne fonctionne pas ... les deux étapes 1, 2 doivent être appliquées pour que cela fonctionne et je peux même changer l'emplacement via $ mvn -Dm2.localRepository = .. merci Ryan
lisak