Especificando a localização do repositório local do Maven como um parâmetro da CLI

131

É possível definir o local do repositório local do Maven como argumento na linha de comando do Maven?

O problema é que eu não uso o padrão ~/.m2/repository. No entanto, verifiquei algum projeto que está sendo construído com suas próprias configurações -s settings.xml. Como o settings.xml não especifica meu repositório local, o Maven usa os usos ~/.m2/repositorynovamente ... Gostaria de usar um local não padrão do repositório local sem precisar adicionar um <localRepository>elemento no settings.xml do projeto

eu tentei

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

mas nenhuma dessas opções funciona.

Acho que tenho que decidir se modificarei o settings.xml de terceiros ou moverei meu repositório local para ~

lisak
fonte
Obviamente, isso não é culpa sua, mas os projetos do Maven não devem fornecer settings.xml. Veja maven.apache.org/guides/mini/guide-configuring-maven.html
Oberlies

Respostas:

258

use propriedade maven maven.repo.local:

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

Nenhuma modificação settings.xmlé necessária.

Petr Kozelka
fonte
10
O repositório local deve ser um caminho absoluto, maven.apache.org/guides/mini/guide-configuring-maven.html .
luka5z
3
No Windows, use `mvn -D" maven.repo.local "=% USER_HOME% /. My / other / repository clean
install`
Posso definir uma variável de ambiente para obter a mesma coisa?
powder366
@ powder366 não, AFAIK
Petr Kozelka
Usando o maven-3.6.3, o diretório do repositório local funciona como um caminho relativo (pelo menos no MacOS)
Ed Randall
8

Para git:

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

Isso usa um repositório maven separado em cada repositório git

Andrew Sherman
fonte
2

Um tipo de maneira hacky que funcionaria é:

  1. Adicione <localRepository>${m2.localRepository}</localRepository>às suas configurações.xml
  2. No seu mvn.sh ou mvn.bat, adicione -Dm2.localRepository=<full path to home dir>/.m2/repository antes do "$ @" no comando que é executado. Isso fará com que seu repositório local padrão permaneça onde deveria estar.
  3. Agora você pode usar mvn -Dm2.localRepository=... <phases/goals>. Como a propriedade do sistema de linha de comando é adicionada à linha de comando após a do script mvn, ela terá precedência. (Pelo menos, tenho certeza de que funciona dessa maneira no Windows e no Linux, mas o teste dirá.)
Ryan Stewart
fonte
Isso não ajuda, adicionei -Dm2.localRepository = "custom" antes de "$ @" no script mvn, ainda usa ~ / .m2 / repository ... então eu também incluí -Dm2.localRepository = "custom" ao executar $ mvn, ainda usa ~ / .m2 / repositório ... simplesmente sem elemento localRepository na settings.xml, não há nenhuma maneira de mudar isso
lisak
@lisak: Você fez o passo 1 de adicionar o elemento localRepository ao settings.xml? Eu testei isso e funciona, exceto que você não pode realmente usar o alias '~' no script mvn. Você precisa colocar um caminho absoluto, embora provavelmente possa fazer outros truques de shell / lote para contornar isso.
Ryan Stewart
Funciona, mas realmente não tenho explicação ... Se eu declarar localRepository em $ M2_HOME / conf / settings.xml sem a etapa 2, ele será substituído por -s settings.xml e não funcionará, embora na etapa 2 funciona ... mas apenas a etapa 2 sem localRepository em $ M2_HOME / conf / settings.xml não funciona ... as duas etapas 1,2 devem ser aplicadas para que funcione e eu posso alterar o local até $ mvn -Dm2.localRepository = .. obrigado Ryan
lisak