0

レガシー プロジェクトを ant から maven に移行するタスクがあり、循環インポートに問題があります。私の問題は、ant が同じクラスを含む多くの jar をビルドすることです。

元々、ant プロジェクトには 1 つの src フォルダーがあり、そこにすべてのパッケージが含まれています。Maven の互換性のために、pom.xml を使用して src フォルダーを複数のモジュールに分割する必要があります (ガイドとマニュアルに記載されているように)。

速い例。

Foo.java
package myapp;
import my.domain.myapp.Bar;
...

Bar.java
import my.domain.myapp.Foo;
...

src/my/domain/myapp/foo/foo.java (foo.jar)
src/my/domain/myapp/bar/bar.java (bar.jar)

同じ親パッケージに配置された 2 つのパッケージがあり、コンパイルに問題はありません。Ant プロジェクトは、Java クラスをコンパイルし、パターンによってアーティファクトを生成するだけです。したがって、*.class を jar にコピーするだけでコンパイルされます。Mavenの場合、同じように見えなかったので、次のようにパッケージを分割する必要があると思います:

pom.xml (parent)
--foo
----src/main/java/my/domain/myapp/foo/foo.java
----pom.xml
--bar
----src/main/java/my/domain/myapp/bar/bar.java
----pom.xml

したがって、mavenでは、依存関係をjarとして別のjarに設定することしか知りません。私の場合、ビルドをロックする循環インポートがあります。bar.jar なしで foo.jar をビルドすることはできません。

Mavenには、依存関係をjarに設定する代わりに、コンパイルプロセスのクラスパス変数を指定するものがありますか? いくつかの回避策?

ベストプラクティスは大歓迎です。

4

2 に答える 2

1

コードをリファクタリングして、循環依存を解消することをお勧めします。プロジェクトに応じて、さまざまな戦略を使用できます。

  • FooBarは本当にお互いについて知る必要がありますか? 依存関係の 1 つを削除すると、クラスの 1 つが制御されます。自身の状態を認識していると同時に、他のクラスのインスタンスの現在の状態を要求できます。
  • 依存関係の注入を使用して、依存関係を壊します (たとえば、新しいパッケージを導入し、依存させBaz、プロジェクトからプロジェクトへの依存関係を削除し、実装させます)。fooFooBazfoobarBarBaz
  • オブザーバー パターンの導入により、変更の追跡を失うことなく、クラスを分離できます。
于 2013-05-13T20:31:59.770 に答える
1

Maven を使用する際に注意する必要があることの 1 つは、Maven ではプロジェクトのコンポーネント (JAR、WAR、またはその他の種類のモジュール) を明確に定義する必要があるということです。明確で非循環的な依存関係は、前提条件の 1 つです。

循環依存が原因で問題に直面した場合は、調べる必要があるものがあります: (@matsev の回答にはいくつかの方法があり、いくつか追加しています)

  1. fooそれらが非常に密接に結合される必要がある場合、個別のモジュールにbar分割することは本当に適切ですか?
  2. それらを別のモジュールに入れる必要があると思われる場合は、コードをリファクタリングする必要があります。実際の状況に応じて、問題を解決するさまざまな方法があります。
    • Foo と Bar が対応するインターフェースを使用するようにインターフェースを導入し、インターフェースを別々のモジュール (foo-api または bar-api と呼びます) に入れることができます。
    • 二重派遣
    • Foo と Bar を適切に設計して、Foo と Bar の間に明確な関係を与えるのに役立つその他のパタ​​ーン。それはあなたの必要性に依存するので、誰もあなたに何をすべきかを本当に教えることはできません. 1 つだけ明確なことは、設計には改善の余地があるということです。現在、大きな悪臭を放っています。
于 2013-05-14T01:43:44.317 に答える