【问题标题】:How to fix jOOQ code generation tool error?如何修复 jOOQ 代码生成工具错误?
【发布时间】:2019-08-08 21:26:52
【问题描述】:

我正在使用 Spring Boot 2.1.1 和 jOOQ 代码生成工具 3.11.7。我有一个 Java 类配置为稍微修改从 pom.xml 中的 MySQL 表名派生的类名:

<generator>
  <target>
    <packageName>com.example.foglight.db</packageName>
    <directory>src/main/java</directory>
  </target>
  <database>
    <excludes>
      flyway_schema_history
      | information_schema.*
    </excludes>
    <inputSchema>${dbName}</inputSchema>
    <outputSchemaToDefault>true</outputSchemaToDefault>
    <forcedTypes>
      <forcedType>
        <userType>java.util.UUID</userType>
        <binding>com.example.foglight.config.db.MysqlUuidBinding</binding>
        <types>BINARY\(16\)</types>
      </forcedType>
    </forcedTypes>
  </database>
  <generate>
    <deprecationOnUnknownTypes>false</deprecationOnUnknownTypes>
    <pojos>true</pojos>
  </generate>
  <!-- The default code generator. You can override this one, to generate your own code style
        Defaults to org.jooq.codegen.JavaGenerator -->
  <name>org.jooq.codegen.JavaGenerator</name>
  <!-- The naming strategy used for class and field names.
        You may override this with your custom naming strategy. Some examples follow
        Defaults to org.jooq.codegen.DefaultGeneratorStrategy -->
  <strategy>
 <name>com.example.foglight.config.db.DatabaseModelNamingStrategy</name>
  </strategy>
</generator>

当我从 IntelliJ 构建/运行应用程序时一切正常,但是当我在同一环境中从命令行运行 mvn generate-sourcesmvn install 时,我收到以下错误:

[ERROR] Failed to execute goal org.jooq:jooq-codegen-maven:3.11.7:generate (default) on project foglight: Error running jOOQ code generation tool: com.example.foglight.config.db.DatabaseModelNamingStrategy -> [Help 1]
org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal org.jooq:jooq-codegen-maven:3.11.7:generate (default) on project foglight: Error running jOOQ code generation tool

下面有详细解释:

Caused by: java.lang.ClassNotFoundException: com.example.foglight.config.db.DatabaseModelNamingStrategy
    at java.net.URLClassLoader.findClass (URLClassLoader.java:471)
    at java.lang.ClassLoader.loadClass (ClassLoader.java:588)
    at java.lang.ClassLoader.loadClass (ClassLoader.java:521)
    at org.jooq.codegen.GenerationTool.loadClass (GenerationTool.java:819)
    at org.jooq.codegen.GenerationTool.run (GenerationTool.java:352)
    at org.jooq.codegen.GenerationTool.generate (GenerationTool.java:220)
    at org.jooq.codegen.maven.Plugin.execute (Plugin.java:197)

类就在那里(否则 IntelliJ 也会抛出错误)。 IDE 是否还在做其他事情以使其正常工作?

【问题讨论】:

    标签: java spring-boot jooq


    【解决方案1】:

    您可以按照 Lukas Eder 的建议编译该类并将其放在类路径中。为此,使用 maven-compiler-plugin 引入另一个执行并将其绑定到 generate-sources 阶段:

          <plugin>
             <groupId>org.apache.maven.plugins</groupId>
             <artifactId>maven-compiler-plugin</artifactId>
             <version>3.8.1</version>
             <executions>
             <execution>
                  <phase>generate-sources</phase>
                  <goals>
                    <goal>compile</goal>
                  </goals>
                 <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <includes>
                       <include>tb/database/jooq/custom/namingstrategies/*.java</include>
                    </includes>
                 </configuration>
             </execution>
             </executions>
          </plugin>
    

    【讨论】:

      【解决方案2】:

      jOOQ 代码生成器必须能够通过类路径访问您的生成器策略,这意味着它必须在您运行代码生成器之前进行编译。由于代码生成器通常在包含它的 Maven 模块的编译阶段之前运行,因此您必须将生成器策略提取到另一个模块中以确保它在之前被编译。

      【讨论】:

      • 虽然这个设计真的很糟糕。 JOOQ 的一个非常常见的用法是将它放入一个单独的 java 项目中,我想在其中生成所有与 DB 相关的对象,以便将该项目用作依赖项。当前的实现将需要我创建一个仅包含我的命名策略的附加项目,然后可以由 DB 项目使用。此外,它与强制类型的工作方式不一致。这些类是在 maven 的 阶段编译的。
      • @cobby:构建中有一定的操作顺序。您希望逻辑在代码生成时可运行。这意味着,它需要在那个精确时刻之前被编译。您的其他示例(强制类型)没有此限制。当时不需要编译它们。它们仅由其限定的类名引用,因为您碰巧掌握了这些知识。这里没有糟糕的设计,这就是 Maven 的工作原理。
      • 我明白了,但有些用例相当不切实际。
      • @cobby:我很肯定你最终会屈服于 Maven 的智慧而不是与之抗争。我有。多年后:)
      • 实际上我完全同意你的帖子,逻辑应该在代码生成时运行,但如果能通过 jooq maven 插件解决它会很好。否则我必须通过编译器插件采取不愉快的路线(请参阅我对此 OP 的回答或将依赖项作为单独的模块/项目拉取)。
      猜你喜欢
      • 2018-12-15
      • 1970-01-01
      • 2014-09-09
      • 2017-12-03
      • 2017-08-13
      • 2020-01-23
      • 2016-01-15
      • 2016-02-19
      • 2014-03-06
      相关资源
      最近更新 更多