Тепер, коли maven-3 припинив підтримку <uniqueVersion> false </uniqueVersion> для артефактів знімків, здається, що вам дійсно потрібно використовувати SNAPSHOTS із позначкою часу. Особливо m2eclipse, який використовує maven 3 внутрішньо, здається, зазнає впливу, оновлення-знімки не працюють, коли SNAPSHOTS не є унікальними.
Перш за все здавалося найкращою практикою встановлювати всі знімки як uniqueVersion = false
Зараз, здається, не представляє великої проблеми перейти на версію із позначкою часу, адже ними керує центральне сховище nexus, яке здатне видаляти старі знімки у звичайних інтервалах.
Проблема полягає в робочих станціях місцевих розробників. Їх місцеве сховище швидко стає дуже великим завдяки унікальним знімкам.
Як боротися з цією проблемою?
Зараз я бачу наступні можливі рішення:
- Попросіть розробників регулярно очищати сховище (що призводить до великого розчарування, оскільки видалення займає багато часу і завантаження всього необхідного)
- Налаштуйте скрипт, який видаляє всі каталоги SNAPSHOT з локального сховища, і пропонуйте розробникам час від часу запускати цей сценарій (краще, ніж перший, але для запуску та завантаження поточних знімків потрібно досить багато часу)
- використовувати залежність: плагін purge-local-repository (Має проблеми при запуску з eclipse через відкриті файли, потрібно запускати з кожного проекту)
- налаштуйте nexus на кожній робочій станції та налаштуйте роботу для очищення старих знімків (найкращий результат, але я не хочу підтримувати 50+ серверів nexus, плюс пам'ять завжди обмежена на робочих станціях розробника)
- припиніть взагалі використовувати SNAPSHOTS
Який найкращий спосіб уникнути заповнення місцевого сховища місця на жорсткому диску?
Оновлення:
Щоб перевірити поведінку та надати більше інформації, я налаштував невеликий сервер зв'язку, побудуйте два проекти (a та b) і спробуйте:
a:
<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>
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>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-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 отримує видалення як з машин, так і з nexus)
- розгортання mvn за допомогою 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)
локальний репозитарій на машині А виглядає краще, лише одна банка, що не має позначок часу
лише одна баночка з часовим штампом у нексусі, метадані звучать:
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, щоб завантажити знімки з диспетчера сховищ -> локальне сховище все ще має позначки часу: