26

私たちはJavaプロジェクトのMavenizingに取り組んでおり、各モジュールのインターフェースと実装を明確に分離したいと考えています。そのために、各モジュールを2つのサブモジュールに分割します。1つはインターフェイスとそれらが使用するデータオブジェクト用で、もう1つは実装用です。例えば:

 +commons 
  +commons-api 
  +commons-impl 

モジュールのPOMは、モジュールがimplサブモジュールに依存しないように構成されます。このように、あるモジュールのコードが別のモジュールの実装の詳細を「見る」ことはできません。

私たちが問題を抱えているのは、春のXMLをどこに置くかです。私たちのプロジェクトでは、ワイルドカードインポートを使用して春のXMLファイルを自動的にインポートします。

<import resource="classpath*:**/*-beans.xml"/>

このように、すべてのモジュールが同じクラスローダーにロードされ、POMの厳密な一方向の依存関係ルールが適用されないため、SpringXMLの場所は実行時に実際には重要ではありません。

ただし、開発中は、IDE(Intellij IDEAを使用)がSpringXMLから参照される実装クラスを認識できるようにする必要があります。また、IDEAが他のモジュールで定義されたBeanを認識できるようにします。

Spring XMLをAPIサブモジュールに配置すると、implサブモジュールの実装クラスは「認識」されません。それらをimplサブモジュールに配置すると、それらのBeanは他のモジュールから「認識」されません。依存関係のないモジュールからSpringXMLを認識するようにIDEAプロジェクトを構成することはおそらく可能ですが、POMがすべてのプロジェクト構造情報を保持し、IDEAプロジェクトファイルに依存しないことをお勧めします。

Spring XML(およびおそらく休止状態のxml)を保持するためだけに3番目のサブモジュールを作成することを検討しました。例えば:

 +commons 
  +commons-api 
  +commons-impl 
  +commons-config

外部モジュールはcommons-apicommons-configの両方に依存し、commons-configはcommons-apicommons-implの両方に依存し、 commons- implへの依存は「提供された」とマークされます(推移的な解決を防ぐため)。

ただし、これは複雑で厄介な解決策のように思われ、MavenおよびSpringとのインターフェース/impl分離を実現するためのより良い-より簡単な方法が必要だと感じています。

4

6 に答える 6

1

要するに、IdeaがMaven依存関係グラフをオーバーライドすることを望みますが、この構成をIdeaプロジェクトファイルに保持することは避けますか?

1つのオプションは、実装の依存関係をMavenプロファイルにグループ化することです。このプロファイルはデフォルトでは有効になっていませんが、アイデアの下でアクティブとしてマークできるはずです。

于 2013-02-13T15:28:32.380 に答える
1

次の 2 つのアイデアが思い浮かびます。

  1. すべてのモジュール (api + impl) が依存関係である 1 つ (または複数) のモジュールがあり、そこに Spring 構成ファイルを配置できます。
  2. providedSpring 構成ファイルを api モジュールに配置し、実装が認識されるようにスコープを指定して impl モジュールへの依存関係を宣言しますが、デプロイ用の api の依存関係はありません。
于 2015-10-01T09:32:46.573 に答える
1
  1. モジュールの数をできるだけ少なくします。

    これにより、プロジェクトのビルド時間が短縮され、レイアウトが簡素化されます。

  2. モジュール構造をできるだけ単純に保ちます: 単一のルート + 同じフォルダー内のすべてのサブモジュール。

    pom.xml
    commons-api/
    commons-runtime/
    module-a-api/
    module-a-runtime/
    ... 
    

これにより、モジュール数が非常に多い場合 (>50)、プロジェクト全体のナビゲーションが簡素化されます。

  1. 必要な場合にのみ、ランタイム モジュールにランタイム スコープの依存関係を提供します。

    これにより、アーキテクチャが明確になります。別のランタイム モジュールへの明示的な依存関係の代わりに、モックを使用します。

  2. API Spring コンテキストを API モジュールに保持し、パブリック Bean を抽象 Bean + インターフェイスとして定義します。

  3. 実装コンテキストをランタイム モジュールに保持し、Spring プロファイルを介して API Bean を実装でオーバーライドします (<beans profile="default" を使用します)。

結果: シンプルで分かりやすいレイアウトとデザイン。完全な ide サポート。ランタイム モジュールの内部に明示的な依存関係はありません。

于 2015-10-05T23:04:32.927 に答える
1
  • 外部モジュールのランタイム スコープでの commons-impl

    1. コモンズ(pomの依存関係管理)=>

      +commons-api (コンパイル)

      +commons-impl (コンパイル)

      +commons-config (コンパイル)

    2. commons-impl (pom の依存関係) =>

      +commons-api (コンパイル)

      +commons-config (コンパイル)

    3. 外部モジュール (pom の依存関係) =>

      +commons-impl (ランタイム)

      +commons-api (コンパイル)

      +commons-config (コンパイル)

于 2015-10-02T11:43:38.507 に答える