Pom类型导入的依赖没有版本就无法使用

问题描述 投票:0回答:1

我有一个包含两个模块的项目。核心模块在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>

那么第二个模块将无法编译,因为依赖项没有声明版本。但是,据我了解,它应该在根模块中使用范围导入进行编译,并且不应该编译,反之亦然。 有人知道这种行为的原因吗?

谢谢。

maven pom.xml scopes
1个回答
0
投票

有人知道这种行为的原因吗?

这就是 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 的依赖项没有任何意义。

© www.soinside.com 2019 - 2024. All rights reserved.