我有一个包含两个模块的项目。核心模块在pom中有以下内容:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>project.X</groupId>
<artifactId>project_X</artifactId>
<version>42</version>
<type>pom</type>
</dependency>
</dependencies>
</dependencyManagement>
对没有范围导入声明的 pom 的依赖
同一项目的第二个模块具有以下内容:
<dependencies>
<dependency>
<groupId>project.X</groupId>
<artifactId>project_X</artifactId>
<type>pom</type>
</dependency>
</dependencies>
所有这些都工作正常,但是如果我像这样将 import 放入核心 pom 中:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>project.X</groupId>
<artifactId>project_X</artifactId>
<version>42</version>
<scope>import</scope>
<type>pom</type>
</dependency>
</dependencies>
</dependencyManagement>
那么第二个模块将无法编译,因为依赖项没有声明版本。但是,据我了解,它应该在根模块中使用范围导入进行编译,并且不应该编译,反之亦然。 有人知道这种行为的原因吗?
谢谢。
有人知道这种行为的原因吗?
这就是 15 年前实现该功能的方式:
@SuppressWarnings("checkstyle:methodlength")
private void importDependencyManagement(
Model model,
ModelBuildingRequest request,
DefaultModelProblemCollector problems,
Collection<String> importIds) {
DependencyManagement depMgmt = model.getDependencyManagement();
if (depMgmt == null) {
return;
}
String importing = model.getGroupId() + ':' + model.getArtifactId() + ':' + model.getVersion();
importIds.add(importing);
final WorkspaceModelResolver workspaceResolver = request.getWorkspaceModelResolver();
final ModelResolver modelResolver = request.getModelResolver();
ModelBuildingRequest importRequest = null;
List<DependencyManagement> importMgmts = null;
for (Iterator<Dependency> it = depMgmt.getDependencies().iterator(); it.hasNext(); ) {
Dependency dependency = it.next();
if (!"pom".equals(dependency.getType()) || !"import".equals(dependency.getScope())) {
continue;
}
//
// Here it removes managed dependency on pom
//
it.remove();
String groupId = dependency.getGroupId();
String artifactId = dependency.getArtifactId();
String version = dependency.getVersion();
而且我确实相信当前的实现与文档同步:
导入在用于定义通常属于多项目构建一部分的相关工件的“库”时最为有效。一个项目使用这些库中的一个或多个工件是相当常见的。然而,有时很难使使用工件的项目中的版本与库中分发的版本保持同步。下面的模式说明了如何创建“物料清单”(BOM) 以供其他项目使用。
项目的根是BOM POM。 它定义了将在库中创建的所有工件的版本。希望使用该库的其他项目应将此 POM 导入其 POM 的 dependencyManagement 部分
由于您不应该在 BOM 中定义依赖项(仅版本),因此定义对 BOM 的依赖项没有任何意义。