2017-03-16 24 views
1

私はmavenに問題があります。私はそれの構造を変更する可能性が限られた巨大なマルチモジュールプロジェクトを持っています。Mavenの循環依存性とプロジェクトの恐ろしい構造

だから、私は3つのモジュールがあるとしましょう:A、B、C。

  • A Bの親であるとC.
  • CはBからクラスを使用していますので、私たちはCのPOMファイルで依存関係としてBを持っています。
  • Bは、コンパイルに成功するために依存関係としてCを持つ必要はありません。

今のところ問題はありません。

残念ながら、Bはランタイム中(spring、ioc、...)にCを使用するため、誰かがBの依存関係としてCを追加したので、Mavenには恐ろしいサイクルがあります。ビルドは失敗して終了します(ログ内の「サイクル検出」など)。

必要なすべてのJARアーカイブ(CのJARを含む)でBをコンパイルして配布する必要があるので、この方法(BモジュールにCの依存関係をどうにかして提供する)を維持したいと考えています。

Bを完全にコンパイルした後に、何とかCをビルドし、そのJARをBのターゲットディレクトリにコピーできますか?これを行うためにMavenで使用できるプラグインまたはツールはありますか?

この投稿が明確でない場合は、詳細を説明します。事前に

感謝;)ここで

+0

D.依存関係をD.に移動します。BとCをDに依存させます。 –

+0

ありがとう、それは素晴らしいようです。残念ながら、プロジェクトには複数のモジュールがあり、私はその構造を変更することはできません。完全なプロジェクトの構造を再編成することなく、私の問題を解決する方法はありますか? – KP13

+0

Mavenは自動ビルドツールです。ビルドプロセスを手動でハッキングすることを提案しています。これは解決策ではありません。 –

答えて

0

は、私はそれを行うだろうかです。 CのPOMファイルから:あなたはこのようにmvn yourcommandforrunning -Prun

を使用してBモジュールを実行

<profile> 
    <id>run</id> 
     <dependencies> 
     <dependency> 
      use C here but do not use in the main dependencies section 
     </dependency> 
      + other dependencies 
     </dependencies> 
    </build> 
</profile> 

:たとえば

<profile> 
    <id>compile</id> 
     <dependencies> 
     <dependency> 
      use B here but do not use in the main dependencies section 
     </dependency> 
      + other dependencies 
     </dependencies> 
    </build> 
</profile> 

あなたはBのPOMファイルからmvn compile -Pcompile

を使用してCモジュールをコンパイルすることができますサイクリック依存関係の問題から逃れることができます。

0

は、それは2つの問題があるように聞こえる:

  1. 成果物間の実行時のみの依存関係についてMavenを伝える方法。
  2. Mavenに依存関係を利用させて、すべての関連する依存関係を集める方法。

Mavenには依存関係管理の機能があり、依存関係要素の "scope"要素を使ってこのようなニュアンスを通知できます。この場合、あなたが望むと思います。

<scope>runtime</scope> 

documentationを参照してください。

実行時 - このスコープは、依存関係はコンパイルに必須ではなく実行用であることを示します。ランタイムとテストのクラスパスにありますが、コンパイルクラスパスにはありません。

ランタイムscopeを適切に使用すると、循環依存関係の問題が解決されます。

第2の問題に関して、あなたは決定的な回答を提供するのに十分な情報を提供していません。しかし、依存関係に関するMavenの情報を活用するためには、ほぼ確実にMavenプラグインを使いたいと思うでしょう。たとえば、すべてが含まれている単一の "fat" jarファイルを作成する場合は、maven-shade-pluginを参照します。もう1つのオプションはmaven-assembly-pluginです。これは非常に柔軟で、アセンブリ内のすべての依存関係を含めることができます。他のさまざまな一般的な状況を処理する際に優れたプラグインがあります。特定のプラグインを使用する方法に問題がある場合は、別の質問を作成することをお勧めします。