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

oknrviil  于 5个月前  发布在  Maven
关注(0)|答案(1)|浏览(68)

我有一个包含两个模块的项目。核心模块在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放在core pom里,就像这样:

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>project.X</groupId>
            <artifactId>project_X</artifactId>
            <version>42</version>
            <scope>import</scope>
            <type>pom</type>
        </dependency>
    </dependencies>
</dependencyManagement>


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

rqqzpn5f

rqqzpn5f1#

有人知道这种行为的原因吗?
这就是该功能在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 BOM
        //
        it.remove();

        String groupId = dependency.getGroupId();
        String artifactId = dependency.getArtifactId();
        String version = dependency.getVersion();

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

相关问题