java - maven - 用于 Spring 接口(interface)和实现的独立模块

标签 java spring maven

我们正在对我们的 java 项目进行 Maven 化,我们希望在每个模块的接口(interface)和实现之间建立一个清晰的分离。 为此,我们希望将每个模块分成两个子模块,一个用于它们使用的接口(interface)和数据对象,另一个用于实现。 例如:

 +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-apicommons-config 并且 commons-config 将依赖于两个 commons -apicommons-impl,对 commons-impl 的依赖标记为“已提供”(以防止传递解析)。

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

最佳答案

你需要的是一个运行时依赖范围:

runtime - This scope indicates that the dependency is not required for compilation, but is for execution. It is in the runtime and test classpaths, but not the compile classpath.

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

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

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

关于java - maven - 用于 Spring 接口(interface)和实现的独立模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14856225/

相关文章:

android - maven构建android项目: specify the location of aidl file

java - 在 Java 中实现通用接口(interface)的枚举常量

java - Eclipse 生成的哈希码

java - Java 控制台应用程序中的 Guice 自定义范围进入和退出

java - 寻找第 10001 个质数

用于长时间运行流程的 Spring SSE

Java AOP JoinPoint 获取不到参数名

eclipse - 如何从 Eclipse 安装中删除 m2eclipse?

java - 使用安全的 RESTful API

ant - Maven 原型(prototype)的替代方案