Java JOOQ不生成类(JPADatabase)

Java JOOQ不生成类(JPADatabase),java,mysql,maven,jpa,jooq,Java,Mysql,Maven,Jpa,Jooq,我对JOOQ框架(3.13.5)以及Spring Boot和Java8有一个问题。我正试图使用JOOQ中的GenerationTool,按照作者页面()上的手册中的说明生成域类。项目结构如下所示: 域包包含JPA实体。然后我添加了run配置,其中作为主类,我用参数/JOOQ-config.xml标记了JOOQ库中的GenerationTool(如上面链接的作者手册中所述)。配置文件内容如下所示: <configuration xmlns="http://www.jooq.org

我对JOOQ框架(3.13.5)以及Spring Boot和Java8有一个问题。我正试图使用JOOQ中的GenerationTool,按照作者页面()上的手册中的说明生成域类。项目结构如下所示:

域包包含JPA实体。然后我添加了run配置,其中作为主类,我用参数/JOOQ-config.xml标记了JOOQ库中的GenerationTool(如上面链接的作者手册中所述)。配置文件内容如下所示:

<configuration xmlns="http://www.jooq.org/xsd/jooq-codegen-3.13.0.xsd">
<generator>
    <database>
        <name>org.jooq.meta.extensions.jpa.JPADatabase</name>
        <properties>
            <property>
                <key>packages</key>
                <value>com.ormtester.jpa.domain</value>
            </property>
            <property>
                <key>useAttributeConverters</key>
                <value>true</value>
            </property>
            <property>
                <key>unqualifiedSchema</key>
                <value>none</value>
            </property>
            <property>
                <key>hibernate.physical_naming_strategy</key>
                <value>org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy</value>
            </property>
        </properties>
    </database>
</generator>

org.jooq.meta.extensions.jpa.JPADatabase
包装
com.ormtester.jpa.domain
UseAttributeConverter
真的
不合格模式
没有一个
hibernate.physical\u命名\u策略
org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy
对于分析问题,我还添加了pom.xml片段和lib版本:

<dependencies>
    <dependency>
        <groupId>org.jooq</groupId>
        <artifactId>jooq-meta-extensions</artifactId>
        <version>3.13.5</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
        <version>2.3.4.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>${lombok.version}</version>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.jooq</groupId>
        <artifactId>jooq-codegen</artifactId>
        <version>3.13.5</version>
    </dependency>
</dependencies>

org.jooq
jooq元扩展
3.13.5
org.springframework.boot
spring引导启动器数据jpa
2.3.4.1发布
org.projectlombok
龙目
${lombok.version}
真的
org.jooq
约克代码根
3.13.5
现在,当我尝试构建项目时,我得到以下错误:

