Подтвердить что ты не робот

Maven - установка артефактов в локальный репозиторий в рабочем пространстве

Я хотел бы иметь способ, с помощью которого "mvn install" помещает файлы в папку репозитория под моим корневым источником (checkout), при использовании сторонних зависимостей из ~/.m2/repository.

Итак, после установки "mvn install" макет:

/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

(В частности, /work/project/repository не содержит log4j)

В сущности, я ищу способ создания составного репозитория, который ссылается на другие репозитории

Мое намерение состоит в том, чтобы иметь возможность иметь несколько проверок одного и того же источника и работать над каждым, не переписывая друг друга в локальном репозитории с помощью "install". Несколько проверок могут быть из-за работы в разных ветвях в cvs/svn, но в моем случае это связано с клонированием ведущей ветки в git (в git каждый клон похож на ветвь). Мне не нравятся альтернативы, которые должны использовать специальную версию/классификатор для каждой проверки или переустанавливать (перестраивать) все при каждом переключении.

4b9b3361

Ответ 1

Maven может искать несколько репозиториев (локальный, удаленный, "поддельный" удаленный) для разрешения зависимостей, но существует только ОДИН локальный репозиторий, где артефакты устанавливаются во время install. Было бы настоящим кошмаром устанавливать артефакты в определенные места и поддерживать этот список, не нарушая ничего, что просто не сработало бы, вы не хотите этого делать.

Но, TBH, я не понимаю. Итак, почему вы хотите это сделать? Могут быть альтернативные и более простые решения, такие как установка ваших артефактов в локальном репозитории, а затем их копирование под вашим корнем проекта. Почему бы не работать? Я действительно хотел бы узнать окончательное намерение, хотя.

ОБНОВЛЕНИЕ:. Прочитав обновление исходного вопроса, единственным решением, о котором я могу думать (учитывая, что вы не хотите использовать разные версии/теги), было бы использование двух локальных репозиториев и переключаться между ними (очень склонна к ошибкам).

Для этого используйте либо разные учетные записи пользователей (поскольку локальный репозиторий по умолчанию задан пользователем).

Или обновляйте свой ~/.m2/settings.xml каждый раз, когда вы хотите переключиться:

<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>

Или используйте еще один settings.xml и укажите его с помощью параметра --settings:

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

Или укажите альтернативное местоположение в командной строке с помощью параметра -Dmaven.repo.local:

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

Эти решения все подвержены ошибкам, как я сказал, и ни одна из них не очень удовлетворительна. Даже если у вас могут быть очень веские причины для работы в нескольких ветких параллельно, ваш прецедент (а не перестройка всего) не очень распространен. Здесь, используя различные учетные записи пользователей, это меньшее решение IMO.

Ответ 2

Это невозможно для клиента командной строки, но вы можете создавать более сложные макеты репозитория с сервером репозитория Maven, например Nexus.

Причина, по которой это невозможно, заключается в том, что Maven позволяет встраивать проекты, и большинство из них будут ссылаться друг на друга, поэтому установка каждого артефакта в другом репозитории приведет к большому количеству поисков на вашем локальном жестком диске (или в случае сбоев, когда вы начинаете сборку в подпроекте).

Ответ 3

FYI: символические ссылки работают в Windows7 и выше, поэтому этого легко достичь, если весь ваш код находится в одном месте в локальном репо, i.e/com/myco/.

тип mklink для деталей

Ответ 4

Это возможно с помощью командной строки, и на самом деле это очень полезно. Например, если вы хотите создать дополнительное репо в своем проекте Eclipse, вы просто выполните:

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

Это параметр localRepositoryPath, который будет перенаправлять вашу установку на любой локальный репозиторий, который вы хотите.

У меня это в пакетном файле, который я запускаю из моего корня проекта, и он устанавливает файл в каталог "repo" в моем проекте (следовательно, параметры%). Так почему вы хотите это сделать? Ну, позвольте вам сказать, что вы консультант по профессиональным услугам, и вы регулярно посещаете места, где вы вынуждены использовать свои защищенные ноутбуки. Вы копируете свой автономный проект на свой ноутбук с USB-накопителя, а престо, вы можете сделать свою сборку maven без проблем.

Как правило, если вы используете свой ноутбук, тогда имеет смысл иметь одно локальное репо, в котором есть все. Но для вас, кто стал дерзким и сказал такие вещи, как "зачем вы хотите это сделать", у меня есть новости... мир - это более крупное место с большим количеством вариантов, чем вы могли бы понять. Если вы используете ноутбуки, которые не являются вашими, и вам нужно создать свой проект на этом ноутбуке, получить полученный артефакт, а затем удалить каталог проекта (и локальное репо, которое вы только что использовали), это путь.

Что касается того, почему вы хотели бы иметь 2 локальных репозитория, то по умолчанию .m2/repository - это место, где идет стандартное оборудование компаний, а местное репозиционирование "в проекте" - это место, где вы работаете.