【问题标题】:jooq 3.12.0 codegen tool strategy class not foundjooq 3.12.0 codegen 工具策略类未找到
【发布时间】:2020-01-04 03:16:17
【问题描述】:

我无法让 jooq codegen 工具与我的自定义 JooqCodegenStrategy 类一起运行。我下载了 jooq 3.12.0 并将其解压缩到我的 Ubuntu 系统上的一个目录中。在这个目录中,我有以下文件。

jooq-3.12.0.jar
jooq-checker-3.12.0.jar
jooq-codegen-3.12.0.jar
jooq-codegen-maven-3.12.0.jar
JooqCodegenStrategy.class
JooqCodegenStrategy.java
jooq-meta-3.12.0.jar
jooq-meta-extensions-3.12.0.jar
jooq-scala_2.12-3.12.0.jar
jooq_sd3.jar
jooq.xml
mysql-connector-java-5.1.47-bin.jar*
reactive-streams-1.0.3.jar

当我的jooq.xml中没有以下(下)时,我可以成功运行代码生成工具。

<generator>
  <strategy>
    <name>com.simpletest.JooqCodegenStrategy</name>
  </strategy>
</generator>

为了构建 JooqCodegenStrategy 类,我从终端编译这个 Java 文件:

javac -classpath jooq-meta-3.12.0.jar:jooq-codegen-3.12.0.jar JooqCodegenStrategy.java 

这似乎有效,它创建了 JooqCodegenStrategy.class 文件。我将该文件打包到一个 jar 中,以便在运行 codegen 工具时可以在类路径中引用它。我使用以下方法创建 jar 文件:

jar -cvf jooq_sd3.jar JooqCodegenStrategy.class

此时,我相信我已经拥有了运行 codegen 工具所需的一切。我使用这个运行代码生成工具:

java -classpath jooq-3.12.0.jar:jooq-meta-3.12.0.jar:jooq-codegen-3.12.0.jar:mysql-connector-java-5.1.47-bin.jar:reactive-streams-1.0.3.jar:jooq_sd3.jar:. org.jooq.codegen.GenerationTool /jooq.xml

我得到的错误如下所示:

Aug 30, 2019 4:44:12 PM org.jooq.tools.JooqLogger info
INFO: Initialising properties  : /jooq.xml
Aug 30, 2019 4:44:13 PM org.jooq.tools.JooqLogger error
SEVERE: Cannot read /jooq.xml. Error : com.simpletest.JooqCodegenStrategy
java.lang.ClassNotFoundException: com.simpletest.JooqCodegenStrategy
    at java.net.URLClassLoader.findClass(URLClassLoader.java:382
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    at org.jooq.codegen.GenerationTool.loadClass0(GenerationTool.java:925)
    at org.jooq.codegen.GenerationTool.loadClass(GenerationTool.java:869)
    at org.jooq.codegen.GenerationTool.run0(GenerationTool.java:380)
    at org.jooq.codegen.GenerationTool.run(GenerationTool.java:221)
    at org.jooq.codegen.GenerationTool.generate(GenerationTool.java:216)
    at org.jooq.codegen.GenerationTool.main(GenerationTool.java:188)

我的 jooq.xml 文件看起来像这样。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<configuration>
    <jdbc>
        <driver>com.mysql.jdbc.Driver</driver>
        <url>jdbc:mysql://localhost:3306/sd3?useSSL=false</url>
        <user>myuser</user>
        <password>mypass</password>
    </jdbc>

    <generator>
        <name>org.jooq.codegen.JavaGenerator</name>
        <strategy>
            <name>com.simpletest.JooqCodegenStrategy</name>
        </strategy>

        <database>
            <name>org.jooq.meta.mysql.MySQLDatabase</name>
            <inputSchema>sd3</inputSchema>
            <includes>.*</includes>
            <excludes>sometableshere</excludes>
            <forcedTypes>
                <forcedType>
                    <name>JsonElement</name>
                    <expression>board_data</expression>
                    <types>JSON</types>
                </forcedType>
            </forcedTypes>
        </database>

        <target>
            <packageName>model.data</packageName>
            <directory>./src/main/java/com/simpletest/domain/</directory>
        </target>

        <generate>
            <relations>true</relations>
            <deprecated>true</deprecated>
            <instanceFields>true</instanceFields>
            <generatedAnnotation>true</generatedAnnotation>
            <records>true</records>
            <pojos>true</pojos>
            <immutablePojos>false</immutablePojos>
            <interfaces>false</interfaces>
            <daos>true</daos>
            <jpaAnnotations>true</jpaAnnotations>
            <validationAnnotations>false</validationAnnotations>
            <springAnnotations>true</springAnnotations>
            <globalObjectReferences>true</globalObjectReferences>
            <fluentSetters>true</fluentSetters>
        </generate>
    </generator>
</configuration>

任何想法我做错了什么?

感谢您的帮助。

【问题讨论】:

    标签: java sql jooq


    【解决方案1】:

    如果在本地目录中编译您的 Java 类有效,这意味着您的类没有包(即它在默认包中)。这意味着您对该课程的资格是错误的:

    <generator>
      <strategy>
        <name>com.simpletest.JooqCodegenStrategy</name>
      </strategy>
    </generator>
    

    它不在com.simpletest 包中。在 Java 中通常不鼓励使用默认包。在许多情况下(例如,我认为也是这种情况),您将无法从随机位置加载类。

    最好将包声明添加到您的类中:

    package com.simpletest;
    

    并将类移动到com/simpletest 子目录中。

    【讨论】:

    • 这对我有用。我想让我的 JooqCodegenStrategy 与我的主要项目源分开,但仍然在 repo 中。感谢您的帮助。
    • @Mule:在 Maven 中,您将为此在项目中定义一个单独的模块。 Gradle 将以类似的方式工作......这样,即使您更新了该策略类,代码生成也可以自动化。
    猜你喜欢
    • 1970-01-01
    • 2013-04-10
    • 2021-12-29
    • 2023-03-24
    • 1970-01-01
    • 2017-09-29
    • 2018-12-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多