私たちは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-apiとcommons-configの両方に依存し、commons-configはcommons-apiとcommons-implの両方に依存し、 commons- implへの依存は「提供された」とマークされます(推移的な解決を防ぐため)。
ただし、これは複雑で厄介な解決策のように思われ、MavenおよびSpringとのインターフェース/impl分離を実現するためのより良い-より簡単な方法が必要だと感じています。