web-dev-qa-db-fra.com

Maven - installation d'artefacts dans un référentiel local dans l'espace de travail

J'aimerais avoir une manière dans laquelle "mvn install" mette les fichiers dans un dossier du référentiel sous la racine de mon source (extraction), tout en utilisant des dépendances tierces à partir de ~/.m2/repository. 

Ainsi, après 'mvn install', la disposition est la suivante:

/work/project/
    repository
      com/example/foo-1.0.jar
      com/example/bar-1.0.jar
    foo
      src/main/Java
    bar
      src/main/Java

~/.m2/repository
    log4j/log4j/1.2/log4j-1.2.jar

(En particulier,/work/project/repository ne contient pas log4j)

Dans l'essense, je cherche un moyen de créer un référentiel composite qui référence d'autres référentiels

Mon intention est de pouvoir avoir plusieurs extractions de la même source et de travailler sur chacune d'elles sans se remplacer mutuellement dans le référentiel local avec 'install'. Plusieurs caisses peuvent être dues au fait de travailler sur différentes branches de cvs/svn mais dans mon cas, cela est dû au clonage de la branche principale dans git (dans git, chaque clone est semblable à une branche). Je n'aime pas les alternatives qui consistent à utiliser une version/un classificateur spécial par commande ou à tout réinstaller (reconstruire) à chaque changement. 

19
IttayD

Maven peut rechercher plusieurs référentiels (local, distant, "faux" distant) pour résoudre les dépendances, mais il n'y a queONEréférentiel local où les artefacts sont installés pendant install. Ce serait un véritable cauchemar d'installer des artefacts dans des emplacements spécifiques et de maintenir cette liste sans rien casser, cela ne fonctionnerait tout simplement pas, vous ne voulez pas faire cela. 

Mais, TBH, je ne comprends pas le point. Alors, pourquoi veux-tu faire ça? Il peut exister des solutions alternatives beaucoup plus simples, telles que l’installation de vos artefacts dans le référentiel local, puis leur copie à la racine du projet. Pourquoi ça ne marcherait pas? J'aimerais vraiment connaître l'intention finale cependant.

UPDATE: Après avoir lu la mise à jour de la question initiale, la seule solution à laquelle je puisse penser (étant donné que vous ne voulez pas utiliser différentes versions/balises) serait d'utiliser deux référentiels locaux et de basculer entre eux ( très sujettes aux erreurs cependant). 

Pour ce faire, utilisez différents comptes d'utilisateur (le référentiel local étant par défaut spécifique à l'utilisateur).

Ou mettez à jour votre ~/.m2/settings.xml chaque fois que vous souhaitez passer:

<settings xmlns="http://maven.Apache.org/SETTINGS/1.0.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.Apache.org/SETTINGS/1.0.0
                      http://maven.Apache.org/xsd/settings-1.0.0.xsd">
  <localRepository>${user.home}/.m2/repository</localRepository>
  <!--localRepository>${user.home}/.m2/repository2</localRepository-->
  ...
</settings>

Ou ayez un autre settings.xml et pointez dessus en utilisant l'option --settings:

mvn install --settings /path/to/alternate/settings.xml

Ou spécifiez l'emplacement de remplacement sur la ligne de commande à l'aide de l'option -Dmaven.repo.local:

mvn -Dmaven.repo.local=/path/to/repo

Comme je le disais, toutes ces solutions sont sujettes aux erreurs, et aucune d’elles n’est très satisfaisante. Même si vous avez de très bonnes raisons de travailler sur plusieurs branches en parallèle, votre cas d'utilisation (ne pas tout reconstruire) n'est pas très courant. Ici, l’utilisation de comptes d’utilisateurs distincts est peut-être la solution la moins défavorable à l’OMI.

29
Pascal Thivent

Pour info: les liens symboliques fonctionnent dans Windows7 et supérieur, ce genre de chose est facile à réaliser si tout votre code est placé au même endroit dans le référentiel local, à savoir/com/myco /.

tapez mklink pour plus de détails

0
teknopaul

Ceci est possible avec la ligne de commande et est en fait très utile. Par exemple, si vous souhaitez créer un dépôt supplémentaire dans votre projet Eclipse, vous devez simplement:

mvn install:install-file -DlocalRepositoryPath=repo \
   -DcreateChecksum=true -Dpackaging=jar \
   -Dfile=%2 -DgroupId=%3 -DartifactId=%4 -Dversion=%5

C'est le paramètre "localRepositoryPath" qui dirigera votre installation vers le référentiel local de votre choix.

Je l'ai dans un fichier de commandes que je lance à partir de la racine de mon projet et il l'installe dans un répertoire "repo" de mon projet (d'où les paramètres%). Alors, pourquoi voudriez-vous faire cela? Eh bien, disons que vous êtes un consultant en services professionnels et que vous vous rendez régulièrement chez des clients où vous êtes obligés d'utiliser leurs ordinateurs portables sécurisés. Vous copiez votre projet autonome sur leur ordinateur portable à partir d'une clé USB, et vous pouvez faire votre travail sans problème.

En règle générale, si vous utilisez VOTRE ordinateur portable, il est logique d’avoir un seul dépôt local qui contient tout. Mais pour vous qui êtes arrogant et qui dites des choses du genre "Pourquoi voudriez-vous faire cela", j’ai quelques nouvelles ... le monde est un endroit plus vaste avec plus d’options que vous ne le pensez. Si vous utilisez des ordinateurs portables qui ne vous appartiennent PAS et que vous devez construire votre projet sur cet ordinateur portable, obtenir l'artefact obtenu, puis supprimer le répertoire de votre projet (et le référentiel local que vous venez d'utiliser), c'est la voie à suivre.

Pour ce qui est de la raison pour laquelle vous souhaitez avoir deux dépôts locaux, le référentiel .m2/par défaut indique où sont stockées les tâches standard des entreprises, et le dépôt local "dans le projet" indique votre tâche.

0
Ken Kopelson

Cela n'est pas possible avec le client en ligne de commande, mais vous pouvez créer des structures de référentiel plus complexes avec un serveur de référentiel Maven tel que Nexus .

La raison pour laquelle ce n’est pas possible est que Maven autorise l’imbrication de projets et que la plupart d’entre eux se référencent. Par conséquent, l’installation de chaque artefact dans un référentiel différent donnerait lieu à de nombreuses recherches sur votre disque dur local construire dans un sous-projet).

0
Aaron Digulla