Maven引入Guava后无法解析Sets.symmetricDifference方法问题求助
问题描述
我遇到一个十分奇怪的问题,我在pom.xml中添加了如下依赖:
<dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>31.0.1-jre</version> </dependency>
当我尝试编写如下代码调用时:
import com.google.common.collect.Sets; Sets.symmetricDifference(currentSet, referencedSet);
编译器提示:Cannot resolve method 'symmetricDifference' in 'Sets'
我确定该方法确实存在,也尝试过更换不同的Guava版本,但都没有解决问题。
补充1:mvn install报错信息
[ERROR] COMPILATION ERROR : [INFO] ------------------------------------------------------------- [ERROR] /C:/somePath/backend/src/main/java/someOtherPath/service/DataVerificationServiceImpl.java:[58,76] cannot find symbol symbol: method symmetricDifference(java.util.Set<org.springframework.data.util.Pair<java.time.ZonedDateTime,java.time.ZonedDateTime>>,java.util.Set<org.springframework.data.util.Pair<java.time.ZonedDateTime,java.time.ZonedDateTime>>) location: class com.google.common.collect.Sets
补充2:完整pom.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.4.5</version> </parent> <artifactId>my_project</artifactId> <version>0.0.1-SNAPSHOT</version> <name>My project</name> <description>My Project Description</description> <properties> <java.version>11</java.version> <keycloak.version>15.0.0</keycloak.version> </properties> <dependencies> <!-- Spring boot --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <dependency> <groupId>org.keycloak</groupId> <artifactId>keycloak-spring-boot-starter</artifactId> </dependency> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-boot-starter</artifactId> <version>3.0.0</version> </dependency> <dependency> <groupId>org.mapstruct</groupId> <artifactId>mapstruct-processor</artifactId> <version>1.4.2.Final</version> </dependency> <dependency> <groupId>org.mapstruct</groupId> <artifactId>mapstruct</artifactId> <version>1.4.2.Final</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok-mapstruct-binding</artifactId> <version>0.2.0</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.20</version> </dependency> <dependency> <groupId>org.mariadb.jdbc</groupId> <artifactId>mariadb-java-client</artifactId> <version>2.7.3</version> <scope>runtime</scope> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>5.5.7.Final</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-jpamodelgen</artifactId> <version>5.5.7.Final</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> </dependency> <dependency> <groupId>org.springdoc</groupId> <artifactId>springdoc-openapi-maven-plugin</artifactId> <version>1.3</version> </dependency> <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>31.0.1-jre</version> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.keycloak.bom</groupId> <artifactId>keycloak-adapter-bom</artifactId> <version>${keycloak.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <build> <finalName>application</finalName> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <layers> <enabled>true</enabled> </layers> <excludes> <exclude> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </exclude> </excludes> </configuration> </plugin> <plugin> <groupId>org.springdoc</groupId> <artifactId>springdoc-openapi-maven-plugin</artifactId> <version>1.2</version> <configuration> <apiDocsUrl>http://localhost:8080/v3/api-docs</apiDocsUrl> <outputFileName>swagger.json</outputFileName> <outputDir>srcrces</outputDir> <skip>false</skip> </configuration> <executions> <execution> <id>integration-test</id> <goals> <goal>generate</goal> </goals> </execution> </executions> </plugin> <plugin> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <configuration> <source>11</source> <target>11</target> </configuration> </plugin> </plugins> </build> </project>
问题原因与解决方法
根本原因
该问题是典型的Maven依赖冲突:
项目中引入的springfox-boot-starter:3.0.0等组件会传递引入低版本Guava,而你在pom依赖列表末尾声明的Guava 31.0.1版本,按照Maven依赖调解的「先声明优先」规则,优先级低于先引入的低版本Guava,导致项目实际加载的是没有symmetricDifference方法的低版本Guava。
解决方法
方法1:调整依赖顺序
把Guava依赖移动到dependencies列表的最靠前位置,优先加载你指定的31.0.1版本,覆盖后续传递引入的低版本。
方法2:全局锁定依赖版本(推荐)
在dependencyManagement节点中显式声明Guava的版本,强制全局所有Guava依赖都使用你指定的版本,不受传递依赖的版本影响:
<dependencyManagement> <dependencies> <!-- 放在最前面,优先级最高 --> <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>31.0.1-jre</version> </dependency> <!-- 原有keycloak依赖保留 --> <dependency> <groupId>org.keycloak.bom</groupId> <artifactId>keycloak-adapter-bom</artifactId> <version>${keycloak.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
验证操作
修改配置后执行以下命令,检查实际生效的Guava版本,确认只有31.0.1-jre版本存在即可:
mvn dependency:tree | grep guava
额外排查点
如果修改后仍有问题,检查代码中导入的Sets类是否为com.google.common.collect.Sets,避免误导入其他同名工具类。
内容的提问来源于stack exchange,提问作者msts1906
相关产品推荐
相关产品推荐

