Как настроить встроенный репозиторий архива Archiva для Maven?
Мы пытаемся использовать Archiva в качестве прокси-сервера Maven для центральных и других внешних репозиториев, а также в качестве хранилища снимков для наших артефактов, которые автоматически создаются Hudson из SVN и установлены в репозиторий снимков.
Я не могу настроить мой клиент Maven для совместного использования внутренних и хранилищ снимков. Мой проект имеет некоторые внешние зависимости (например, log4j
), которые правильно загружаются из внутреннего хранилища Archiva. Также мой проект имеет зависимость от собственного проекта, который артефакт уже построен и установлен в репозиторий снимков. Однако, если я пытаюсь построить проект, Maven не сможет найти мой артефакт моментального снимка.
Первоначально мой конфигурационный файл имел этот параметр:
<mirror>
<id>company-internal</id>
<name>Company Archiva - Internal Repository</name>
<url>http://www.mycompany.hu/archiva/repository/internal</url>
<mirrorOf>*</mirrorOf>
</mirror>
а затем я добавил следующее:
<mirror>
<id>company-snapshots</id>
<name>Company Archiva - Snapshots Repository</name>
<url>http://www.mycompany.hu/archiva/repository/snapshots</url>
<mirrorOf>apache.snapshots</mirrorOf>
</mirror>
Однако Maven не пытается найти репозиторий snaphot при сборке.
Что я сделал не так? Кстати, я действительно не использую цель <mirrorOf>
. Я попытался заменить это при настройках внутреннего зеркала на central
, но это все еще не исправляет мою проблему.
Ответы
Ответ 1
Следующая конфигурация работала для меня после проб и ошибок. Здесь я использовал конфигурацию архива по умолчанию - internal
для хранения релизов и snapshots
для хранения только внутренних снимков.
По сути, в отличие от nexus нам нужны две отдельные объявления <mirror>
и <repository>
- одна для обычных артефактов, а другая для моментального снимка артефакты.
<mirrors>
<mirror>
<id>archiva</id>
<mirrorOf>*</mirrorOf>
<url>http://localhost:8080/archiva/repository/internal</url>
</mirror>
<mirror>
<id>snapshots</id>
<mirrorOf>snapshots</mirrorOf>
<url>http://localhost:8080/archiva/repository/snapshots</url>
</mirror>
</mirrors>
<profiles>
<profile>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<repositories>
<repository>
<id>internal</id>
<name>Archiva Managed Internal Repository</name>
<url>http://localhost:8080/archiva/repository/internal/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
<repository>
<id>snapshots</id>
<name>Archiva Managed Internal Repository</name>
<url>http://localhost:8080/archiva/repository/snapshots/</url>
<releases>
<enabled>false</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
</profile>
</profiles>
Ответ 2
Через много проб и ошибок я пришел к конфигурации, очень похожей на Raghuram's. Тем не менее, используя archiva, я обнаружил одну или две вещи, которые могут по-прежнему заслуживать внимания. Кроме того, я использовал зеркала в своей конфигурации для доступа к моим проектам (установленным в <distributionManagement/>
в pom.xml) вместо прямого доступа к репозиториям.
Это важная часть моего maven settings.xml:
<!-- set up servers to point to mirror, for use in project pom -->
<servers>
<server>
<id>my.snapshots</id> <!-- use name of the mirror here -->
<username>user</username>
<password>pwd</password>
</server>
</servers>
<!-- map mirror names to actual repositories -->
<mirrors>
<!-- leave the default mirror in place -->
<mirror>
<id>archiva.default</id>
<mirrorOf>*</mirrorOf>
<url>http://server:port/archiva/repository/internal/</url>
</mirror>
<!-- enter my own -->
<mirror>
<id>my.snapshots</id>
<mirrorOf>archiva.snapshots</mirrorOf>
<url>http://server:port/archiva/repository/snapshots/</url>
</mirror>
<mirrors>
<!-- activate the repo for artifact downloads by setting profile -->
<profiles>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<repositories>
<repository> <!-- mirror will be used during runtime instead of this -->
<id>archiva.snapshots</id> <!-- do not use mirror name here -->
<url>http://server:port/archiva/repository/snapshots/</url>
<releases>
<enabled>false</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
</profile>
Я выяснил, что мне пришлось указывать разные идентификаторы в разделе <mirrors>
, чем в разделе <profiles>
, поэтому мне, казалось бы, не разрешалось давать им то же имя, что и Рагхурам.
Теперь, с установкой settings.xml, я решил изменить раздел <distributionManagement>
в моем проекте pom.xml. Если быть точным, я изменил эту настройку в pom, который является родительским для всех моих проектов: в основном он содержит раздел <distributionManagement>
и немного больше. Этот родительский pom сам развертывается в archiva.
Это соответствующий раздел родительского pom.xml:
<distributionManagement>
<repository>
...
</repository>
<snapshotRepository>
<id>my.snapshots</id>
<name>Archiva Managed Snapshot Repository</name>
<url>http://server:port/archiva/repository/snapshots</url>
<layout>default</layout>
</snapshotRepository>
</distributionManagement>
Этот вид упрощенных вещей, и у него есть, я думаю, некоторые преимущества:
-
Теперь я могу создавать проекты в зависимости от моих собственных артефактов (включая родительский pom), не имея ни одного из этих артефактов в моем локальном репозитории сборки (я уничтожил свой локальный репозиторий для проверки этого).
-
Загрузки (разделы <dependencies>
pom.xml), а также закачки (разделы <distributionManagement>
pom.xml) теперь обрабатываются через зеркала.
Ответ 3
Через много проб и ошибок я тоже попал в конфигурацию, которая была аналогичной выше, но для меня не было тренировки, пока я не сделал это ниже конфигурации. Поэтому отправляйте его в попытке улучшить ответ, если вы используете maven с помощью своего репозитория организации вместо использования в своем локальном хосте.
Этот ответ предназначен для тех, кому требуется несколько зеркальных конфигураций для нескольких репозиториев, поддерживаемых вашей организацией, тогда это послужит примером.
my.snapshots пользователь PWD
<!-- map mirror names to actual repositories -->
<mirrors>
<!-- enter my own -->
<mirror>
<id>my.snapshots</id>
<mirrorOf>archiva.snapshots</mirrorOf> <!-- this name should be the same as configured for the below repository id.>
<url>http://server:port/archiva/repository/snapshots/</url>
</mirror>
<!-- leave the default mirror in place -->
<mirror>
<id>archiva.default</id>
<mirrorOf>central</mirrorOf> < !-- Instead of *, replace it with "central"-->
<url>http://server:port/archiva/repository/internal/</url>
</mirror>
<mirrors>
<!-- activate the repo for artifact downloads by setting profile -->
<profiles>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<repositories>
<repository> <!-- mirror will be used during runtime instead of this -->
<id>archiva.snapshots</id> <!-- do not use mirror name here -->
<url>http://server:port/archiva/repository/snapshots/</url>
<releases>
<enabled>false</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
</profile>