Maven-развертывание зависимостей в удаленном репозитории
У меня есть несколько проектов с большим количеством зависимостей Maven. Когда я вызываю команду mvn deploy (или некоторую ее вариацию), я хотел бы не только развернуть сам проект в удаленном репозитории, но и все его зависимости. Возможно ли это? Я вижу много "подобных вопросов" на этом сайте, но я не могу найти ничего, что так просто сказано. Все остальное, что я видел, похоже, ожидает некоторой дополнительной функциональности. Я просто хочу развернуть свой проект, плюс все его зависимости от удаленного РЕПО. Я использую плагин компилятора maven 1.5
Это фрагмент моих настроек.XML. Есть идеи, что я упускаю?
<mirrors>
<mirror>
<!--This is used to direct the public snapshots repo in the
profile below over to a different nexus group -->
<id>nexus-public-snapshots</id>
<mirrorOf>public-snapshots</mirrorOf>
<url>http://{ourServer}/nexus/content/groups/public-snapshots</url>
</mirror>
<mirror>
<!--This sends everything else to /public -->
<id>nexus</id>
<mirrorOf>*</mirrorOf>
<url>http://{ourServer}/nexus/content/groups/public</url>
</mirror>
</mirrors>
<profiles>
<profile>
<id>development</id>
<repositories>
<repository>
<id>central</id>
<url>http://central</url>
<releases><enabled>true</enabled></releases>
<snapshots><enabled>true</enabled></snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>central</id>
<url>http://central</url>
<releases><enabled>true</enabled></releases>
<snapshots><enabled>true</enabled></snapshots>
</pluginRepository>
</pluginRepositories>
</profile>
<profile>
<!--this profile will allow snapshots to be searched when activated-->
<id>public-snapshots</id>
<repositories>
<repository>
<id>public-snapshots</id>
<url>http://public-snapshots</url>
<releases><enabled>false</enabled></releases>
<snapshots><enabled>true</enabled></snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>public-snapshots</id>
<url>http://public-snapshots</url>
<releases><enabled>false</enabled></releases>
<snapshots><enabled>true</enabled></snapshots>
</pluginRepository>
</pluginRepositories>
</profile>
</profiles>
спасибо заранее
~Джей
3 ответов
вы можете начать с чистого локального репозитория, попытаться создать приложение и при любом сбое зависимости развернуть это приложение в корпоративном репозитории. Это гарантирует, что все зависимости, необходимые приложению, находятся в корпоративном репозитории до его создания и развертывания.
до этого вы должны настроить локальный репозиторий на зеркальное отображение central
и другие известные репозитории, так что с открытым исходным кодом сторонние библиотеки автоматически попадают в удаленный репозиторий вместо того, чтобы загружаться вручную.
может оказаться, что у вас не так много сторонних библиотек, которые вам понадобятся вручную развернуть.
Я предлагаю следующее решение, которое выглядит намного меньше, как метод проб и ошибок для разрешения зависимостей по сравнению с существующими ответами.
что вы можете сделать, это позвонить mvn -Dmdep.copyPom=true dependency:copy-dependencies
после развертывания основного проекта. Это будет копировать транзитивно все зависимости вашего проекта в target/dependency
включая их соответствующие файлы pom.
затем вы можете перебрать все зависимости и развернуть их в репозитории, используя deploy:deploy-file
, например, с таким bash петля:
for pom in target/dependency/*.pom; do mvn deploy:deploy-file -Durl=http://your/repo -Dfile="${pom%%.pom}.jar" -DgeneratePom=false -DpomFile="$pom"
вот как это работает в двух словах, предполагая, что ваш удаленный репозиторий (в Nexus или Artifactory, или тому подобное) и settings.xml
правильно настроены.
предположим, у вас есть проект с одной зависимостью от commons-logging
. Когда Maven разрешает зависимости вашего проекта как часть сборки, он выполняет следующие шаги:
- проверяет местное РЕПО на
commons-logging
. - если нашли, сделали. Продолжайте строить.
- если не нашли: проверки
commons-logging
в удаленном РЕПО. - если найден, загрузите артефакт в локальное РЕПО. Готово; продолжайте строить.
- если не найдено в удаленном РЕПО:удаленно контакты central для загрузки
commons-logging
. Затем он доступен для Maven для загрузки в локальное РЕПО. Готово; продолжайте строить.
В конце этих шагов, commons-logging
должно быть как в ваших локальных, так и в удаленных репозиториях, и больше нечего делать. Если это не так, тогда либо settings.xml
не настроен для подключения к удаленному репозиторию при поиске зависимостей (он напрямую связывается с central?) или Nexus настроен неправильно.
- - - -редактировать ----
вот фрагмент моих настроек.XML, который работает. @Raghuram дал вам хороший совет, когда он предложил вам включить оба профиля; Если вы каким-то образом включили только public-snapshots
профиль ваши сборки будут продолжать попадать в Maven central непосредственно.
....
<mirrors>
<!-- redirects all traffic to internal Nexus repo instead of Maven central -->
<mirror>
<id>maven2</id>
<mirrorOf>*</mirrorOf>
<url>http://repository.someCompany.com/maven2RepoOrGroupInNexus</url>
</mirror>
</mirrors>
....
<profiles>
<profile>
<id>repo-profile</id>
<repositories>
<repository>
<id>central</id>
<url>http://gotoNexus</url> <!-- URL is unimportant here -->
<snapshots>
<enabled>true</enabled>
<updatePolicy>daily</updatePolicy>
</snapshots>
<releases>
<enabled>true</enabled>
<updatePolicy>daily</updatePolicy>
</releases>
</repository>
</repositories>
</profile>
</profiles>
<activeProfiles>
<activeProfile>repo-profile</activeProfile> <!-- important -->
</activeProfiles>
Примечание activeProfiles
элемент внизу; вот как убедиться, что вы будете использовать Nexus вместо Maven central с каждым .
вам все равно нужно убедиться, что Nexus настроен так, чтобы URL-адрес, определенный в <mirror>
включает контент из Maven central, но как настроить Nexus будет отдельным вопросом.