2014-04-06 57 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版本進行代碼生成和運行時。 –