我们正在研究Mavenizing我们的java项目,我们希望在每个模块的接口和实现之间建立一个清晰的分离.为了做到这一点,我们希望将每个模块分成两个子模块,一个用于它们使用的接口和数据对象,另一个用于实现.例如:
+commons
+commons-api
+commons-impl
Run Code Online (Sandbox Code Playgroud)
将配置模块的POM,使得没有模块依赖于impl子模块.这样,来自一个模块的代码就无法"看到"另一个模块的实现细节.
我们遇到麻烦的是,将Spring XML放在哪里.在我们的项目中,我们使用通配符导入自动导入spring XML文件
<import resource="classpath*:**/*-beans.xml"/>
这样,Spring XML的位置在运行时并不重要,因为所有模块都被加载到同一个类加载器中,并且POM中严格的单向依赖规则不适用.
但是,在开发过程中,我们希望IDE(我们使用Intellij IDEA)识别从spring XML引用的实现类.我们还希望IDEA识别其他模块中定义的bean.
如果我们把API子模块春天个XML - 他们不会"看见"在IMPL子模块的实现类.如果我们将它们放在impl子模块中,它们的bean将不会从其他模块中"看到".可能可以将IDEA项目配置为从没有依赖项的模块中识别spring XML,但我们更喜欢POM保存所有项目结构信息而不依赖于IDEA项目文件.
我们考虑创建第三个子模块只是为了保存Spring XML(也许还有hibernate xmls).例如:
+commons
+commons-api
+commons-impl
+commons-config
Run Code Online (Sandbox Code Playgroud)
外部模块将依赖于commons-api和commons-config,commons-config将依赖于commons-api和commons-impl,并且依赖于commons-impl标记为"提供"(以防止传递解析).
然而,这似乎是一个复杂而笨拙的解决方案,我们认为必须有一个更好 - 更简单的方法来实现与Maven和Spring的接口/ impl分离.