18:49:37.330 [main] WARN org.jooq.util.jaxb.tools.MiniJAXB - org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 72; cvc-elt.1: Cannot find the declaration of element 'configuration'.
18:49:42.215 [main] INFO org.jooq.codegen.GenerationTool - Initialising properties  : /jooq-config.xml
18:49:43.134 [main] DEBUG org.jooq.codegen.GenerationTool - Input configuration      : <onError>FAIL</onError><generator><name>org.jooq.codegen.DefaultGenerator</name><database><name>org.jooq.meta.extensions.jpa.JPADatabase</name><regexMatchesPartialQualification>true</regexMatchesPartialQualification><sqlMatchesPartialQualification>true</sqlMatchesPartialQualification><includes>.*</includes><excludes></excludes><includeExcludeColumns>false</includeExcludeColumns><includeTables>true</includeTables><includeEmbeddables>true</includeEmbeddables><includeRoutines>true</includeRoutines><includeTriggerRoutines>false</includeTriggerRoutines><includePackages>true</includePackages><includePackageRoutines>true</includePackageRoutines><includePackageUDTs>true</includePackageUDTs><includePackageConstants>true</includePackageConstants><includeUDTs>true</includeUDTs><includeSequences>true</includeSequences><includeIndexes>true</includeIndexes><includePrimaryKeys>true</includePrimaryKeys><includeUniqueKeys>true</includeUniqueKeys><includeForeignKeys>true</includeForeignKeys><includeCheckConstraints>true</includeCheckConstraints><includeInvisibleColumns>true</includeInvisibleColumns><recordVersionFields></recordVersionFields><recordTimestampFields></recordTimestampFields><syntheticIdentities></syntheticIdentities><syntheticPrimaryKeys></syntheticPrimaryKeys><overridePrimaryKeys></overridePrimaryKeys><dateAsTimestamp>false</dateAsTimestamp><ignoreProcedureReturnValues>false</ignoreProcedureReturnValues><unsignedTypes>true</unsignedTypes><integerDisplayWidths>true</integerDisplayWidths><inputCatalog></inputCatalog><outputCatalogToDefault>false</outputCatalogToDefault><inputSchema></inputSchema><outputSchemaToDefault>false</outputSchemaToDefault><schemaVersionProvider></schemaVersionProvider><catalogVersionProvider></catalogVersionProvider><orderProvider></orderProvider><forceIntegerTypesOnZeroScaleDecimals>true</forceIntegerTypesOnZeroScaleDecimals><logSlowQueriesAfterSeconds>5</logSlowQueriesAfterSeconds><logSlowResultsAfterSeconds>5</logSlowResultsAfterSeconds><properties><property><key>packages</key><value>com.ormtester.jpa.domain</value></property><property><key>useAttributeConverters</key><value>true</value></property><property><key>unqualifiedSchema</key><value>none</value></property><property><key>hibernate.physical_naming_strategy</key><value>org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy</value></property></properties></database></generator>
Exception in thread "main" java.lang.NoSuchMethodError: org.jooq.meta.jaxb.Configuration.getBasedir()Ljava/lang/String;
    at org.jooq.codegen.GenerationTool.run0(GenerationTool.java:272)
    at org.jooq.codegen.GenerationTool.run(GenerationTool.java:225)
    at org.jooq.codegen.GenerationTool.generate(GenerationTool.java:220)
    at org.jooq.codegen.GenerationTool.main(GenerationTool.java:192)
18:49:37.330[main]WARN org.jooq.util.jaxb.tools.MiniJAXB-org.xml.sax.SAXParseException;行号:1;栏目号:72;cvc elt.1:找不到元素“配置”的声明。
18:49:42.215[main]INFO org.jooq.codegen.GenerationTool-初始化属性:/jooq-config.xml
18:49:43.134[主要]调试org.jooq.codegen.GenerationTool-输入配置:FAILorg.jooq.codegen.DefaultGeneratororg.jooq.meta.extensions.jpa.jpadabasetruetrue.*FalseTrueFalseFalse55Packagescom.ormtester.jpa.domainuseAttributeConverterstrueunqualifiedSchemanonehibernate.physical\u naming\u strategyorg.springframework.boot.orm.jpa.hibernate.Sp环物理命名策略
线程“main”java.lang.NoSuchMethodError中出现异常:org.jooq.meta.jaxb.Configuration.getBasedir()Ljava/lang/String;
位于org.jooq.codegen.GenerationTool.run0(GenerationTool.java:272)
位于org.jooq.codegen.GenerationTool.run(GenerationTool.java:225)
位于org.jooq.codegen.GenerationTool.generate(GenerationTool.java:220)
位于org.jooq.codegen.GenerationTool.main(GenerationTool.java:192)
但是,当我删除jooq-config.xml文件时,错误明确地告诉我无法找到配置文件


我试图调试GenerationTool方法,但找不到有问题的地方。我无法确定问题的根源,因此我将感谢你们的一切帮助。提前谢谢

