maven - 用于接口和实现Spring的独立模块
我们正在努力对Java项目进行Mavenization,我们希望在每个模块的接口和实现之间建立清晰的分离。为此,我们希望将每个模块拆分为两个子模块,一个用于它们使用的接口和数据对象,另一个用于实现。例如:
+commons
+commons-api
+commons-impl
模块的 POM 将配置为没有模块依赖于 impl 子模块。这样,来自一个模块的代码将无法“看到”另一个模块的实现细节。
我们遇到的问题是,将我们的弹簧XML放在哪里。在我们的项目中,我们使用通配符导入自动导入spring XML文件,例如
<import resource="classpath*:**/*-beans.xml"/>
这样,Spring XML的位置在运行时并不重要,因为所有模块都加载到同一个类加载器中,并且POV中严格的单向依赖规则不适用。
但是,在开发过程中,我们希望IDE(我们使用Intellij IDEA)来识别从弹簧XL引用的实现类。我们还希望IDEA能够识别其他模块中定义的bean。
如果我们把弹簧XML放在API子模块中 - 它们不会“看到”impl子模块中的实现类。如果我们将它们放在 impl 子模块中,它们的 bean 将不会从其他模块中“看到”。可能可以将IDEA项目配置为从没有依赖关系的模块中识别弹簧XL,但是我们更喜欢我们的POM来保存所有项目结构信息,而不是依赖IDEA项目文件。
我们考虑创建第三个子模块来保存Spring XML(可能还有休眠xml)。例如:
+commons
+commons-api
+commons-impl
+commons-config
外部模块将同时依赖于 commons-api 和 commons-config,commons-config 将同时依赖于 commons-api 和 commons-impl,对 commons-impl 的依赖性标记为“提供”(以防止传递解析)。
然而,这似乎是一个复杂而尴尬的解决方案,我们认为必须有一种更好 - 更简单的方法来实现Maven和Spring的界面/impl分离。