Указание местоположения локального репозитория Maven в качестве параметра CLI

131

Можно ли указать расположение локального репозитория Maven в качестве аргумента в командной строке Maven?

Дело в том, что я не использую в ~/.m2/repository. Однако я проверил некоторые проекты, которые создаются с собственными настройками с помощью -s settings.xml. В этом файле settings.xml не указан мой локальный репозиторий, поэтому Maven ~/.m2/repositoryснова использует использует ... Я хотел бы использовать расположение локального репозитория, отличное от стандартного, без необходимости добавлять <localRepository>элемент в файл settings.xml проекта.

я пробовал

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

но ни один из этих вариантов не работает.

Поэтому я думаю, что мне нужно решить, буду ли я изменять сторонний файл settings.xml или перемещать локальное репо в ~

Лысак
источник
Очевидно, что это не ваша вина, но проекты Maven не должны предоставлять settings.xml. См. Maven.apache.org/guides/mini/guide-configuring-maven.html
oberlies

Ответы:

258

использовать свойство maven maven.repo.local:

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

Никаких изменений settings.xmlне требуется.

Петр Козелка
источник
10
К локальному репозиторию должен быть указан абсолютный путь, maven.apache.org/guides/mini/guide-configuring-maven.html .
luka5z
3
В Windows используйте `mvn -D" maven.repo.local "=% USER_HOME% /. My / other / repository clean
install`
Могу ли я установить переменную среды, чтобы добиться того же?
Powder366
@ Powder366 нет, AFAIK
Петр
При использовании maven-3.6.3 каталог локального репозитория работает как относительный путь (по крайней мере, на MacOS)
Эд Рэндалл,
8

Для git:

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

Это использует отдельный репозиторий maven в каждом репозитории git

Эндрю Шерман
источник
2

Один из хакерских способов, который может сработать:

  1. Добавьте <localRepository>${m2.localRepository}</localRepository>в свой settings.xml
  2. В вашем mvn.sh или mvn.bat добавьте -Dm2.localRepository=<full path to home dir>/.m2/repository перед "$ @" в выполняемой команде. Это заставит ваше локальное репо по умолчанию оставаться там, где оно должно быть.
  3. Теперь можно использовать mvn -Dm2.localRepository=... <phases/goals>. Поскольку системное свойство командной строки добавляется в командную строку после свойства в сценарии mvn, оно будет иметь приоритет. (По крайней мере, я почти уверен, что это работает как в Windows, так и в Linux, но тестирование покажет.)
Райан Стюарт
источник
Это не помогает, я добавил -Dm2.localRepository = "custom" перед "$ @" в сценарий mvn, по-прежнему использует ~ / .m2 / repository ... затем я также включил -Dm2.localRepository = "custom" при запуске $ mvn, по-прежнему использует ~ / .m2 / repository ... просто без элемента localRepository в settings.xml его невозможно изменить
lisak
@lisak: Вы выполнили шаг 1 по добавлению элемента localRepository в settings.xml? Я протестировал это, и он работает, за исключением того, что вы не можете использовать псевдоним '~' в сценарии mvn. Вы должны ввести абсолютный путь, хотя вы, вероятно, могли бы использовать другие уловки оболочки / пакетного сценария, чтобы обойти это.
Райан Стюарт
Это работает, но у меня действительно нет объяснений ... Если я объявляю localRepository в $ M2_HOME / conf / settings.xml без шага 2, он переопределяется -s settings.xml и не работает, хотя с шагом 2 он работает ... но только шаг 2 без localRepository в $ M2_HOME / conf / settings.xml не работает ... для его работы должны быть применены оба шага 1,2, и я даже могу изменить местоположение затем через $ mvn -Dm2.localRepository = .. спасибо, Райан
lisak