2014-04-06 41 views
3

我试图在glassfish中使用JOOQ。我使用的代码生成器是这样的:使用JOOQ的java.lang.NoSuchMethodError

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 

我并没有改变任何行家配置只是NetBeans的默认配置。 Maven构件:

<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> 

到底哪里出问题了?有人可以帮忙吗?

[UPDATE]

实际上有在应用服务器类路径中的两个版本JOOQ的:一个在结构域(域1/LIB /)3.1版本和第二个的lib目录是3.3.1被捆绑在战争文件中。这是否会导致问题?

+0

尽管我对netbeans不太熟悉,但是您能否检查'jooq.jar'是否在您的依赖关系文件夹中? – tmarwen

+0

@tmarwen是的,jooq-3.3.1.jar在依赖关系文件夹中 –

+0

而且您确定*您已将jOOQ 3.3.1捆绑到您的应用服务器中,而不是旧版本的jOOQ? –

回答

2

其实有在应用服务器类路径中的两个版本JOOQ的:与3.1版本在一个域(域1/lib中/)的lib目录,第二个是3.3.1是在战争文件捆绑在一起。这是否会导致问题?

是的,当然:-)

如果你想使用并行两个版本(你真的?),那么你可能需要采取类似OSGi能够加载相同的类名在不同的类加载器中。

在你的情况下,你的应用服务器首先加载jOOQ 3.1,因此jOOQ 3.3不能再被加载。使用jOOQ 3.3生成的代码使用TableImpl中的新内部方法运行,该方法已添加到jOOQ 3.2或3.3中,但由于您正在加载jOOQ 3.1,因此这些方法不在那里。请注意,这可能发生在任何外部依赖关系中。

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

+0

3.3.1是否可以运行3.1生成的代码?因为我无法访问其他已部署的应用程序。我只能替换lib文件夹中的jar。 –

+1

@MajidAzimi:通常:否。生成的代码在升级运行时版本时可能需要重新生成。内部API通常不兼容。您应始终使用相同的jOOQ版本进行代码生成和运行时。 –