Теперь, когда maven-3 сделал отказаться от поддержки для <uniqueVersion> false </uniqueVersion> для артефактов моментальных снимков кажется, что вам действительно нужно использовать timestamped SNAPSHOTS. Особенно сильно влияет на m2eclipse, который использует maven 3 внутри, обновления-моментальные снимки не работают, когда SNAPSHOTS не уникальны.
Казалось, лучше практиковать до, чтобы установить все моментальные снимки в uniqueVersion = false
Теперь нет никакой проблемы переключиться на timestamped версию, после того, как все они управляются центральным репозиторием nexus, который может удалять старые снимки в обычных интервалах.
Проблема заключается в локальных рабочих станциях разработчиков. Их локальный репозиторий быстро растет очень просто с уникальными моментальными снимками.
Как справиться с этой проблемой?
Сейчас я вижу следующие возможные решения:
- Попросите разработчиков регулярно очищать репозиторий (что приводит к большому количеству фрустрации, так как требуется много времени для удаления и даже дольше, чтобы загрузить все необходимое).
- Настройте несколько script, которые удаляют все каталоги SNAPSHOT из локального репозитория и просят разработчиков время от времени запускать этот script (лучше, чем первый, но все еще занимает довольно много времени для запуска и загрузки текущих снимков )
- используйте зависимость: плагин purge-local-repository (возникают проблемы при запуске из eclipse из-за открытых файлов, которые должны запускаться из каждого проекта)
- настроить связь на каждой рабочей станции и настроить работу по очистке старых снимков (лучший результат, но я не хочу поддерживать более 50 серверов Nexus, а память всегда плотно работает на рабочих станциях разработчиков).
- прекратить использование SNAPSHOTS вообще
Каков наилучший способ сохранить ваш локальный репозиторий в заполнении вашего пространства на жестком диске?
Update:
Чтобы проверить beaviour и дать больше информации, я настраиваю небольшой сервер nexus, создайте два проекта (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 и запускаю "развернуть" на "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
в локальном репозитории. С новой версией timestamp каждый раз, когда я запускаю цель развертывания. То же самое происходит, когда я пытаюсь обновить снимки с сервера nexus (закрыть "a" Project, удалить его из локального репозитория, построить "b" )
В среде, где много снимков получают сборку (думаю, hudson server...), локальный reposioty заполняется старыми версиями быстро
Обновление 2:
Чтобы проверить, как и почему это происходит, я сделал еще несколько тестов. Каждый тест запускается против очистки всех (de/glauche получает удаление с обеих машин и нексуса)
- mvn deploy with 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 выглядит лучше, только один флажок без отметки времени
-
только одна метка времени в нексусе, метаданные читают:
de.glauche 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 клиента для загрузки снимков из диспетчера репозитория → локальный репозиторий по-прежнему имеет временные снимки: (