Maven - установка артефактов в локальный репозиторий в рабочей области - PullRequest
20 голосов
/ 07 января 2010

Мне бы хотелось, чтобы в 'mvn install' файлы помещались в папку репозитория под моим корневым каталогом (извлечением) при использовании сторонних зависимостей из ~ / .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 каждый клон подобен ветви). Мне не нравятся альтернативы, которые заключаются в использовании специальной версии / классификатора для каждой проверки или переустановке (перестройке) всего при каждом переключении.

Ответы [ 4 ]

29 голосов
/ 07 января 2010

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

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

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

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

Или обновляйте ~/.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.

0 голосов
/ 14 января 2014

Это возможно в командной строке, и на самом деле это довольно полезно. Например, если вы хотите создать дополнительное репо в своем проекте 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 / репозиторий - это то, куда идут стандартные вещи компаний, а локальное репо «в проекте» - это то, куда идут ВАШИ вещи.

0 голосов
/ 07 января 2013

К вашему сведению: символические ссылки работают в Windows7 и выше, так что такого рода вещи легко достичь, если весь ваш код находится в одном месте в локальном репозитории, т.е.

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

0 голосов
/ 07 января 2010

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

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

...