我已经在让 Maven 处理我的应用程序中模块之间的依赖关系时陷入困境,我想知道前进的最佳实践方法是什么。
我有一组用于我的所有应用程序的库,如下所示:
<shared-code>
|---- common-lib
|---- REST-lib
|---- WebApp-lib
|---- REST-Pom
\---- WebApp-Pom
实际上还有更多文物,但重要的是:
- common-lib 当我存储所有通用代码时
- REST-lib 和 WebApp-lib 是依赖于 common-lib 的更专业的库
- REST-Pom 和 WebApp-Pom 是不同类型应用程序的父 POM,最重要的是,它们依赖于 REST-lib 或 WebApp-lib
- 中的所有 5 个 Artifact 都是一起发布的,并且始终具有相同的版本。
当我来写我的申请时,我得到了:
<application-code>
|---- parent-pom
|---- module-1
|---- module-2
\---- module-3
- parent-pom 扩展 REST-Pom 或 WebApp-Pom 并添加项目特定信息(例如 SCM 信息)
- module-1、module-2、module-3 均扩展parent-pom
- 与 一样,其中的所有 Artifact 都与通用版本一起发布,但(重要的是)与 不同。
遵循my previous question的建议,我一直以以下形式定义依赖关系:
<dependency>
<artifactId>common-lib</artifactId>
<groupId>${project.groupId}</groupId>
<version>${project.parent.version}</version>
</dependency>
我喜欢这个,因为当我对所有版本进行发布设置时,我不必遍历每个 POM。
问题是 ${project.parent.version}
是针对每个 POM 单独评估的,并且并不总是评估为相同的东西。
- parent-pom 将 ${project.parent.version} 评估为 REST-Pom 或 WebApp-Pom 的版本,该版本与 common-lib 同步,因此我们得到了正确的值。
- module-1、module-2 和 module-3 将 ${project.parent.version} 计算为parent-pom 的版本,这是不同的。
我(认为)我需要的是一个可以用作版本的表达式,它表示“这个项目的版本,而不是扩展它的东西”
最佳答案
父 pom 还旨在保存子项包含的依赖项 ( <dependencies>
) 或按需包含的依赖项 ( <dependencyManagement>
)。
在 dependencyManagement
中定义它们父pom的元素:
<dependencyManagement>
<dependencies>
<dependency>
<artifactId>common-lib</artifactId>
<groupId>${project.groupId}</groupId>
<version>${project.parent.version}</version>
</dependency>
<!-- and so for -->
</dependencies>
</dependencyManagement>
并让子项目在自己的 pom 中引用它们:
<dependencies>
<dependency>
<artifactId>common-lib</artifactId>
<groupId>${project.groupId}</groupId>
</dependency>
<!-- and so for -->
</dependencies>
您可以注意到,依赖项版本不需要也不应该由子项设置,因为它是由父项 pom 定义的。
关于java - 库层次结构的 Maven 依赖问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48924859/