maven - 用于接口和Spring实现的独立模块

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-apicommons-config,commons-config将依赖于commons-apicommons-impl,并且依赖于commons-impl标记为"提供"(以防止传递解析).

然而,这似乎是一个复杂而笨拙的解决方案,我们认为必须有一个更好 - 更简单的方法来实现与Maven和Spring的接口/ impl分离.

Fra*_*man 7

您需要的是运行时依赖范围:

runtime - 此范围指示编译不需要依赖项,但是用于执行.它位于运行时和测试类路径中,但不是编译类路径.

(https://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html)

定义从一个impl模块到另一个impl模块的运行时依赖关系,您可以在其中使用*-beans.xml配置中的impl类.Intellij会在spring配置文件中正确识别它,但不会在代码中自动完成它们(但它会在测试代码中完成).

此外,如果有人在代码中使用这些类,则通过maven进行编译会失败,因为运行时依赖性不在编译类路径上.


mre*_*isz 1

简而言之,您希望 Idea 覆盖 Maven 依赖关系图,但避免将此配置保留在 idea 项目文件中?

一种选择是将实现依赖项分组到 Maven 配置文件中。默认情况下不会启用此配置文件,但您应该能够在 idea 下将其标记为活动状态。