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

基于Kotlin/Gradle/Spring/JOOQ应用报错及版本冲突排查求助

问题:jOOQ代码生成任务generateJooq报错

运行:generateJooq任务时触发如下错误:

> Task :generateJooq
12:01:46 WARNING org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 127; cvc-elt.1.a: Cannot find the declaration of element 'configuration'.
Exception in thread "main" java.lang.NoSuchMethodError: 'java.lang.String org.jooq.meta.jaxb.Generator.getJava()'
    at org.jooq.codegen.GenerationTool.run0(GenerationTool.java:396)
    at org.jooq.codegen.GenerationTool.run(GenerationTool.java:246)
    at org.jooq.codegen.GenerationTool.generate(GenerationTool.java:241)
    at org.jooq.codegen.GenerationTool.main(GenerationTool.java:213)

当前build.gradle.kts配置如下:

import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
import org.jooq.meta.jaxb.ForcedType
import org.jooq.meta.jaxb.Logging
import org.jooq.meta.jaxb.Property

plugins {
   id("org.springframework.boot") version "3.2.2"
   id("io.spring.dependency-management") version "1.1.4"
   kotlin("jvm") version "1.9.22"
   kotlin("plugin.spring") version "1.9.22"
   id("nu.studer.jooq") version "9.0"
}

group = "com.example"
version = "0.0.1-SNAPSHOT"

java {
   sourceCompatibility = JavaVersion.VERSION_17
}

configurations {
   compileOnly {
      extendsFrom(configurations.annotationProcessor.get())
   }
}

repositories {
   mavenCentral()
}

dependencies {
   implementation("org.springframework.boot:spring-boot-starter-jooq")
   implementation("org.springframework.boot:spring-boot-starter-web")
   implementation("com.fasterxml.jackson.module:jackson-module-kotlin")
   implementation("org.jetbrains.kotlin:kotlin-reflect")
   compileOnly("org.projectlombok:lombok")
   runtimeOnly("org.postgresql:postgresql")
   annotationProcessor("org.projectlombok:lombok")
   testImplementation("org.springframework.boot:spring-boot-starter-test")
   implementation("org.jooq:jooq:3.19.1")
   implementation("org.jooq:jooq-meta:3.19.1")
   implementation("org.jooq:jooq-codegen:3.19.1")
   jooqGenerator("org.postgresql:postgresql:42.5.4")
}

tasks.withType<KotlinCompile> {
   kotlinOptions {
      freeCompilerArgs += "-Xjsr305=strict"
      jvmTarget = "17"
   }
}

tasks.withType<Test> {
   useJUnitPlatform()
}

jooq {
   version.set("3.19.1")  
   edition.set(nu.studer.gradle.jooq.JooqEdition.OSS)  
   configurations {
      create("main") {  
         generateSchemaSourceOnCompilation.set(true)
     jooqConfiguration.apply {
        logging = Logging.WARN
        jdbc.apply {
           driver = "org.postgresql.Driver"
           url = "jdbc:postgresql://localhost:5432/mydb"
           user = "postgres"
           password = "postgres"
           properties.add(Property().apply {
                  key = "ssl"
                  value = "false"
               })
            }
            generator.apply {
               name = "org.jooq.codegen.DefaultGenerator"
               database.apply {
                  name = "org.jooq.meta.postgres.PostgresDatabase"
                  inputSchema = "public"
                  forcedTypes.addAll(listOf(
                     ForcedType().apply {
                        name = "varchar"
                        includeExpression = ".*"
                        includeTypes = "JSONB?"
                     },
                     ForcedType().apply {
                        name = "varchar"
                        includeExpression = ".*"
                        includeTypes = "INET"
                     }
                  ))
               }
               generate.apply {
                  isDeprecated = false
                  isRecords = true
                  isImmutablePojos = true
                  isFluentSetters = true
               }
               target.apply {
                  packageName = "com.example.Server"
                  directory = "build/generated-src/jooq/main"
               }
               strategy.name = "org.jooq.codegen.DefaultGeneratorStrategy"
            }
         }
      }
   }
}

buildscript {
   configurations["classpath"].resolutionStrategy.eachDependency {
      if (requested.group.startsWith("org.jooq") && requested.name.startsWith("jooq")) {
         useVersion("3.19.1")
      }
   }
}

已确认PostgreSQL数据库可正常登录,推测为JOOQ各库版本冲突,需调试解决。


调试与解决步骤

1. 移除冗余的jOOQ依赖

spring-boot-starter-jooq已经包含了jooq、jooq-meta、jooq-codegen的核心依赖,无需单独声明implementation。删除dependencies块中以下三行:

implementation("org.jooq:jooq:3.19.1")
implementation("org.jooq:jooq-meta:3.19.1")
implementation("org.jooq:jooq-codegen:3.19.1")

2. 统一JOOQ版本与Spring Boot的兼容性

Spring Boot 3.2.2默认依赖的JOOQ版本是3.18.8,你指定的3.19.1版本与Spring Boot的依赖版本不匹配,会导致类方法签名不一致(如报错中的Generator.getJava()方法不存在)。解决方式二选一:

  • 方式一:改用Spring Boot管理的JOOQ版本,删除jooq块中的version.set("3.19.1"),让插件自动继承Spring Boot的版本
  • 方式二:强制Spring Boot使用3.19.1版本,在dependencyManagement块中添加:
dependencyManagement {
   imports {
      mavenBom("org.springframework.boot:spring-boot-dependencies:3.2.2")
   }
   dependencies {
      dependency("org.jooq:jooq:3.19.1")
      dependency("org.jooq:jooq-meta:3.19.1")
      dependency("org.jooq:jooq-codegen:3.19.1")
   }
}

3. 检查依赖树确认版本一致性

运行以下Gradle命令查看JOOQ相关依赖的版本,确认没有多版本共存:

./gradlew dependencies --configuration implementation
./gradlew dependencies --configuration jooqGenerator

输出中如果发现不同版本的JOOQ依赖,说明存在冲突,需要通过resolutionStrategy强制统一。

4. 简化buildscript中的版本强制逻辑

nu.studer.jooq插件已经提供了版本管理能力,可删除buildscript块中的版本强制代码,避免重复配置。

5. 重新执行代码生成任务

清理之前的构建缓存,重新运行任务:

./gradlew clean generateJooq

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 10:32:06