maven Pom类型导入的依赖项不能在没有版本的情况下使用

oknrviil  于 2024-01-06  发布在  Maven
关注(0)|答案(1)|浏览(337)

我有一个包含两个模块的项目。核心模块在pom中包含以下内容:

  1. <dependencyManagement>
  2. <dependencies>
  3. <dependency>
  4. <groupId>project.X</groupId>
  5. <artifactId>project_X</artifactId>
  6. <version>42</version>
  7. <type>pom</type>
  8. </dependency>
  9. </dependencies>
  10. </dependencyManagement>

字符串
此对pom的依赖项声明时未导入作用域
并且同一项目的第二模块具有以下内容:

  1. <dependencies>
  2. <dependency>
  3. <groupId>project.X</groupId>
  4. <artifactId>project_X</artifactId>
  5. <type>pom</type>
  6. </dependency>
  7. </dependencies>


所有这些都很好用,但是如果我把import放在core pom里,就像这样:

  1. <dependencyManagement>
  2. <dependencies>
  3. <dependency>
  4. <groupId>project.X</groupId>
  5. <artifactId>project_X</artifactId>
  6. <version>42</version>
  7. <scope>import</scope>
  8. <type>pom</type>
  9. </dependency>
  10. </dependencies>
  11. </dependencyManagement>


那么第二个模块将不会编译,因为依赖项没有声明版本。但是,据我所知,它应该在根模块中使用范围导入进行编译,如果相反的话,则不应该进行编译。有人知道这种行为的原因吗?
谢谢.

rqqzpn5f

rqqzpn5f1#

有人知道这种行为的原因吗?
这就是该功能在15年前实现的方式:

  1. @SuppressWarnings("checkstyle:methodlength")
  2. private void importDependencyManagement(
  3. Model model,
  4. ModelBuildingRequest request,
  5. DefaultModelProblemCollector problems,
  6. Collection<String> importIds) {
  7. DependencyManagement depMgmt = model.getDependencyManagement();
  8. if (depMgmt == null) {
  9. return;
  10. }
  11. String importing = model.getGroupId() + ':' + model.getArtifactId() + ':' + model.getVersion();
  12. importIds.add(importing);
  13. final WorkspaceModelResolver workspaceResolver = request.getWorkspaceModelResolver();
  14. final ModelResolver modelResolver = request.getModelResolver();
  15. ModelBuildingRequest importRequest = null;
  16. List<DependencyManagement> importMgmts = null;
  17. for (Iterator<Dependency> it = depMgmt.getDependencies().iterator(); it.hasNext(); ) {
  18. Dependency dependency = it.next();
  19. if (!"pom".equals(dependency.getType()) || !"import".equals(dependency.getScope())) {
  20. continue;
  21. }
  22. //
  23. // Here it removes managed dependency on BOM
  24. //
  25. it.remove();
  26. String groupId = dependency.getGroupId();
  27. String artifactId = dependency.getArtifactId();
  28. String version = dependency.getVersion();

字符串
我相信当前的实现与文档同步:
当导入用于定义相关构件的“库”时是最有效的,这些构件通常是多项目构建的一部分。一个项目使用这些库中的一个或多个构件是相当常见的。然而,有时很难保持项目中使用工件的版本与库中分发的版本同步。下面的模式说明了“物料清单”(BOM)可供其他项目使用。
项目的根是BOM POM。它定义将在库中创建的所有工件的版本。希望使用该库的其他项目应将此POM导入其POM的dependencyManagement部分
因为你不应该在BOM中定义依赖关系(只有版本,即托管依赖关系),所以定义BOM上的依赖关系没有任何意义。

展开查看全部

相关问题