Wildfly 12上集成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