Spring boot引入了一组默认的jOOQ库版本,您可以使用注释中的说明(主要是
mvn dependency:tree
)对其进行验证。错误提示您的类路径上存在不兼容的版本

如果您自己的版本与spring boot拉入的版本不同,您可能需要告诉spring boot不要拉入任何jOOQ版本,并自己拉入所有版本,例如使用这种方法


org.springframework.boot
弹簧启动机jooq
org.jooq
约克

好的,按照@Lukas和@Lesiak在本主题中给出的提示,我找到了解决方案。正如您在最初的pom内容中所看到的,我添加了
jooq-codegen
jooq-meta-extensions
保留版本
3.13.5
,我确信“在引擎盖下”这些依赖项拥有相同版本的
jooq
jooq meta
libs,但不幸的是,在这两种情况下都有
3.12.3
。因此,首先我检查了来自@Lukas的提示,然后我不得不从依赖项中排除这些lib,并使用正确的版本号将它们添加为单独的依赖项

我还谈到了
jooq
(最初的问题只是
jooq meta
),因为
配置
类的问题解决后,我在`org.jooq.sqldial'中遇到了类似的问题,如下所示:

java.lang.NoSuchMethodError: supportedBy([Lorg/jooq/sqldialent;)Ljava/util/Set; 位于org.jooq.meta.AbstractDatabase。(AbstractDatabase.java:117) 位于java.lang.Class.forName0(本机方法) java.lang.Class.forName(Class.java:264)位于 org.jooq.codegen.GenerationTool.loadClass0(GenerationTool.java:983) 位于org.jooq.codegen.GenerationTool.loadClass(GenerationTool.java:930) 位于org.jooq.codegen.GenerationTool.run0(GenerationTool.java:395) org.jooq.codegen.GenerationTool.run(GenerationTool.java:225)位于 org.jooq.codegen.GenerationTool.generate(GenerationTool.java:220)位于 org.jooq.codegen.GenerationTool.main(GenerationTool.java:192)

正如我所说,它还伴随着版本不匹配,在本例中是与
jooq
一起出现的

在所有这些更改之后,我的pom的内容是:

<dependencies>
        <dependency>
            <groupId>org.jooq</groupId>
            <artifactId>jooq</artifactId>
            <version>3.13.5</version>
        </dependency>
        <dependency>
            <groupId>org.jooq</groupId>
            <artifactId>jooq-meta-extensions</artifactId>
            <version>3.13.5</version>
            <exclusions>
                <exclusion>
                    <groupId>org.jooq</groupId>
                    <artifactId>jooq</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.jooq</groupId>
                    <artifactId>jooq-meta</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.jooq</groupId>
            <artifactId>jooq-meta</artifactId>
            <version>3.13.5</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
            <version>2.3.4.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>${lombok.version}</version>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.jooq</groupId>
            <artifactId>jooq-codegen</artifactId>
            <version>3.13.5</version>
            <exclusions>
                <exclusion>
                    <groupId>org.jooq</groupId>
                    <artifactId>jooq</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.jooq</groupId>
                    <artifactId>jooq-meta</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.jibx</groupId>
            <artifactId>jibx-tools</artifactId>
            <version>1.3.1</version>
        </dependency>
    </dependencies>
然后,只需将您的自定义命名策略添加到xml配置中即可。使用此项目制作,效果非常出色:


我真的很感谢你,@Lukas和@Lesiak,谢谢你的帮助!

启动
mvn依赖项:tree
并检查
jooq-codegen
jooq-meta
的解析版本。它们符合你的期望吗?@Lesiak两个库的版本与pom文件-3.13.5中定义的版本完全相同。让我们排除obv
String javaClassName = super.getJavaClassName(definition, mode);
        boolean hasRecordSuffix = javaClassName.contains("Record");
        javaClassName = javaClassName.replace("Record", "");
        String val = nameTools.depluralize(javaClassName);
        if (hasRecordSuffix)
            val += "Record";
        return val;