无法解析 jOOQ 生成的类 TableOptions

Posted

技术标签:

【中文标题】无法解析 jOOQ 生成的类 TableOptions【英文标题】:Cannot resolve class TableOptions generated by jOOQ 【发布时间】:2020-11-14 08:24:01 【问题描述】:

我正在使用带有 Gradle 的 jOOQ 3.13.0。

以下是来自build.gradle的一些相关摘录

...

buildscript 
    dependencies 
        classpath 'org.jooq:jooq-codegen:3.13.3'
        classpath 'org.postgresql:postgresql:42.2.5'
    


...

dependencies 
    compile 'org.jooq:jooq:3.13.3'


...

def writer = new StringWriter()
def xml = new groovy.xml.MarkupBuilder(writer)
        .configuration('xmlns': 'http://www.jooq.org/xsd/jooq-codegen-3.13.0.xsd') 
            jdbc() 
                driver('org.postgresql.Driver')
                url('jdbc:postgresql://localhost:5432/metrics')
                user('postgres')
                password('pwd')
            
            generator() 
                database() 
                    inputSchema('public')
                

                // Watch out for this caveat when using MarkupBuilder with "reserved names"
                // - https://github.com/jOOQ/jOOQ/issues/4797
                // - http://***.com/a/11389034/521799
                // - https://groups.google.com/forum/#!topic/jooq-user/wi4S9rRxk4A
                generate() 
                
                target() 
                    packageName('metrics.jooq')
                    directory('src/main/java')
                
            
        

在我运行 gradle clean build 后,它成功生成了代码,但无法编译,因为它包含:

import org.jooq.TableOptions;

无法解决。我该如何解决这个问题。很奇怪,它生成的代码无法编译...

我注意到 Gradle 出于某种原因下载了 3.11.9 版而不是 3.13.3 版。

之后,我在build.gradle 中将所有 jooq 相关版本更改为 3.11.9(也是 xsd 版本)并运行构建但得到:

Error while reading XML configuration

这是堆栈跟踪的结尾:

...
Caused by: org.jooq.codegen.GeneratorException: Error while reading XML configuration
        at org.jooq.codegen.GenerationTool.load(GenerationTool.java:931)
        at org.jooq.codegen.GenerationTool.generate(GenerationTool.java:218)
        at org.jooq.codegen.GenerationTool$generate.call(Unknown Source)
        at build_abyn1owj8gv09akc1mcgpsxr1.run(/media/wd/job/otr/mk/ufos-portal-incubate/solutions/mk-dashboard/build.gradle:56)
        at org.gradle.groovy.scripts.internal.DefaultScriptRunnerFactory$ScriptRunnerImpl.run(DefaultScriptRunnerFactory.java:90)
        ... 104 more
Caused by: javax.xml.bind.JAXBException
 - with linked exception:
[java.lang.ClassNotFoundException: com.sun.xml.internal.bind.v2.ContextFactory]
        at org.jooq.codegen.GenerationTool.load(GenerationTool.java:914)
        ... 108 more
Caused by: java.lang.ClassNotFoundException: com.sun.xml.internal.bind.v2.ContextFactory
        ... 109 more

我尝试按照这里的建议解决它

https://github.com/jOOQ/jOOQ/issues/9066

并添加到build.gradle

    dependencies 
        classpath group: 'com.sun.xml.bind', name: 'jaxb-core', version: '3.0.0-M4'
        classpath group: 'com.sun.xml.bind', name: 'jaxb-impl', version: '3.0.0-M4'
        classpath group: 'com.sun.activation', name: 'javax.activation', version: '1.2.0'
...

但没有成功

【问题讨论】:

【参考方案1】:

我已经通过使用正确的依赖项解决了这个问题

这是build.gradle的摘录

buildscript 
   dependencies 
        classpath group: 'com.sun.activation', name: 'javax.activation', version: '1.2.0'
        classpath group: 'com.sun.xml.bind', name: 'jaxb-core', version: '2.3.0.1'
        classpath group: 'com.sun.xml.bind', name: 'jaxb-impl', version: '2.3.1'

        classpath 'org.jooq:jooq-codegen:3.11.9'
        classpath 'org.postgresql:postgresql:42.2.5'
...

【讨论】:

以上是关于无法解析 jOOQ 生成的类 TableOptions的主要内容,如果未能解决你的问题,请参考以下文章

JOOQ 代码生成器跳过包含 JsonNode 字段的类

使用 DDL 数据库生成代码时找不到函数 - jooq

jooq + scala 代码生成:对象 AbstractKeys 中的方法 createIndex 无法在对象 org.jooq.impl.AbstractKeys 中访问

JOOQ 强制类型无法通过 JPADatabase 代码生成生成 NUMERIC SQL 数据类型

是否有一个 jOOQ 工具来验证生成的定义是否仍然正确?

JOOQ + JPA 实体