You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

升级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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 14:05:57