带有 gradle 的 jooq 和 spring boot 的问题

Problem with jooq and spring boot with gradle

提问人:abdel 提问时间:11/7/2023 最后编辑:abdel 更新时间:11/7/2023 访问量:53

问:

我在 gradle 中使用带有 spring boot 的 jooq 插件,我的 h2 表有问题。 我的settings.gradle是:

    pluginManagement {
        plugins {
            id 'java'
            id 'war'
            id 'org.springframework.boot' version '2.7.17'
            id 'io.spring.dependency-management' version '1.0.14.RELEASE'
        }
    }

我应该使用 Spring Boot 的 2.7.17 来消除旧 Spring Boot 库中的一些 CVE。

我的build.gradle是

buildscript {
    ext {
        kotlinVersion = "1.7.10"
        postgresqlDriverVersion = '42.4.2'
        coroutineVersion = "1.6.4"
    }
     dependencies {
        classpath 'org.owasp:dependency-check-gradle:8.4.0'
    }
}


plugins {
    id "org.jetbrains.kotlin.jvm" version "${kotlinVersion}"
    id "org.jetbrains.kotlin.plugin.allopen" version "${kotlinVersion}"
    id "org.jetbrains.kotlin.plugin.noarg" version "${kotlinVersion}"
    id "org.jetbrains.kotlin.plugin.jpa" version "${kotlinVersion}"
    id "org.jetbrains.kotlin.plugin.spring" version "${kotlinVersion}"
    id 'org.springframework.boot'
    id 'io.spring.dependency-management'
    id "nu.studer.jooq" version "8.2.1"
    id "org.liquibase.gradle" version "2.0.4"
    id "idea"
    id "eclipse"
    id "com.palantir.docker" version "0.35.0"
}

allOpen {
    annotation("javax.persistence.Entity")
    annotation("javax.persistence.MappedSuperclass")
    annotation("javax.persistence.Embeddable")
}

repositories {
    mavenCentral()
}

dependencies {
    implementation("org.springframework.boot:spring-boot-starter-batch")
    implementation("org.springframework.boot:spring-boot-starter-data-jpa")
    implementation("org.springframework.boot:spring-boot-starter-web")
    implementation("org.springframework.boot:spring-boot-starter-cache")
    implementation("org.springframework.boot:spring-boot-starter-webflux")
    implementation 'org.jooq:jooq-meta-extensions:3.18.7'
    runtimeOnly 'com.h2database:h2'

    // systemd integration: notifies systemd that the application started successfully (or failed)
    implementation("com.github.jpmsilva.jsystemd:jsystemd-spring-boot-starter:2.0.1")

    // kotlin
    implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8")
    implementation("org.jetbrains.kotlin:kotlin-reflect")
    implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:${coroutineVersion}")
    implementation("org.jetbrains.kotlinx:kotlinx-coroutines-reactive:${coroutineVersion}")
    implementation("org.jetbrains.kotlinx:kotlinx-coroutines-reactor:${coroutineVersion}")

    implementation("io.github.microutils:kotlin-logging-jvm:3.0.0")

    // Jackson Kotlin
    implementation("com.fasterxml.jackson.module:jackson-module-kotlin")
    implementation("com.fasterxml.jackson.datatype:jackson-datatype-jsr310")

    implementation("javax.xml.bind:jaxb-api:2.3.1")
    implementation("javax.activation:activation:1.1")
    implementation("org.eclipse.persistence:org.eclipse.persistence.moxy:2.7.8")

    // Cache provider
    implementation("com.github.ben-manes.caffeine:caffeine:2.9.3")

    // https://mvnrepository.com/artifact/org.hibernate/hibernate-validator
    implementation("org.hibernate:hibernate-validator:6.1.6.Final")
    // https://mvnrepository.com/artifact/org.hibernate/hibernate-validator-annotation-processor
    implementation("org.hibernate:hibernate-validator-annotation-processor:6.1.6.Final")

    implementation('commons-io:commons-io:2.11.0')
    implementation("commons-codec:commons-codec:1.15")


    // Postgresql driver
    implementation("org.postgresql:postgresql:${postgresqlDriverVersion}")

    //jooq
    implementation("org.springframework.boot:spring-boot-starter-jooq")
    jooqGenerator("org.postgresql:postgresql:${postgresqlDriverVersion}")
    jooqGenerator("org.jooq:jooq-meta-extensions")

    // liquibase
    liquibaseRuntime("org.liquibase:liquibase-core:3.8.1")
    liquibaseRuntime("org.liquibase:liquibase-groovy-dsl:2.1.1")
    liquibaseRuntime("org.yaml:snakeyaml:1.15")
    liquibaseRuntime("org.postgresql:postgresql:${postgresqlDriverVersion}")
    liquibaseRuntime("ch.qos.logback:logback-core:1.2.3")
    liquibaseRuntime("ch.qos.logback:logback-classic:1.2.3")
    liquibaseRuntime("org.slf4j:slf4j-api:1.7.25")
    liquibaseRuntime("javax.xml.bind:jaxb-api:2.3.1")

    //embed the webapp in the fat JAR
    runtimeOnly(project(":logs-frontend"))

    // ------- TEST -------
    testImplementation("org.springframework.boot:spring-boot-starter-test")
    testImplementation("org.springframework.batch:spring-batch-test")
    testImplementation("io.mockk:mockk:1.7.15")
    testImplementation("net.bytebuddy:byte-buddy:1.9.2")
    testImplementation("net.bytebuddy:byte-buddy-agent:1.9.2")
    testImplementation "org.junit.jupiter:junit-jupiter-api:5.3.1"
    testRuntimeOnly("org.junit.platform:junit-platform-launcher:1.3.1")
    testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:5.3.1")
    testRuntimeOnly("org.junit.vintage:junit-vintage-engine:5.3.1")

    annotationProcessor("org.springframework.boot:spring-boot-configuration-processor")
}

