使用 JOOQ 的 java.lang.NoSuchMethodError

标签 java maven glassfish jooq

我试图在 glassfish 中使用 JOOQ。我使用了这样的代码生成器:

java -cp jOOQ-lib/jooq-3.3.1.jar:jOOQ-lib/jooq-meta-3.3.1.jar:jOOQ-lib/jooq-codegen-3.3.1.jar:mysql-connector-java-5.1.29-bin.jar:. org.jooq.util.GenerationTool /db.xml

然后将生成的文件夹导入到我的项目中。(我没有使用 jooq maven 插件)。当我在 glassfish 中部署 Web 应用程序时,我在 server.log 中看到了这一点

[#|2014-04-06T14:53:37.720+0430|SEVERE|glassfish3.1.2|com.sun.xml.ws.server.sei.TieHandler|_ThreadID=670;_ThreadName=Thread-2;|org.jooq.impl.TableImpl.<init>(Ljava/lang/String;Lorg/jooq/Schema;Lorg/jooq/Table;[Lorg/jooq/Field;Ljava/lang/String;)V
    java.lang.NoSuchMethodError: org.jooq.impl.TableImpl.<init>(Ljava/lang/String;Lorg/jooq/Schema;Lorg/jooq/Table;[Lorg/jooq/Field;Ljava/lang/String;)V

我没有更改任何 maven 配置,只是 netbeans 默认配置。 Maven Artifact :

<dependency>
    <groupId>org.jooq</groupId>
    <artifactId>jooq</artifactId>
    <version>3.3.1</version>
</dependency>

我的 db.xml:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<configuration>
  <!-- Configure the database connection here -->
  <jdbc>
    <driver>com.mysql.jdbc.Driver</driver>
    <url>jdbc:mysql://127.0.0.1/bulkdb?useUnicode=true</url>
    <user>user</user>
    <password>pass</password>
  </jdbc>
    <generator>
        <database>
            <name>org.jooq.util.mysql.MySQLDatabase</name>
            <inputSchema>bulkdb</inputSchema>
            <includes>.*</includes>
            <excludes></excludes>
        </database>
        <target>
            <packageName>bulkdb</packageName>
            <directory>/home/user/jooq</directory>
        </target>
    </generator>

</configuration>

出了什么问题?有人可以帮忙吗?

[更新]

实际上在应用程序服务器类路径中有两个版本的 JOOQ:一个在域的 lib 目录 (domain1/lib/) 中,版本为 3.1,第二个是 3.3.1,捆绑在 war 文件中。这会导致问题吗?

最佳答案

Actually there is two version of JOOQ in app server class path: one in lib directory of the domain(domain1/lib/) with version 3.1 and second one is 3.3.1 that is bundled in war file. Does this cause problems?

是的,当然 :-)

如果您想同时使用这两个版本(真的吗?),那么您可能需要求助于 OSGi 之类的东西能够在不同的类加载器中加载相同的类名。

在您的情况下,jOOQ 3.1 首先由您的应用程序服务器加载,因此无法再完全加载 jOOQ 3.3。使用 jOOQ 3.3 生成的代码在 TableImpl 中的新内部方法上运行,这些方法已添加到 jOOQ 3.2 或 3.3 中,但由于您正在加载 jOOQ 3.1,因此这些方法不存在。请注意,任何外部依赖项都可能发生这种情况。

这里的解决方案实际上是从您的应用程序服务器中删除 jOOQ 3.1。

关于使用 JOOQ 的 java.lang.NoSuchMethodError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22892926/

相关文章:

Java-第 0 个局部变量何时不是 'this'?

java - 使用 Java 逐 block 读取多个文件中的内容并将其逐 block 写入单个文件中

java - Gradle 无法下载公司代理背后的分发

java - 如何制作可重定位的rpm?

java - jackson.databind 没有这样的方法错误

使用 JUnitCore 时出现 java.lang.NoClassDefFoundError

java - 在 JPA 实体上查找声明的 java.util.Map 字段的泛型类型时出现 ClassNotFoundException (GlassFish 3)

java - Glassfish 4.1 在使用 ear/ejb/web 模块时无法运行 RestFul 服务

java - 谷歌语音文本 api v1 : javax.net.ssl.SSLException: Broken pipe

java - 读取 EAR 的 list