【问题标题】:jooq codegen with JPADatabase not workingjooq codegen 与 JPADatabase 不工作
【发布时间】:2023-03-24 20:21:01
【问题描述】:

我在将 jooq codegen 与 JPADatabase 结合使用时遇到问题。我已经浏览了这个post 并进行了相应的更改。我的项目包含子模块,实体类在域模块中。我有依赖于域的 biz 模块。所以我在 biz 模块的 pom.xml 中有这个构建配置。

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
            </configuration>
        </plugin>

        <plugin>
            <groupId>org.jooq</groupId>
            <artifactId>jooq-codegen-maven</artifactId>
            <version>3.9.1</version>

            <!-- The plugin should hook into the generate goal -->
            <executions>
                <execution>
                    <phase>generate-sources</phase>
                    <goals>
                        <goal>generate</goal>
                    </goals>
                </execution>
            </executions>

            <dependencies>
                <dependency>
                    <groupId>org.jooq</groupId>
                    <artifactId>jooq-meta-extensions</artifactId>
                    <version>3.9.1</version>
                </dependency>
            </dependencies>

            <configuration>

                <!-- Generator parameters -->
                <generator>

                    <database>
                        <name>org.jooq.util.jpa.JPADatabase</name>
                        <properties>
                            <!-- A comma separated list of Java packages, that contain your entities -->
                            <property>
                                <key>packages</key>
                                <value>com.yaswanth.domain.entity</value>
                            </property>
                        </properties>
                    </database>

                    <target>
                        <packageName>com.yaswanth.domain.entity.jooq</packageName>
                        <directory>target/generated-sources/jooq</directory>
                    </target>
                </generator>
            </configuration>
        </plugin>
    </plugins>
</build>

插件因实体上的 ClassNotFoundException 而失败。这是堆栈跟踪。

Caused by: org.jooq.exception.DataAccessException: Error while exporting schema
    at org.jooq.util.jpa.JPADatabase.create0(JPADatabase.java:147)
    at org.jooq.util.AbstractDatabase.create(AbstractDatabase.java:221)
    at org.jooq.util.AbstractDatabase.create(AbstractDatabase.java:213)
    at org.jooq.util.AbstractDatabase.getDialect(AbstractDatabase.java:195)
    at org.jooq.util.AbstractGenerator.logDatabaseParameters(AbstractGenerator.java:129)
    at org.jooq.util.JavaGenerator.generate(JavaGenerator.java:243)
    at org.jooq.util.GenerationTool.run(GenerationTool.java:610)
    at org.jooq.util.GenerationTool.generate(GenerationTool.java:199)
    at org.jooq.util.maven.Plugin.execute(Plugin.java:188)
    ... 22 more
Caused by: java.lang.ClassNotFoundException: com.walmartlabs.sc.domain.entity.ItemNames
    at org.codehaus.plexus.classworlds.strategy.SelfFirstStrategy.loadClass(SelfFirstStrategy.java:50)
    at org.codehaus.plexus.classworlds.realm.ClassRealm.unsynchronizedLoadClass(ClassRealm.java:271)
    at org.codehaus.plexus.classworlds.realm.ClassRealm.loadClass(ClassRealm.java:247)
    at org.codehaus.plexus.classworlds.realm.ClassRealm.loadClass(ClassRealm.java:239)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:264)
    at org.jooq.util.jpa.JPADatabase.create0(JPADatabase.java:135)
    ... 30 more

域模块类已经生成,但插件仍然显示 ClassNotFoundException。我正在使用 jooq 版本 3.9.1。谁能告诉我我在这里做错了什么?

更新:Lukas Eder 的答案是正确答案并被接受。我自己对这个问题的回答对我有用,因为我在 maven 存储库中缓存了该特定版本。我的答案是错误的。

【问题讨论】:

  • 您是否将实体置于使用 jOOQ 代码生成器的模块的依赖项中?见:stackoverflow.com/q/42968155/521799
  • 是的。域模块是发生代码生成的 biz 模块中的依赖项。

标签: java maven jpa jooq


【解决方案1】:

您似乎遇到了问题#5845,该问题已在 jOOQ 3.10 中修复,并计划在 3.9.3 和 3.8.8 中使用。

目前最好的解决方法可能是使用 jooq-meta-extensions 依赖项的 GitHub 版本 (3.10-SNAPSHOT):https://github.com/jOOQ/jOOQ/tree/master/jOOQ-meta-extensions,或相应地修补您的版本。

【讨论】:

  • 如果我降级到 3.8.0 会有帮助吗?
  • @yaswanth:不,为什么?这不是回归。自首次实施以来,JPADatabase 一直存在此问题。
  • 我认为类加载器问题是一个在更高版本中开始出现的错误。
  • @yaswanth:嗯,不确定——最近才报道过。我怀疑,旧版本也会受到影响,但这还没有经过测试。
  • 我只是好奇。无论如何,我为这个问题写的另一个答案是有效的。你认为这是一个更好的解决方案吗?我的意思是问这会有什么副作用。
【解决方案2】:

按照@Lukas Eder 的回答,我尝试了#5845 的建议。以下构建配置有效。

<build>
  <plugins>
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
            <source>1.8</source>
            <target>1.8</target>
        </configuration>
    </plugin>

    <plugin>
        <groupId>org.jooq</groupId>
        <artifactId>jooq-codegen-maven</artifactId>
        <version>3.9.1</version>

        <!-- The plugin should hook into the generate goal -->
        <executions>
            <execution>
                <phase>generate-sources</phase>
                <goals>
                    <goal>generate</goal>
                </goals>
            </execution>
        </executions>

        <dependencies>
            <dependency>
                <groupId>org.jooq</groupId>
                <artifactId>jooq-meta-extensions</artifactId>
                <version>3.9.1</version>
            </dependency>

             <!-- 

              This needs to be the dependency where the entity classes reside. 
              In my case, it is in the same module as the build profile is present.
              Hence the version is ${project.version}
             -->
            <dependency>
                <groupId>com.yaswanth</groupId>
                <artifactId>domain</artifactId>
                <version>${project.version}</version>
            </dependency>  
        </dependencies>
        <configuration>

            <!-- Generator parameters -->
            <generator>

                <database>
                    <name>org.jooq.util.jpa.JPADatabase</name>
                    <properties>
                        <!-- A comma separated list of Java packages, that contain your entities -->
                        <property>
                            <key>packages</key>
                            <value>com.yaswanth.domain.entity</value>
                        </property>
                    </properties>
                </database>

                <target>
                    <packageName>com.yaswanth.domain.entity.jooq</packageName>
                    <directory>target/generated-sources/jooq</directory>
                </target>
            </generator>
        </configuration>
    </plugin>
</plugins>

关于这种配置的奇怪之处在于,我将模块作为依赖项包含在它自己的 POM 的构建配置文件中的插件中!!

【讨论】:

    猜你喜欢
    • 2021-01-27
    • 1970-01-01
    • 2021-12-29
    • 2014-09-12
    • 2017-08-15
    • 2020-01-04
    • 2020-08-12
    • 2017-09-21
    • 1970-01-01
    相关资源
    最近更新 更多