compileJava.dependsOn(processResources)

compileKotlin {
    kotlinOptions {
        jvmTarget = "1.8"
    }
}

compileTestKotlin {
    kotlinOptions {
        jvmTarget = "1.8"
    }
}

tasks.named('check') {
    dependsOn 'dependencyCheckAnalyze'
}


jooq {
    // use jOOQ version defined in Spring Boot
    version = dependencyManagement.importedProperties['jooq.version']

    configurations {
        main {
            generationTool {
                generator {
                    name = "org.jooq.codegen.KotlinGenerator"

                    database {
                        name = "org.jooq.meta.extensions.ddl.DDLDatabase"
                        properties {
                            property {
                                key = 'scripts'
                                value = 'src/main/resources/db/changelog/main/*.sql'
                            }
                            property {
                                key = 'sort'
                                value = 'alphanumeric'
                            }
                            property {
                                key = 'defaultNameCase'
                                value = 'lower'
                            }
                        }
                        includes = '.*'
                        excludes = 'INFORMATION_SCHEMA.DOMAINS'
                    }

                    generate {
                        fluentSetters = true
                        pojos = true
                        javaTimeTypes = true
                    }
                    target {
                        packageName = "fr.logs.jooq"
                    }
                }
            }
        }
    }
}

tasks.named('generateJooq').configure {
    // make jOOQ task participate in incremental builds (which is also a prerequisite for participating in build caching)
    allInputsDeclared = true

    // make jOOQ task participate in build caching
    outputs.cacheIf { true }
}

compileKotlin.dependsOn(tasks.named('generateJooq'))


bootJar {
    dependsOn(":logs-frontend:webjar")
    archiveFileName = "testjars-${rootProject.version}.jar"
    exclude("**/application*.yaml", "**/*.jks")

    launchScript()
}

bootJarMainClassName {
    dependsOn(":logs-frontend:webjar")
}
apply plugin: 'org.owasp.dependencycheck'

dependencyCheck {
    failOnError=true
    failBuildOnCVSS = 1
}

但是当尝试命令gradlew generateJooq时,我出现以下错误:

