我遇到一个使我困惑并混淆了我对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 / 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依赖关系,也没有问题。