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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 16:25:21