maven-3 がスナップショット アーティファクトの <uniqueVersion>false</uniqueVersion> のサポートを削除したため、タイムスタンプ付きの SNAPSHOTS を使用する必要があるようです。特に、maven 3 を内部で使用する m2eclipse は影響を受けているようで、SNAPSHOTS が一意でない場合、update-snapshots は機能しません。
以前は、すべてのスナップショットを uniqueVersion=false に設定するのがベストプラクティスのようでした
現在、タイムスタンプ付きバージョンに切り替えることは大きな問題ではないようです。なぜなら、それらは定期的に古いスナップショットを削除できる中央のネクサス リポジトリによって管理されているからです。
問題は、ローカルの開発者ワークステーションです。彼らのローカル リポジトリは、独自のスナップショットですぐに非常に大きくなります。
この問題に対処するには?
現在、次の可能な解決策が表示されます。
- 定期的にリポジトリを削除するように開発者に依頼してください (これは、削除に時間がかかり、必要なものすべてをダウンロードするのにさらに時間がかかるため、多くのフラストレーションにつながります)
- ローカル リポジトリからすべてのSNAPSHOTディレクトリを削除するスクリプトをセットアップし、開発者にそのスクリプトを時々実行するように依頼します (最初のスクリプトよりはましですが、実行して現在のスナップショットをダウンロードするにはかなりの時間がかかります)。
- dependency:purge-local-repository プラグインを使用します (開いているファイルが原因で、Eclipse から実行すると問題が発生し、各プロジェクトから実行する必要があります)
- すべてのワークステーションに nexus をセットアップし、古いスナップショットを消去するジョブをセットアップします (最良の結果ですが、50 以上の nexus サーバーを維持したくありません。また、開発者ワークステーションのメモリは常に不足しています)。
- SNAPSHOTS の使用を完全に停止する
ローカル リポジトリがハード ドライブの容量をいっぱいにしないようにする最善の方法は何ですか?
アップデート:
動作を確認し、詳細情報を提供するために、小さな nexus サーバーをセットアップし、2 つのプロジェクト (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>
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" で "deploy" を実行すると、
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」をビルドします)
大量のスナップショットが構築される環境 (ハドソン サーバーを考えてください...) では、ローカル リポジトリが古いバージョンですぐにいっぱいになります。
更新 2:
これが失敗する方法と理由をテストするために、さらにいくつかのテストを行いました。各テストはクリーンなすべてに対して実行されます (de/glauche はマシンと nexus の両方から削除されます)
- mvn deploy with maven 2.2.1 :
マシン A のローカル リポジトリには、snapshot.jar + snapshot-timestamp.jar が含まれています
BUT: nexus にはタイムスタンプ付きの jar が 1 つだけあり、メタデータは次のように読み取ります。
<?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>
- m2eclipse(埋め込みm3最終)で(マシンBで)更新依存関係を実行します->ローカルリポジトリにはsnapshot.jar + snapshot-timestamp.jarがあります:(
- 外部maven 2.2.1でパッケージの目標を実行します->ローカルリポジトリにはsnapshot.jar + snapshot-timestamp.jarがあります:(
OK、次にmaven 3.0.1を試してください(プロジェクトaのすべての痕跡を削除した後)
マシン A のローカル リポジトリの方が見栄えが良く、タイムスタンプのない jar が 1 つだけ
nexus にタイムスタンプ付きの jar が 1 つだけある場合、メタデータは次のように読み取ります。
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>
m2eclipse(埋め込みm3最終)で(マシンBで)更新依存関係を実行します->ローカルリポジトリにはsnapshot.jar + snapshot-timestamp.jarがあります:(
外部maven 2.2.1でパッケージの目標を実行します->ローカルリポジトリにはsnapshot.jar + snapshot-timestamp.jarがあります:(
つまり、要約すると、maven3 の「デプロイ」目標は 2.2.1 よりもうまく機能し、作成マシンのローカル リポジトリは問題ないように見えます。しかし、受信者は常に多くのタイムスタンプ付きのバージョンで終わります...
私は何を間違っていますか?
アップデート 3
他のさまざまな構成もテストしました。最初にネクサスをアーティファクトに置き換えます->同じ動作。次に、Linux Maven 3 クライアントを使用して、リポジトリ マネージャーからスナップショットをダウンロードします -> ローカル リポジトリにはまだタイムスタンプ付きのスナップショットがあります :(