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

Wildfly 12上集成Liquibase CDI启动报错求助

解决Wildfly 12 + JDK 10下Liquibase CDI集成启动报错问题

针对你遇到的WELD-001408: Unsatisfied dependencies for type ResourceAccessor with qualifiers @LiquibaseType错误,结合Wildfly 12(Weld 3.x/CDI 2.0)和JDK 10的环境特性,以及你提到的“只要引入liquibase-cdi依赖就触发错误”的情况,我整理了几个可行的解决方案:

1. 升级Liquibase版本(最推荐)

Liquibase 3.6.1是2018年的旧版本,对CDI 2.0和JDK 10的支持不完善。建议升级到3.10.x或更高的4.x稳定版本,这些版本修复了不少CDI集成的兼容性问题,尤其适配Wildfly 10+的环境。

修改你的Maven依赖:

<dependency>
    <groupId>org.liquibase</groupId>
    <artifactId>liquibase-core</artifactId>
    <version>4.9.1</version> <!-- 或更高稳定版 -->
</dependency>
<dependency>
    <groupId>org.liquibase</groupId>
    <artifactId>liquibase-cdi</artifactId>
    <version>4.9.1</version>
</dependency>

升级后保持你现有的Producer代码不变,大概率能解决依赖注入的问题。

2. 调整Wildfly的类加载策略

Wildfly 12可能自带了部分Liquibase相关模块,导致应用的Liquibase依赖和容器自带类冲突。可以通过jboss-deployment-structure.xml文件排除容器的Liquibase模块,强制使用应用打包的版本:

在WAR项目的WEB-INF目录下创建jboss-deployment-structure.xml,内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<jboss-deployment-structure>
    <deployment>
        <exclude-subsystems>
            <subsystem name="liquibase"/>
        </exclude-subsystems>
        <exclusions>
            <module name="org.liquibase"/>
        </exclusions>
    </deployment>
</jboss-deployment-structure>

这个配置会让Wildfly不加载自带的Liquibase模块,完全使用你Maven依赖中的版本,避免类加载冲突导致的依赖注入失败。

3. 修改Producer类的上下文范围

你当前的Producer类使用了@Dependent范围,在Wildfly 12的Weld 3.x中,这个范围的Bean可能无法被正确扫描或注入到CDILiquibase的生命周期中。可以尝试将Producer类的注解改为@ApplicationScoped:

import java.sql.SQLException;
import javax.annotation.Resource;
import javax.enterprise.context.ApplicationScoped; // 替换@Dependent
import javax.enterprise.inject.Produces;
import javax.sql.DataSource;
import liquibase.integration.cdi.CDILiquibaseConfig;
import liquibase.integration.cdi.annotations.LiquibaseType;
import liquibase.resource.ClassLoaderResourceAccessor;
import liquibase.resource.ResourceAccessor;

@ApplicationScoped // 修改此处
public class LiquibaseProducer {
    @Resource
    private DataSource myDataSource;
    private static final String LIQUIBASE_MASTERFILE_PATH = "META-INF/liquibase/master.xml";

    @Produces
    @LiquibaseType
    public CDILiquibaseConfig createConfig() {
        CDILiquibaseConfig config = new CDILiquibaseConfig();
        config.setChangeLog(LIQUIBASE_MASTERFILE_PATH);
        return config;
    }

    @Produces
    @LiquibaseType
    public DataSource createDataSource() throws SQLException {
        return myDataSource;
    }

    @Produces
    @LiquibaseType
    public ResourceAccessor create() {
        return new ClassLoaderResourceAccessor(getClass().getClassLoader());
    }
}

这个调整能确保Producer的Bean在应用启动时就被初始化,并且能被CDILiquibase正确获取。

4. 验证CDI扫描配置

确保Wildfly能扫描到你的Producer类:

  • 检查WAR包中是否包含beans.xml文件(CDI 2.0允许无beans.xml,但部分容器可能需要显式声明)。在WEB-INF下创建beans.xml,内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/beans_2_0.xsd"
       version="2.0" bean-discovery-mode="all">
</beans>

bean-discovery-mode="all"会让Weld扫描所有带CDI注解的类,确保你的Producer被正确识别。


内容的提问来源于stack exchange,提问作者bitcanvas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:15:02