Especificar la ubicación del repositorio local de Maven como un parámetro CLI

131

¿Es posible establecer la ubicación del repositorio local de Maven como argumento en la línea de comando de Maven?

La cosa es que no uso el predeterminado en ~/.m2/repository. Sin embargo, revisé algunos proyectos que se están construyendo con su propia configuración -s settings.xml. Ese settings.xml no especifica mi repositorio local, por lo que Maven usa usos ~/.m2/repositorynuevamente ... Me gustaría usar una ubicación de repositorio local no predeterminada sin tener que agregar un <localRepository>elemento en settings.xml del proyecto

He intentado

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

pero ninguna de estas opciones funciona.

Así que creo que tengo que decidir si voy a modificar la configuración de un tercero.xml o mover mi repositorio local a ~

Lisak
fuente
Obviamente, esto no es tu culpa, pero los proyectos de Maven no deberían proporcionar un settings.xml. Ver maven.apache.org/guides/mini/guide-configuring-maven.html
oberlies

Respuestas:

258

usar propiedad maven maven.repo.local:

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

No hay modificaciones settings.xmlnecesarias.

Petr Kozelka
fuente
10
El repositorio local debe ser una ruta absoluta, maven.apache.org/guides/mini/guide-configuring-maven.html .
luka5z
3
En Windows use `mvn -D" maven.repo.local "=% USER_HOME% /. My / other / repository clean
install`
¿Puedo establecer una variable de entorno para lograr lo mismo?
polvo366
@ powder366 no, AFAIK
Petr Kozelka
Usando maven-3.6.3, el directorio de repositorio local funciona como una ruta relativa (al menos en MacOS)
Ed Randall
8

Para git:

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

Esto usa un repositorio maven separado en cada repositorio git

Andrew Sherman
fuente
2

Una forma hacky que funcionaría es:

  1. Agregar <localRepository>${m2.localRepository}</localRepository>a tu settings.xml
  2. En su mvn.sh o mvn.bat, agregue -Dm2.localRepository=<full path to home dir>/.m2/repository antes de "$ @" en el comando que se ejecuta. Esto hará que su repositorio local predeterminado permanezca donde debería estar.
  3. Ahora puedes usar mvn -Dm2.localRepository=... <phases/goals>. Debido a que la propiedad del sistema de línea de comando se agrega a la línea de comando después de la del script mvn, tendrá prioridad. (Al menos estoy bastante seguro de que funciona de esa manera tanto en Windows como en Linux, pero las pruebas lo dirán).
Ryan Stewart
fuente
Eso no ayuda, agregué -Dm2.localRepository = "custom" antes de "$ @" en el script mvn, todavía usa ~ / .m2 / repository ... luego también incluí -Dm2.localRepository = "custom" cuando ejecuté $ mvn, todavía usa ~ / .m2 / repository ... simplemente sin el elemento localRepository en settings.xml, no hay forma de cambiarlo
lisak
@lisak: ¿Hiciste el paso 1 de agregar el elemento localRepository a settings.xml? Probé esto, y funciona, excepto que en realidad no puedes usar el alias '~' en el script mvn. Tiene que poner una ruta absoluta, aunque probablemente podría hacer algún otro truco de script de shell / lote para evitar eso.
Ryan Stewart
Funciona, pero realmente no tengo explicación ... Si declaro localRepository en $ M2_HOME / conf / settings.xml sin el paso 2, se anula por -s settings.xml y no funciona, aunque con el paso 2 funciona ... pero solo el paso 2 sin localRepository en $ M2_HOME / conf / settings.xml no funciona ... ambos pasos 1,2 deben aplicarse para que funcione e incluso puedo cambiar la ubicación a través de $ mvn -Dm2.localRepository = .. gracias Ryan
lisak