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

时间:2016-10-31 22:26:59

标签: 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>

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

<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>

当我在 my-child-project 中运行mvn clean install时,maven似乎能够找到并下载 my-库 ,但不是com.google.protobuf上的嵌套依赖项,除非我明确地将其包含在{{1>} my-child-project 。我可以确认 Maven 在运行pom.xml时可以看到我的依赖关系但不能看到嵌套的依赖关系:

mvn dependency:tree

这是嵌套库依赖项应该如何工作的?我认为其他依赖项中的嵌套依赖项由Maven在编译范围内自动解析和下载。我希望只列出 my-library 中的嵌套依赖项,而不是 my-child-project ,但是它似乎不起作用。

2 个答案:

答案 0 :(得分:1)

firtly,父pom.xml应该在dependencies标记之外添加dependencyManagement标记。它只是在一个地方管理模块依赖项,但实际上并没有将它们导入到你的项目中

你仍然有2个在你的子模块的pom中声明它(但你不能省略版本标签,实际上不能继承父模块pom)

答案 1 :(得分:0)

@ herokingsley的回答让我得到了正确的配置。我犹豫不决,因为答案似乎表明我需要重新声明我孩子的嵌套依赖。当我最终尝试它时,我故意没有在 my-child-project 中声明嵌套依赖,它仍然像魅力一样工作。这是解决我的问题的代码。我将 my-library 中的代码更改为以下内容:

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>com.google.protobuf</groupId>
            <artifactId>protobuf-java</artifactId>
            <version>3.1.0</version>
            <scope>compile</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

<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>
    </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
        <scope>test</scope>
    </dependency>
</dependencies>

上述更改已足够,因为在运行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.google.protobuf:protobuf-java:jar:3.1.0:compile
[INFO] +- com.fasterxml.jackson.core:jackson-annotations:jar:2.4.4:compile
...