为什么我的嵌套Maven依赖项在编译时没有显示

nof*_*all 5 java maven

我有一个名为my-library的库,该与Maven打包在一起并存储在私有Nexus存储库中。它会编译并正确上传到我的仓库中,并在pom.xml文件中指定了以下依赖项:

<dependencies>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>jcl-over-slf4j</artifactId>
        <version>1.7.13</version>
        <scope>compile</scope>
    </dependency>
    <dependency>
        <groupId>com.google.protobuf</groupId>
        <artifactId>protobuf-java</artifactId>
        <version>3.1.0</version>
        <scope>compile</scope>
    </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
        <scope>test</scope>
    </dependency>
</dependencies>
Run Code Online (Sandbox Code Playgroud)

我使用以下块将这种依赖关系包含在另一个项目my-child-project中pom.xml

<repositories>
    <repository>
        <id>MyRepo</id>
        <name>My Maven Repository</name>
        <url>http://localhost:8081/nexus/repo</url>
    </repository>
</repositories>
...
<dependencies>
    <dependency>
        <groupId>com.my.group</groupId>
        <artifactId>my-library</artifactId>
        <scope>compile</scope>
        <version>1.0.0</version>
    </dependency>
</dependencies>
Run Code Online (Sandbox Code Playgroud)

当我运行mvn clean install我的孩子项目,看来Maven是能够找到和下载我的图书馆,但不是嵌套的依赖上com.google.protobuf,除非我明确包括它在pom.xml我的孩子项目。我可以确认Maven在运行时可以看到我的依赖关系,但看不到嵌套的依赖关系mvn dependency:tree

...
[INFO] +- org.springframework.data:spring-data-redis:jar:1.7.1.RELEASE:compile
[INFO] |  +- org.springframework.data:spring-data-keyvalue:jar:1.1.1.RELEASE:compile
[INFO] |  \- org.springframework:spring-oxm:jar:4.2.5.RELEASE:compile
[INFO] +- redis.clients:jedis:jar:2.8.1:compile
[INFO] +- javax.servlet:javax.servlet-api:jar:3.1.0:provided
[INFO] +- com.my.group:my-library:jar:1.0.0:compile
[INFO] +- com.fasterxml.jackson.core:jackson-annotations:jar:2.4.4:compile
...
Run Code Online (Sandbox Code Playgroud)

嵌套库依赖关系应该这样工作吗?我认为其他依赖关系中的嵌套依赖关系会由Maven在编译范围内自动解决并下载。我希望只在我的库而不是my-child-project中列出嵌套的依赖项,但这似乎不起作用。

小智 1

首先,父pom.xml应该在dependency标签之外添加dependencyManagement标签。这只是为了在一处管理模块依赖项,而不是实际将它们导入到您的项目中。

您仍然需要在子模块的 pom.xml 中声明它。(但是你可以省略版本标签,因为它将从父pom继承)