原因:org.h2.jdbc.JdbcSQLSyntaxErrorException:精度 (“2147483647”) 必须介于“1”和“10000000000”之间;SQL算法 语句:选择“INFORMATION_SCHEMA”。域。DOMAIN_SCHEMA, INFORMATION_SCHEMA。域。DOMAIN_NAME, INFORMATION_SCHEMA。域。TYPE_NAME, INFORMATION_SCHEMA。域。精度,INFORMATION_SCHEMA。 域。规模,INFORMATION_SCHEMA。DOMAINS.IS_NULLABLE, INFORMATION_SCHEMA。域。COLUMN_DEFAULT, INFORMATION_SCHEMA。域。CHECK_CONSTRAINT 起 INFORMATION_SCHEMA。域,其中 (INF ORMATION_SCHEMA。域。DOMAIN_SCHEMA in (cast(? as varchar(2147483647))、cast(? as varchar(2147483647))) 和 INFORMATION_SCHEMA。域。TYPE_NAME <> 'ENUM') 排序 INFORMATION_SCHEM A.DOMAINS.DOMAIN_SCHEMA, INFORMATION_SCHEMA。域。DOMAIN_NAME [90150-214] 在 org.h2.message.DbException.getJdbcSQLException(DbException.java:632) 在 org.h2.message.DbException.getJdbcSQLException(DbException.java:477) 在 org.h2.message.DbException.get(DbException.java:223) 在 org.h2.command.Parser.getInvalidPrecisionException(Parser.java:6325) 在 org.h2.command.Parser.readIfDataType1(Parser.java:6285) 在 org.h2.command.Parser.readIfDataType(Parser.java:6087) 在 org.h2.command.Parser.parseColumnWithType(Parser.java:6069) 在 org.h2.command.Parser.readTermWithoutIdentifier(Parser.java:5107) 在 org.h2.command.Parser.readTerm(Parser.java:4901) 在 org.h2.command.Parser.readFactor(Parser.java:3398) 在 org.h2.command.Parser.readSum(Parser.java:3385) 在 org.h2.command.Parser.readConcat(Parser.java:3350) 在 org.h2.command.Parser.readCondition(Parser.java:3132) 在 org.h2.command.Parser.readExpression(Parser.java:3053) 在 org.h2.command.Parser.readInPredicate(Parser.java:3277) 在 org.h2.command.Parser.readConditionRightHandSide(Parser.java:3167) 在 org.h2.command.Parser.readCondition(Parser.java:3144) 在 org.h2.command.Parser.readExpression(Parser.java:3053) 在 org.h2.command.Parser.readTermWithoutIdentifier(Parser.java:4990) 在 org.h2.command.Parser.readTerm(Parser.java:4901) 在 org.h2.command.Parser.readFactor(Parser.java:3398) 在 org.h2.command.Parser.readSum(Parser.java:3385) 在 org.h2.command.Parser.readConcat(Parser.java:3350) 在 org.h2.command.Parser.readCondition(Parser.java:3132) 在 org.h2.command.Parser.readExpressionWithGlobalConditions(Parser.java:3043) 在 org.h2.command.Parser.parseSelect(Parser.java:2881) 在 org.h2.command.Parser.parseQueryPrimary(Parser.java:2762) 在 org.h2.command.Parser.parseQueryTerm(Parser.java:2633) 在 org.h2.command.Parser.parseQueryExpressionBody(Parser.java:2612) 在 org.h2.command.Parser.parseQueryExpressionBodyAndEndOfQuery(Parser.java:2605) 在 org.h2.command.Parser.parseQueryExpression(Parser.java:2598) 在 org.h2.command.Parser.parseQuery(Parser.java:2567) 在 org.h2.command.Parser.parsePrepared(Parser.java:724) 在 org.h2.command.Parser.parse(Parser.java:689) 在 org.h2.command.Parser.parse(Parser.java:661) 在 org.h2.command.Parser.prepareCommand(Parser.java:569) 在 org.h2.engine.SessionLocal.prepareLocal(SessionLocal.java:631) 在 org.h2.engine.SessionLocal.prepareCommand(SessionLocal.java:554) 在 org.h2.jdbc.JdbcConnection.prepareCommand(JdbcConnection.java:1116) 在 org.h2.jdbc.JdbcPreparedStatement。(JdbcPreparedStatement.java:92) 在 org.h2.jdbc.JdbcConnection.prepareStatement(JdbcConnection.java:288) 在 org.jooq.impl.ProviderEnabledConnection.prepareStatement(ProviderEnabledConnection.java:109) 在 org.jooq.impl.SettingsEnabledConnection.prepareStatement(SettingsEnabledConnection.java:73) 在org.jooq.impl.AbstractResultQuery.prepare(AbstractResultQuery.java:262) 在org.jooq.impl.AbstractQuery.execute(AbstractQuery.java:342) ...另外 15

但是我对 2.6.0 spring boot 版本没有问题。

有人有想法吗? 谢谢!

spring-boot h2 jooq-codegen

评论

0赞 dualed 11/7/2023
H2 休眠驱动程序最多只允许字段长度,但是,如果可能的话,您可以使用不同的数据库(如 SQLIte 或 postgreSQL),这应该只会影响我的单元测试,因为我在您的依赖项中看到了 postgre。10000000002147483647Integer.MAX_VALUE
0赞 abdel 11/7/2023
我该怎么做?因为它是内部使用的,我认为
0赞 dualed 11/7/2023
恐怕帮不了你,它可能与“jooq”有关,但我不知道那个框架,你也可以尝试管理一个较旧的 H2 驱动程序版本,因为该更改是最近引入的(一两年前左右),可能春季版本的增加带来了更新的 h2 依赖版本

答: 暂无答案