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