2011-08-26 17 views
18

私たちは大規模なマルチモジュールのmavenプロジェクトを持っています。開発の生産性を向上させる目的で、最近、リモートリポジトリ(中央ビルドを介して)にスナップショットを展開し始めました。ユーザーはモジュールのサブセットをチェックアウトして残りのスナップショットを作成するだけです。また、リモートリポジトリに対する更新ポリシーを 'never'に設定して、ローカルスナップショットを更新するときに明示的に指定するようにしました。したがって、典型的なコマンドはこうです。 mvn -Pref -Uクリーンインストール。ローカルに作成されたスナップショットで、より新しいリモートスナップショットを無効にすることができます

ここで、Mavenリアクタでは、プロファイルに定義されているモジュールのビルドが完全に動作します。リモートリポジトリから更新されたものをダウンロードするなど、依存関係のスナップショットを使用します(重要な注意;私たちの中心的な展開は、たとえそのうちの2つだけが変更されたとしても、プロジェクトのすべてのモジュールスナップショットのものです)。

mavenがプロファイルの外にあるモジュールからローカルにビルドされたモジュールに依存関係を解決していると思われます - このようなモジュールのビルドからリモートにスナップショットが配備された場合、mavenはこれをaより最新のバージョンにアップグレードし、ローカルに作成されたスナップショットをダウンロードして上書きします。これにより、他のモジュールがローカルで変更されたモジュールを予期している場合にブレークが発生することがあります。

基本的には、タイムスタンプがリモートスナップショットがより新しいことを示していても、リモートスナップショットよりもプロファイル内のモジュール内に「ローカルで作成されたスナップショットを使用する」というオプションがあります。

このシナリオで他の人は何をしましたか?

おかげで、

ポール

+0

'これは、他のモジュールがローカルで変更されたモジュールを期待しているところでブレークを引き起こす可能性があります。 'ローカルで変更されたモジュールを持っているならば、コンパイルするだけでローカルリポジトリに最新のスナップショットが作成されます。または私は何かを理解していないのですか? –

+2

それは確かに私がやっていることです。この問題は、後のモジュールがこのローカルにビルドされたモジュールに依存していると言うときに発生するようです。この時点でMavenは、リモートスナップショットがこのローカルスナップショットよりもタイムスタンプの方が遅いかどうかをチェックし、そのスナップショットがローカルリポジトリにダウンロードされインストールされた場合、ローカルにビルドされたモジュールを上書きします。 –

+0

Btwこの問題の一部は、すべてのスナップショットが私の中央ビルドに展開されていることです。それらのすべてが変更されていなくても、私は本当にビルド/モジュール –

答えて

0

あまりにも更新され、どのように更新する必要がありませんがMavenのためのが、ユーザーのためだけでなく、非常に難しい問題であるしなければならないものをアーティファクトの問題。 MavenはAIではありません。私は、アーティファクトのダウンロードを避けるためにあなたのプロジェクトをオフラインモードで構築することができると思います。(ただし、更新したいアーティファクトは更新されません)。

私たちはを解決しようとしました。のようにこの問題を解決してください。ビルド(あなたの中央ビルド)はバージョン(スナップショットなし)のみを含む必要があります。そこには、プロジェクトをビルドすれば、同じコードが安定していることが確かめられます。いくつかのアーティファクトを変更してモジュールのスナップショットを作成し、作業が完了したらバージョンと更新依存関係を作成します。 しかし、自動テストの大規模なシステムを持っていない場合、バージョンを作成するだけで多くの時間を費やすことができます(バグ - >修正 - >バージョン - >バグ - >修正 - >バージョン - >など)。

今日私は小規模なチームで働き、誰かが彼の部分を更新すると、彼はちょうどそれを聞いてみてください - それを取る - そして誰も - 取らないでください。

私はそのような質問の教祖ではありません。ですから、私はこの問題を避けるより簡単な方法を聞いてうれしいです。

1

変更されていないスナップショットが展開されないようにする必要があると思います。スナップショットを展開すると基本的に言っている:

「これは今、最新かつ最高のスナップショットである、(タイムスタンプの 意味での)古い上で私を選んスナップショット」

私はあなたには、いくつかのjiggeryを行うことができると思いますスナップショットのタイムスタンプメタデータを遠くの将来に設定するinstallフェーズにいくつかのスクリプトをリンクするなど(Mavenは常にリモートスナップショットを介してローカルを選択します)、ローカルスナップショットに追加します。しかし、それはまったくいいとは言えません。

スナップショットの展開は、ソース管理のコミットによってトリガーできます。代わりにこれを行うことはできますか?

7

Maven 3にアップデートできる場合は、--no-snapshot-updatesコマンドラインスイッチ(-nsuもタイピングを保存する機能)を使用できます。 3.0.4で修正されたそのオプションのバグがあるので、最新のリリースを使用していることを確認してください。

オフラインモードを試すこともできますが、オフラインになるのを止めるまで、すべての更新チェックを停止します。まず、ローカルのリポジトリにすべての依存関係がダウンロードされていることを確認するためにビルドを行います。その後、settings.xmlに<offline>true</offline>を追加して(オフラインモードに入る)、ビルドの実行時に-oまたは--offlineコマンドラインスイッチを使用してfalseに切り替えることでオフラインモードに入ることができます。これは、Mavenの2で動作しますか

0

3.私は、これは非常に古いですけど、同じ問題に出くわしたと2つのステップにビルドを分割することによってそれを解決:

  1. MVN -U依存関係:木
  2. mvnテスト

最初の手順は何も構築せずにスナップショットを更新し、非常に高速に実行されます。

次に、2番目の手順は定期的なビルド/テストですが、スナップショットは更新されません。

関連する問題