Maven依赖版本解析问题

时间:2018-07-10 16:12:07

标签: maven scope dependencies

我遇到一个使我困惑并混淆了我对Maven理解的问题。

我正在使用具有以下结构的多模块项目

root
|_ db/pom.xml
|_ server/pom.xml

服务器pom.xml引用db pom.xml。在db / pom.xml中,我已经定义了

<dependency>
    <groupId>com.zaxxer</groupId>
    <artifactId>HikariCP</artifactId>
    <version>3.2.0</version>
</dependency>

,希望它会被服务器继承。但是我看到服务器测试抱怨缺少一种方法。当我使用

  

mvn依赖项:tree -Dverbose -Dincludes = com.zaxxer:HikariCP编译

我注意到以下内容。

[INFO] server:war:2.0-SNAPSHOT
[INFO] \- db:jar:2.0-SNAPSHOT:compile
[INFO]    \- com.zaxxer:HikariCP:jar:2.5.1:compile (version managed from 3.2.0)

因此,将2.5.1而不是3.2.0用于测试。这就解释了有关缺少方法的抱怨。

但是我很难确定这种依赖来自何处?我最好的猜测是它来自在测试范围内定义它的pom.xml的起始类型。

关于如何识别此版本定义的任何建议?我已经用谷歌搜索了,但是还没有找到解决方法。

解决了这个问题,我决定在db中定义以下内容

<dependency>
    <groupId>com.zaxxer</groupId>
    <artifactId>HikariCP</artifactId>
    <version>3.2.0</version>
    <scope>test</scope>
</dependency>

意思是我在数据库pom.xml中有两个HikariCP定义。现在,当我运行dependency:tree时,没有对2.5.1的引用。但是...如果我尝试

  

mvn验证

我在数据库中出现错误

DBConfig.java:[17,25] package com.zaxxer.hikari does not exist

这是怎么回事?

我的期望是:

  • 在db中定义的编译范围应覆盖/赢得在其他地方定义的测试范围(尽管我明白为什么可能不希望这样做)
  • 定义HikariCP的编译和测试版本不应导致找不到包错误

----已更新为请求的信息----

  

db / pom.xml

<modelVersion>4.0.0</modelVersion>
<artifactId>db</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>

<parent>
    <groupId>my.group</groupId>
    <artifactId>root</artifactId>
    <version>1.0-SNAPSHOT</version>
</parent>

<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
    </dependency>
    <dependency>
        <groupId>com.google.guava</groupId>
        <artifactId>guava</artifactId>
    </dependency>
    <dependency>
        <groupId>org.postgresql</groupId>
        <artifactId>postgresql</artifactId>
        <version>42.2.2</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-jdbc</artifactId>
    </dependency>
    <dependency>
        <groupId>javax.inject</groupId>
        <artifactId>javax.inject</artifactId>
    </dependency>
    <dependency>
        <groupId>com.zaxxer</groupId>
        <artifactId>HikariCP</artifactId>
        <version>3.2.0</version>
    </dependency>
</dependencies>
  

server / pom.xml

<modelVersion>4.0.0</modelVersion>
<artifactId>server</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>

<parent>
    <groupId>my.group</groupId>
    <artifactId>root</artifactId>
    <version>1.0-SNAPSHOT</version>
</parent>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-configuration-processor</artifactId>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-contract-stub-runner</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-tomcat</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>com.jayway.restassured</groupId>
        <artifactId>rest-assured</artifactId>
        <version>2.9.0</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>my.group</groupId>
        <artifactId>db</artifactId>
        <version>${project.version}</version>
    </dependency>
</dependencies>

根pom.xml没有定义依赖项。但是它的父级为TPL定义了通用版本,以此类推,以至于无法在此处列出。

我还发现了hikaricp版本2.5.1的定义。它处于spring-boot依赖关系中。这很可能是由服务器的spring-boot-starter-tomcat引入的。但是它也可以通过数据库的spring-boot-starter-jdbc进入。

我还将注意到,如果我还在服务器pom.xml中定义HikariCP依赖关系,也没有问题。

0 个答案:

没有答案