我正在将 Spring Boot 与 kotlin 一起使用,将 gradle 与 groovy dsl 一起使用。在配置 JOOQ 时,我遇到了一个问题,每次我尝试运行 codegen 时都会出现此异常。
我一次又一次地遇到同样的错误:
23:31:53 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中的配置:
jooq {
edition = nu.studer.gradle.jooq.JooqEdition.OSS
configurations {
main { // name of the jOOQ configuration
generateSchemaSourceOnCompilation = false // default (can be omitted)
generationTool {
logging = Logging.WARN
jdbc {
driver = 'org.postgresql.Driver'
url = 'jdbc:postgresql://localhost:5432/postgres'
user = 'postgres'
password = 'postgres'
}
generator {
name = 'org.jooq.codegen.KotlinGenerator'
database {
name = 'org.jooq.meta.postgres.PostgresDatabase'
inputSchema = 'public'
forcedTypes {
forcedType {
name = 'varchar'
includeExpression = '.*'
includeTypes = 'JSONB?'
}
forcedType {
name = 'varchar'
includeExpression = '.*'
includeTypes = 'INET'
}
}
}
generate {
deprecated = false
kotlinSetterJvmNameAnnotationsOnIsPrefix = true
pojosAsKotlinDataClasses = true
fluentSetters = true
}
target {
packageName = 'com.encryptora.vpn.infrastructure.database.jooq'
directory = 'generated-src/main/jooq'
}
}
}
}
}
}
另外,我可以以某种方式从 application.yml 获取数据库属性,而不是在此处复制它们吗?
特定的异常暗示
jooq-codegen
的版本比 jooq-meta
更新。 IE。 jooq-codegen
期望有一个方法org.jooq.meta.jaxb.Generator.getJava()
,该方法是在jOOQ 3.19中添加的。相关变化是:
但是您的代码生成类路径上可能有旧版本的
jooq-meta
,其中不包含此特定方法(以及许多其他方法)。
我不知道为什么您正在使用的第三方 gradle 插件会发生这种情况,但解决方案似乎是显式指定所有依赖项及其要对齐的版本。