4

私のセットアップはこれです。私はAに応じてプロジェクトA、およびテストプロジェクトを持っている:test、testhelper、およびproject-under-testの間のMaven循環依存関係の解決

A <- A_t 

私も他のAに応じて、プロジェクト(およびそのテスト)があります。

A <- B <- B_t 

私が紹介するテストの一部を簡素化することをAに基づいたテストのものを支援する新しいライブラリ:

A <- Atesthelper 

のでA_t(とB_t)のように、このテストヘルパーに依存します:私は、Mavenのプロジェクト(のpom.xmlを作成しかし

A <- A_t 
^ | 
| v 
Atesthelper 

)いつもの事はプロジェクトと同じで、そのプロジェクトのテストの両方をバンドルすることであると思われますpom.xml。そして私は、だから今、それはなりAtesthelper

のための新しいのpom.xmlを作成:循環依存である

(A <- A_t) 
^ | 
    | v 
Atesthelper 

を。 pom.xmlでAtesthelperがテストビルドターゲットの依存性だけで、Aモジュールはそれ自身ではないことを何とか指定できますか?

ビルド順序は、A、Atesthelper、A_tである必要があります。私。 AとA_tは同じpomで指定されていて、同時にビルドすべきではありません。

ありがとうございます。

+0

プロジェクトのポムズから関連する抜粋を貼り付けると、本当に役に立ちます。 –

答えて

1

あなたが解決する必要がある問題がAtesthelperから依存され、その後、他のすべてが正常に動作します:Atesthelperに依存し、BはAtesthelperに依存しており、両方およびBには、送信元とテストの両方が含まれます。Atesthelperは、試験ABに含まれます。それがあなたの目標です。

どのようにそこに着きますか? Atesthelperが別のプロジェクトに依存している項目を抽出する必要があります。通常、これらはインターフェイスまたはその他の一般的な機能ですが、別のプロジェクトに入れる必要があります。ACommonとしましょう。だからあなたのターゲットのレイアウトは次のようになります。

ACommon <- Atesthelper 
    ^^
     | /
     A (and also B) 

機能はどのようなにに応じて Atesthelper のですか?あなたは別のプロジェクト(ACommon)に移動できますか?

+0

'Atesthelper'はAに依存しなければなりません。それは実質的に 'A 'のものをテストするヘルパーであり、したがって' A'のデータのみのオブジェクトの多くに依存し、 'A'のオブジェクトと対話します。だから私はそれが正しい依存関係を破るとは思わない。私は 'A'と' A_t'を別々にビルドするようにmavenを設定する方法に関する答えを期待していました。 –

+0

これは私にとってデザイン上の問題のようです。 Mavenがプロジェクトと依存関係を処理する方法と戦うことを試みています:1つのプロジェクト、1つの成果物。あなたは何とかあなたのニーズにこれを微調整することができるかもしれませんが、それはあなたに長期的にはより多くのトラブルを与えるでしょう。それをシンプルに保ち、メイヴェンがやることに従ってください。 BTW:Bobのおばあさんは何年も前と同じような何かを記述しています - 依存性の逆転原理、読んで価値があります:http://www.objectmentor.com/resources/articles/dip.pdf – nwinkler

+0

だからMavenは1つのプロジェクトに1つのアーティファクトを指示します。したがって、A用の1つのプロジェクト(別名pom.xml)とA_t用の別のプロジェクトが存在するはずです。これで問題は解決しますが、私はあなたがプロジェクトを「普通に」置き、同じpom.xmlにテストがあると思いました。私はDIを理解する(そして使用する)が、あなたはこの状況にどのような依存関係を注入するだろうか? –

0

あなたはあなたのPOMを貼り付けなかったし、私があなたを正しく理解しているか分からないが、どうやってそれを手に入れようとしているのか分からない。これは通常、次のように解決されなければならない、非常に一般的なケースである:

テストをサポートあなたのAtesthelperアーティファクト(おそらくjar包装)、src/mainディレクトリ内のすべてのテストに関連するものを持っている必要があります(src/main/javaのクラス、資源になりますsrc/main/resourcesなど)ではなく、src/test!すべての依存関係はAですが、JUnit、EasyMock(テストサポートクラスに必要なすべてのもの)のようなものもcompileスコープで宣言します。これはもちろんデフォルトのものです。ここにtestスコープを使用しないでください!最後に、AおよびBの成果物では、Atesthelpertestスコープの従属として宣言します。

このソリューションは長年にわたって私にとって素晴らしい作品です。依存関係についてはクリーンでひどいです(私が何を意味するか知っていれば<type>test-jar</type>とは対照的に推移的です)。とにかく、それを使用してください。あなたは幸せになるでしょう;)。

+1

循環依存の問題に対処しません。 – nwinkler

+0

このソリューションを使用することで、循環依存問題が解消されると思います。私が言ったように、私はそれに全く問題はなかった。 IMHO本当にうまくいくはずです。 –

+0

私は、テストをスキップして最初に 'A'と' B'をビルドして(http://maven.apache.org/general.html#skip-test)、 'Atesthelper'をビルドし、テストでAとBを再構築してください。 –

5

あなたが正しく理解している場合、主な目的はテストクラスを再利用することです。 A_tとAtesthelperはMavenプロジェクトではなく、テストです。

src/test/javaからjarを作成するようにMavenを作ってください。 http://maven.apache.org/guides/mini/guide-attached-tests.html

Aをビルドすると、A.jarとA-tests.jarが得られます。 A-tests.jarには、AtesthelperとA_tが含まれます。

-tests.jarにBの設定依存性(<type>test-jar</type>)

+1

最も簡単なソリューションです。 – GKislin

0

この問題を解決するためにクリーンな方法は、分離プロジェクトを維持することです。にクラスとテストクラスを配置することをお勧めMavenのようなフレームワークがあります。たとえば、Eclipse PlugInプロジェクトでは、別々のテストプロジェクトがあります。Aへの影響を気にせずに、テストプロジェクトで必要な依存関係を再利用できるので、AのサブプロジェクトをAというサブプロジェクトにするのがベストソリューションです。

このシナリオはより頻繁に発生し、あなたのプロを悩ませたくないかもしれませんテストの依存関係を持つデザインを作成します。これらのテストは独立していて、あなたのクラスデザインに影響を与えません。