部署时触发java.lang.NoSuchMethodError(ImmutableSet.builder())错误求助
解决WildFly部署时的java.lang.NoSuchMethodError问题
问题详情
部署项目时执行deploy目标失败,报错信息如下:
WFLYCTL0062: 复合操作失败并回滚,失败步骤为Operation step-1,其中jboss.undertow.deployment.default-server.default-host./服务启动异常,根源为java.lang.NoSuchMethodError: com.google.common.collect.ImmutableSet.builder()Lcom/google/common/collect/ImmutableSet$Builder;
当前pom.xml依赖配置
<dependency> <groupId>com.google.inject</groupId> <artifactId>guice</artifactId> <version>5.0.1</version> </dependency> <dependency> <groupId>com.google.inject.extensions</groupId> <artifactId>guice-assistedinject</artifactId> <version>5.0.1</version> </dependency> <dependency> <groupId>com.google.inject.extensions</groupId> <artifactId>guice-multibindings</artifactId> <version>4.2.3</version> </dependency> <dependency> <groupId>io.github.bonigarcia</groupId> <artifactId>webdrivermanager</artifactId> <version>5.1.0</version> </dependency> <dependency> <groupId>com.google.inject.extensions</groupId> <artifactId>guice-servlet</artifactId> <version>5.0.1</version> </dependency> <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>31.0.1-jre</version> </dependency>
问题原因
这个错误是Guice版本不一致引发的Guava依赖冲突:
- 项目中Guice核心及大部分扩展使用5.0.1版本,但
guice-multibindings用的是4.2.3,不同版本的Guice依赖的Guava版本存在差异,低版本Guice依赖的旧版Guava中,ImmutableSet.builder()方法签名与高版本不匹配,导致类加载时找不到对应方法。 - 另外WildFly容器本身可能自带旧版Guava,也会和项目打包的高版本Guava产生类加载冲突。
解决步骤
1. 统一Guice及其扩展版本
将所有Guice相关依赖的版本统一为5.0.1,避免版本不一致带来的依赖冲突。修改后的依赖配置如下:
<dependency> <groupId>com.google.inject</groupId> <artifactId>guice</artifactId> <version>5.0.1</version> </dependency> <dependency> <groupId>com.google.inject.extensions</groupId> <artifactId>guice-assistedinject</artifactId> <version>5.0.1</version> </dependency> <dependency> <groupId>com.google.inject.extensions</groupId> <artifactId>guice-multibindings</artifactId> <version>5.0.1</version> </dependency> <dependency> <groupId>io.github.bonigarcia</groupId> <artifactId>webdrivermanager</artifactId> <version>5.1.0</version> </dependency> <dependency> <groupId>com.google.inject.extensions</groupId> <artifactId>guice-servlet</artifactId> <version>5.0.1</version> </dependency> <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>31.0.1-jre</version> </dependency>
2. 排除容器自带的Guava(若统一版本后仍报错)
如果修改版本后还是出现相同错误,需要强制项目使用自身打包的Guava版本,排除WildFly自带的旧版Guava。
在项目src/main/webapp/WEB-INF/目录下创建jboss-deployment-structure.xml文件,内容如下:
<jboss-deployment-structure> <deployment> <exclusions> <module name="com.google.guava" /> </exclusions> </deployment> </jboss-deployment-structure>
3. 检查依赖树确认无冲突
执行Maven命令查看依赖树,确保没有旧版Guava被间接引入:
mvn dependency:tree
如果发现有其他依赖引入旧版Guava,可在对应依赖中添加排除配置。
内容的提问来源于stack exchange,提问作者Linidu Praneeth Gunathilaka
相关产品推荐
相关产品推荐

