使用gradle-jooq-plugin执行generateJooq任务时遇NoClassDefFoundError错误
解决Jooq generateJooq任务中Liquibase FileSystemResourceNotFoundError问题
错误根源
java.lang.NoClassDefFoundError: liquibase/resource/FileSystemResourceAccessor 本质是执行generateJooq任务时,JVM无法在任务的classpath中找到Liquibase的相关类,通常由以下原因导致:
- 任务classpath未包含Liquibase依赖
- Jooq与Liquibase版本不兼容
- 未正确配置Liquibase资源访问器参数
修复步骤
1. 确保generateJooq任务依赖完整
在build.gradle.kts中,需将Liquibase、H2驱动及Jooq的Liquibase扩展库添加到jooqGenerator依赖组(而非仅项目依赖),确保任务执行时能加载到这些类:
// 定义兼容版本(建议与Spring Boot依赖管理版本对齐) val liquibaseVersion = "4.24.0" val h2Version = "2.2.224" val jooqVersion = "3.18.6" dependencies { // 项目常规依赖 implementation("org.springframework.boot:spring-boot-starter-jooq") implementation("org.liquibase:liquibase-core") runtimeOnly("com.h2database:h2") // generateJooq任务专属依赖 jooqGenerator("org.liquibase:liquibase-core:$liquibaseVersion") jooqGenerator("com.h2database:h2:$h2Version") jooqGenerator("org.jooq:jooq-meta-extensions-liquibase:$jooqVersion") }
2. 正确配置Jooq Generator的Liquibase参数
在jooq配置块中,明确指定Liquibase数据库类型、变更日志路径及资源访问器:
jooq { configurations { create("main") { generateSchemaSourceOnCompilation.set(true) jooqConfiguration.apply { jdbc.apply { driver = "org.h2.Driver" url = "jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1" user = "sa" password = "" } generator.apply { name = "org.jooq.codegen.KotlinGenerator" database.apply { name = "org.jooq.meta.extensions.liquibase.LiquibaseDatabase" // 配置Liquibase核心参数 properties.addAll( listOf( org.jooq.meta.jaxb.Property().apply { key = "liquibase.databaseClass" value = "org.liquibase.database.core.H2Database" }, org.jooq.meta.jaxb.Property().apply { key = "liquibase.changeLog" value = "src/main/resources/db/changelog/db.changelog-master.yaml" // 替换为你的变更日志路径 }, // 显式指定资源访问器,解决类找不到问题 org.jooq.meta.jaxb.Property().apply { key = "liquibase.resourceAccessor" value = "liquibase.resource.FileSystemResourceAccessor" } ) ) } target.apply { packageName = "com.yourpackage.generated" // 替换为你的生成类包路径 directory = "build/generated/sources/jooq/main" } } } } } }
3. 规避版本冲突
如果使用Spring Boot插件,建议通过Spring Boot的依赖管理统一版本,避免Jooq与Liquibase版本不兼容:
plugins { id("org.springframework.boot") version "3.2.0" id("io.spring.dependency-management") version "1.1.4" kotlin("jvm") version "1.9.20" id("nu.studer.jooq") version "8.2" } dependencyManagement { imports { mavenBom(org.springframework.boot.gradle.plugin.SpringBootPlugin.BOM_COORDINATES) } }
4. 验证依赖完整性
执行以下命令查看generateJooq任务的依赖树,确认Liquibase相关jar已被正确引入:
./gradlew dependencies --configuration jooqGenerator
额外检查点
- 确认Liquibase变更日志文件路径正确,文件存在且格式合法
- 若使用自定义资源访问器,需确保其类已被添加到任务classpath中
内容的提问来源于stack exchange,提问作者Mykoliux
相关产品推荐
相关产品推荐

