IDEA运行Spring Boot多模块项目报NoClassDefFoundError: liquibase/Scope
问题表现
- Spring Boot整合Liquibase的多模块项目,执行
mvn spring-boot:run命令可正常启动,通过IntelliJ IDEA直接启动主类时启动失败 - 报错核心为Spring容器创建名为
liquibase的Bean失败,实例化SpringLiquibase时抛出异常,根因为类缺失:java.lang.NoClassDefFoundError: liquibase/Scope
底层触发ClassNotFoundException: liquibase.Scope
完整错误日志:
2022-07-15 14:22:36 ERROR 6908 --- [ main] o.s.boot.SpringApplication : Application run failed org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'liquibase' defined in class path resource [org/springframework/boot/autoconfigure/liquibase/LiquibaseAutoConfiguration$LiquibaseConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [liquibase.integration.spring.SpringLiquibase]: Factory method 'liquibase' threw exception; nested exception is java.lang.NoClassDefFoundError: liquibase/Scope at spring.beans@5.3.20/org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:658) at spring.beans@5.3.20/org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:638) at spring.beans@5.3.20/org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1352) at spring.beans@5.3.20/org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1195) at spring.beans@5.3.20/org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:582) at spring.beans@5.3.20/org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) at spring.beans@5.3.20/org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) at spring.beans@5.3.20/org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) at spring.beans@5.3.20/org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) at spring.beans@5.3.20/org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) at spring.beans@5.3.20/org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:322) at spring.beans@5.3.20/org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) at spring.context@5.3.20/org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1154) at spring.context@5.3.20/org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:908) at spring.context@5.3.20/org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:583) at spring.boot@2.7.0/org.springframework.boot.web.reactive.context.ReactiveWebServerApplicationContext.refresh(ReactiveWebServerApplicationContext.java:66) at spring.boot@2.7.0/org.springframework.boot.SpringApplication.refresh(SpringApplication.java:734) at spring.boot@2.7.0/org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:408) at spring.boot@2.7.0/org.springframework.boot.SpringApplication.run(SpringApplication.java:308) at spring.boot@2.7.0/org.springframework.boot.SpringApplication.run(SpringApplication.java:1306) at spring.boot@2.7.0/org.springframework.boot.SpringApplication.run(SpringApplication.java:1295) at package/module1.Application.main(Application.java:23) Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [liquibase.integration.spring.SpringLiquibase]: Factory method 'liquibase' threw exception; nested exception is java.lang.NoClassDefFoundError: liquibase/Scope at spring.beans@5.3.20/org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:185) at spring.beans@5.3.20/org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:653) ... 21 common frames omitted Caused by: java.lang.NoClassDefFoundError: liquibase/Scope at liquibase.integration.spring.SpringLiquibase.<init>(SpringLiquibase.java:56) at spring.boot.autoconfigure@2.7.0/org.springframework.boot.autoconfigure.liquibase.DataSourceClosingSpringLiquibase.<init>(DataSourceClosingSpringLiquibase.java:36) at spring.boot.autoconfigure@2.7.0/org.springframework.boot.autoconfigure.liquibase.LiquibaseAutoConfiguration$LiquibaseConfiguration.createSpringLiquibase(LiquibaseAutoConfiguration.java:113) at spring.boot.autoconfigure@2.7.0/org.springframework.boot.autoconfigure.liquibase.LiquibaseAutoConfiguration$LiquibaseConfiguration.liquibase(LiquibaseAutoConfiguration.java:90) at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104) at java.base/java.lang.reflect.Method.invoke(Method.java:577) at spring.beans@5.3.20/org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:154) ... 22 common frames omitted Caused by: java.lang.ClassNotFoundException: liquibase.Scope at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641) at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521) ... 29 common frames omitted Process finished with exit code 1
当前报错模块的module-info.java配置如下:
open module module1 { requires spring.boot; requires spring.cloud.commons; requires spring.boot.autoconfigure; requires lombok; requires spring.context; requires spring.core; requires org.slf4j; requires spring.data.jpa; requires org.apache.logging.slf4j; requires spring.web; requires com.fasterxml.jackson.annotation; requires spring.cloud.openfeign.core; requires org.bouncycastle.provider; requires org.apache.commons.codec; requires io.netty.handler; requires java.transaction; requires spring.beans;; }
故障原因
这个问题是JPMS(Java 9+模块化系统)的加载逻辑差异导致的:
- 执行
mvn spring-boot:run时,Spring Boot Maven插件默认采用传统classpath模式加载所有依赖,不会校验module-info.java中声明的模块依赖关系,所有依赖包的类都能被正常加载,所以启动正常。 - IDEA识别到项目中存在
module-info.java文件时,会默认启用JPMS模块路径模式启动,严格按照module-info.java中声明的requires条目加载可访问的类。当前模块配置中完全没有声明对Liquibase核心模块的依赖,JVM无法访问liquibase.Scope类,自然抛出类找不到的错误。 - 另外当前配置中
requires spring.beans;;末尾多写了一个分号,属于语法冗余,虽然不会直接触发启动错误,但建议一并修正。
修复步骤
- 打开报错模块的
module-info.java文件,在依赖声明区块添加Liquibase核心模块的依赖声明:requires liquibase.core; - 删除
requires spring.beans;;末尾多余的分号,修正为requires spring.beans; - 在IDEA中执行Maven的
clean、compile命令,刷新项目依赖后重新启动应用即可。
内容的提问来源于stack exchange,提问作者Таисия Васильева
相关产品推荐
相关产品推荐

