dka*_*sky 23 java spring maven
我们正在研究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分离.
您需要的是运行时依赖范围:
runtime - 此范围指示编译不需要依赖项,但是用于执行.它位于运行时和测试类路径中,但不是编译类路径.
(https://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html)
定义从一个impl模块到另一个impl模块的运行时依赖关系,您可以在其中使用*-beans.xml配置中的impl类.Intellij会在spring配置文件中正确识别它,但不会在代码中自动完成它们(但它会在测试代码中完成).
此外,如果有人在代码中使用这些类,则通过maven进行编译会失败,因为运行时依赖性不在编译类路径上.
简而言之,您希望 Idea 覆盖 Maven 依赖关系图,但避免将此配置保留在 idea 项目文件中?
一种选择是将实现依赖项分组到 Maven 配置文件中。默认情况下不会启用此配置文件,但您应该能够在 idea 下将其标记为活动状态。