升级Java与WildFly后执行测试抛出NoSuchMethodError求助
升级Java/WildFly后CDI测试抛出NoSuchMethodError问题解决
异常信息
java.lang.NoSuchMethodError: 'int javax.enterprise.inject.spi.ObserverMethod.getPriority()' at org.jboss.weld.resolution.TypeSafeObserverResolver$ObserverMethodComparator.compare(TypeSafeObserverResolver.java:55) at org.jboss.weld.resolution.TypeSafeObserverResolver$ObserverMethodComparator.compare(TypeSafeObserverResolver.java:46) at java.base/java.util.TimSort.countRunAndMakeAscending(TimSort.java:355) at java.base/java.util.TimSort.sort(TimSort.java:220) at java.base/java.util.Arrays.sort(Arrays.java:1515) at java.base/java.util.ArrayList.sort(ArrayList.java:1750) at java.base/java.util.Collections.sort(Collections.java:179) at org.jboss.weld.resolution.TypeSafeObserverResolver.sortResult(TypeSafeObserverResolver.java:106) at org.jboss.weld.resolution.TypeSafeObserverResolver.sortResult(TypeSafeObserverResolver.java:44) at org.jboss.weld.resolution.TypeSafeResolver$ResolvableToBeanCollection.apply(TypeSafeResolver.java:52) at org.jboss.weld.resolution.TypeSafeResolver$ResolvableToBeanCollection.apply(TypeSafeResolver.java:43) at org.jboss.weld.util.cache.ReentrantMapBackedComputingCache.lambda$null$0(ReentrantMapBackedComputingCache.java:55) at org.jboss.weld.util.LazyValueHolder$1.computeValue(LazyValueHolder.java:32) at org.jboss.weld.util.LazyValueHolder.get(LazyValueHolder.java:46) at org.jboss.weld.util.cache.ReentrantMapBackedComputingCache.getValue(ReentrantMapBackedComputingCache.java:72) at org.jboss.weld.resolution.TypeSafeResolver.resolve(TypeSafeResolver.java:88) at org.jboss.weld.event.ObserverNotifier.resolveObserverMethods(ObserverNotifier.java:147) at org.jboss.weld.event.ObserverNotifier.fireEvent(ObserverNotifier.java:177) at org.jboss.weld.event.ObserverNotifier.fireEvent(ObserverNotifier.java:171) at org.jboss.weld.bootstrap.events.AbstractContainerEvent.fire(AbstractContainerEvent.java:53) at org.jboss.weld.bootstrap.events.AbstractDefinitionContainerEvent.fire(AbstractDefinitionContainerEvent.java:44) at org.jboss.weld.bootstrap.events.BeforeBeanDiscoveryImpl.fire(BeforeBeanDiscoveryImpl.java:54) at org.jboss.weld.bootstrap.WeldStartup.startInitialization(WeldStartup.java:407) at org.jboss.weld.bootstrap.WeldBootstrap.startInitialization(WeldBootstrap.java:79) at org.jboss.weld.environment.se.Weld.initialize(Weld.java:802) at org.jglue.cdiunit.CdiRunner.createTest(CdiRunner.java:129) at org.junit.runners.BlockJUnit4ClassRunner$1.runReflectiveCall(BlockJUnit4ClassRunner.java:266) at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) at org.junit.runners.BlockJUnit4ClassRunner.methodBlock(BlockJUnit4ClassRunner.java:263)
当前POM依赖配置
<dependency> <groupId>jakarta.enterprise</groupId> <artifactId>jakarta.enterprise.cdi-api</artifactId> <version>2.0.2</version> <scope>test</scope> </dependency> <dependency> <groupId>org.jboss.weld.se</groupId> <artifactId>weld-se-shaded</artifactId> <version>3.1.0.Final</version> <scope>test</scope> </dependency> <!-- cdi-unit should be after javaee --> <dependency> <groupId>org.jglue.cdi-unit</groupId> <artifactId>cdi-unit</artifactId> <version>4.1.0</version> <scope>test</scope> </dependency>
解决方案
1. 升级cdi-unit版本
cdi-unit 4.1.0仅支持CDI 1.2和Weld 2.x,与你当前使用的CDI 2.0(jakarta.enterprise.cdi-api 2.0.2)和Weld 3.1.0不兼容。需要升级到支持CDI 2.0的cdi-unit版本,比如5.0.0或更高:
<dependency> <groupId>org.jglue.cdi-unit</groupId> <artifactId>cdi-unit</artifactId> <version>5.0.0</version> <scope>test</scope> </dependency>
2. 排查并排除依赖冲突
执行mvn dependency:tree命令,检查是否有旧版javax.enterprise:cdi-api(非jakarta前缀)被间接引入。如果存在,在cdi-unit依赖中添加排除规则:
<dependency> <groupId>org.jglue.cdi-unit</groupId> <artifactId>cdi-unit</artifactId> <version>5.0.0</version> <scope>test</scope> <exclusions> <exclusion> <groupId>javax.enterprise</groupId> <artifactId>cdi-api</artifactId> </exclusion> </exclusions> </dependency>
3. 验证类路径一致性
确保项目类路径中只有jakarta.enterprise.cdi-api(2.0.2版本),没有其他版本的CDI API包。可以通过IDE的依赖分析工具(比如IntelliJ的Dependency Analyzer)确认。
4. 清理并重新构建项目
执行以下命令清理旧构建文件并重新编译:
mvn clean install -U
内容的提问来源于stack exchange,提问作者PurryFury
相关产品推荐
相关产品推荐

