为什么需要指定版本依赖?

why version dependency needs to be specified?

我有 pom.xml 个赞,

<dependencyManagement>
    <dependencies>

        <dependency>
            <groupId>org.eclipse.microprofile</groupId>
            <artifactId>microprofile</artifactId>
            <version>1.3</version>
            <type>pom</type>
            <scope>import</scope>

        </dependency>


    </dependencies>
</dependencyManagement>

<dependencies>
    <dependency>
        <groupId>javax</groupId>
        <artifactId>javaee-api</artifactId>
        <version>7.0</version>
        <scope>provided</scope>
    </dependency>

    <dependency>
        <groupId>javax.enterprise</groupId>
        <artifactId>cdi-api</artifactId>
        <version>1.2</version>
        <scope>provided</scope>
    </dependency>
</dependencies>

我无法理解为什么我需要在依赖项下的 cdi-api 上指定版本,而它已经在 microprofile 中定义(在 dependencymanagement 内部)。

org.eclipse.microprofile:microprofile artifact 声明对 javax.enterprise:cdi-api 的依赖,因此如果您在 POM 中将 org.eclipse.microprofile:microprofile 声明为依赖,则 javax.enterprise:cdi-api 将被传递。

在您问题的示例中,您在 <dependencyManagement> 部分中声明了 org.eclipse.microprofile:microprofile,此部分整合了对每个依赖项的版本、范围和排除项的管理,但为了在您的项目 必须 将其包含在 <dependency> 部分。

因此,如果您将此添加到 <dependency> 部分...

<dependency>
    <groupId>org.eclipse.microprofile</groupId>
    <artifactId>microprofile</artifactId>    
</dependency>

...然后 org.eclipse.microprofile:microprofile 将包含在您的项目中,因此 javax.enterprise:cdi-api 将被传递地包含并且您不必显式声明它。

此 pom 不是定义依赖项版本的标准 bom,但必须像标准依赖项一样使用:https://github.com/eclipse/microprofile-bom

This style of BOM does not go in a dependencyManagement section, using import scope, and you cannot add dependencies declared in the BOM without version elements as is typically done with that style of BOM.

你实际上需要依赖那个 pom:

<dependency>
    <groupId>org.eclipse.microprofile</groupId>
    <artifactId>microprofile</artifactId>
    <type>pom</type>    
</dependency>

如果您希望一切正常,请不要忘记添加 pom 类型并指定版本或在您的依赖项管理中使用 pom 类型引用此版本。 glytching 忘记了 pom 类型,这就是为什么这不起作用。