Теперь, когда maven-3 отказался от поддержки <uniqueVersion> false </uniqueVersion> для артефактов моментальных снимков, кажется, что вам действительно нужно использовать SNAPSHOTS с отметками времени. В частности, m2eclipse, который использует maven 3 внутри, кажется, затронут этим, снимки обновлений не работают, когда SNAPSHOTS не уникальны.
Раньше казалось лучшей практикой установить для всех снимков значение uniqueVersion = false.
Теперь, кажется, нет большой проблемы переключиться на версию с отметкой времени, в конце концов, они управляются центральным репозиторием nexus, который может удалять старые снимки через регулярные интервалы.
Проблема в местных рабочих станциях разработчиков. Их локальный репозиторий быстро становится очень большим с уникальными снимками.
Как справиться с этой проблемой?
Сейчас я вижу следующие возможные решения:
- Попросите разработчиков регулярно очищать репозиторий (что приводит к большому разочарованию, так как удаление занимает много времени и еще больше времени для загрузки всего необходимого)
- Настройте сценарий, который удаляет все каталоги SNAPSHOT из локального репозитория, и просите разработчиков время от времени запускать этот сценарий (лучше, чем первый, но все же требуется некоторое время для запуска и загрузки текущих снимков)
- используйте плагин dependency: purge-local-repository (есть проблемы при запуске из eclipse из-за открытых файлов, необходимо запускать из каждого проекта)
- настроить nexus на каждой рабочей станции и настроить задание по очистке старых снимков (лучший результат, но я не хочу поддерживать 50+ серверов nexus, плюс на рабочих станциях разработчиков всегда не хватает памяти)
- прекратить использовать SNAPSHOTS вообще
Как лучше всего защитить локальный репозиторий от заполнения места на жестком диске?
Обновить:
Чтобы проверить поведение и получить дополнительную информацию, я настраиваю небольшой сервер нексуса, создаю два проекта (a и b) и пробую:
а:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>de.glauche</groupId>
<artifactId>a</artifactId>
<version>0.0.1-SNAPSHOT</version>
<distributionManagement>
<snapshotRepository>
<id>nexus</id>
<name>nexus</name>
<url>http://server:8081/nexus/content/repositories/snapshots</url>
</snapshotRepository>
</distributionManagement>
</project>
б:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>de.glauche</groupId>
<artifactId>b</artifactId>
<version>0.0.1-SNAPSHOT</version>
<distributionManagement>
<snapshotRepository>
<id>nexus</id>
<name>nexus</name>
<url>http://server:8081/nexus/content/repositories/snapshots/</url>
</snapshotRepository>
</distributionManagement>
<repositories>
<repository>
<id>nexus</id>
<name>nexus</name>
<snapshots>
<enabled>true</enabled>
</snapshots>
<url>http://server:8081/nexus/content/repositories/snapshots/</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>de.glauche</groupId>
<artifactId>a</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
</project>
Теперь, когда я использую maven и запускаю "deploy" на "a", у меня будет
a-0.0.1-SNAPSHOT.jar
a-0.0.1-20101204.150527-6.jar
a-0.0.1-SNAPSHOT.pom
a-0.0.1-20101204.150527-6.pom
в локальном репозитории. С новой версией отметки времени каждый раз, когда я запускаю цель развертывания. То же самое происходит, когда я пытаюсь обновить снимки с сервера nexus (закройте проект «a», удалите его из локального репозитория, создайте «b»)
В среде , где много снимков получить сборки (думает Hudson сервер ...), локальная reposioty заполняется со старыми версиями быстро
Обновление 2:
Чтобы проверить, как и почему это не удается, я провел еще несколько тестов. Каждый тест запускается для очистки всего (de / glauche удаляется как с машин, так и с нексуса)
- mvn deploy с maven 2.2.1:
локальный репозиторий на машине A содержит файл snapshot.jar + snapshot-timestamp.jar
НО: только одна банка с меткой времени в нексусе, метаданные читают:
<?xml version="1.0" encoding="UTF-8"?>
<metadata>
<groupId>de.glauche</groupId>
<artifactId>a</artifactId>
<version>0.0.1-SNAPSHOT</version>
<versioning>
<snapshot>
<timestamp>20101206.200039</timestamp>
<buildNumber>1</buildNumber>
</snapshot>
<lastUpdated>20101206200039</lastUpdated>
</versioning>
</metadata>
- запустить зависимости обновления (на машине B) в m2eclipse (встроенный m3 final) -> в локальном репозитории есть snapshot.jar + snapshot-timestamp.jar :(
- запустить цель пакета с внешним maven 2.2.1 -> в локальном репозитории есть snapshot.jar + snapshot-timestamp.jar :(
Хорошо, следующая попытка с maven 3.0.1 (после удаления всех следов проекта a)
локальный репозиторий на машине A выглядит лучше, только одна банка без метки времени
только один jar с отметкой времени в нексусе, метаданные читают:
de.glauche a 0.0.1-SNAPSHOT
<snapshot> <timestamp>20101206.201808</timestamp> <buildNumber>3</buildNumber> </snapshot> <lastUpdated>20101206201808</lastUpdated> <snapshotVersions> <snapshotVersion> <extension>jar</extension> <value>0.0.1-20101206.201808-3</value> <updated>20101206201808</updated> </snapshotVersion> <snapshotVersion> <extension>pom</extension> <value>0.0.1-20101206.201808-3</value> <updated>20101206201808</updated> </snapshotVersion> </snapshotVersions>
запустить зависимости обновления (на машине B) в m2eclipse (встроенный m3 final) -> в локальном репозитории есть snapshot.jar + snapshot-timestamp.jar :(
запустить цель пакета с внешним maven 2.2.1 -> в локальном репозитории есть snapshot.jar + snapshot-timestamp.jar :(
Итак, резюмируем: цель «развертывание» в maven3 работает лучше, чем в 2.2.1, локальный репозиторий на машине создания выглядит нормально. Но получатель всегда заканчивает с множеством версий с временными метками ...
Что я делаю не так ?
Обновление 3
Я также тестировал различные другие конфигурации, сначала заменил nexus на artifactory -> такое же поведение. Затем используйте клиенты linux maven 3 для загрузки снимков из диспетчера репозитория -> в локальном репозитории все еще есть снимки с отметкой времени :(