1

當我嘗試從外部JAR使用庫時,Grails 2.0中出現NoClassDefFound異常問題。Grails 2.0依賴NoClassDefFound問題

我已經檢查過,聲明的JAR是在創建的WAR內部的,也是griles dependecies-report不標記任何問題。

本地添加的JAR或從Maven回購下載似乎沒有區別。我也嘗試清理IVY緩存並清理Grails項目,但沒有成功。

你有什麼想法如何解決它?


BuildConfig.groovy(的一部分)

grails.project.dependency.resolution = { 

    inherits("global") { 
     // uncomment to disable ehcache 
     // excludes 'ehcache' 
    } 
    log "error" // log level of Ivy resolver, either 'error', 'warn', 'info', 'debug' or 'verbose' 
    checksums true // Whether to verify checksums on resolve 

    repositories { 
     inherits true // Whether to inherit repository definitions from plugins 
     grailsPlugins() 
     grailsHome() 
     grailsCentral() 

     mavenCentral() 
     mavenLocal() 
     mavenRepo "http://snapshots.repository.codehaus.org" 
     mavenRepo "http://repository.codehaus.org" 
     mavenRepo "http://download.java.net/maven/2/" 
     mavenRepo "http://repository.jboss.com/maven2/" 
    } 

    dependencies { 

     compile ( "javax:activation:1.0", 
        "javax:mail:1.0", 
        "com.google.gdata:gdata-core:1.0", 
        "com.google.gdata:gdata-client:1.0", 
        "com.google.gdata:gdata-media:1.0", 
        "com.google.gdata:gdata-youtube:2.0" 
     ) 

     runtime ( "javax:activation:1.0", 
        "javax:mail:1.0", 
        "com.google.gdata:gdata-core:1.0", 
        "com.google.gdata:gdata-client:1.0", 
        "com.google.gdata:gdata-media:1.0", 
        "com.google.gdata:gdata-youtube:2.0" 
     ) 
    } 

... 

} 

LibraryController.groovy

import com.google.gdata.client.youtube.YouTubeService 
import com.google.gdata.data.youtube.VideoEntry 
import com.google.gdata.util.ServiceException 

class LibraryController { 

    private YouTubeService service 
    private static final API_URL = "http://gdata.youtube.com/feeds/api/videos/" 

    def index = { 
     service = new YouTubeService("app") 
    } 
} 

異常

Class 
    java.lang.NoClassDefFoundError 
Message 
    Could not initialize class com.google.gdata.client.youtube.YouTubeServiceClass 
java.lang.NoClassDefFoundError 

消息 無法初始化類com.google.gdata.client.youtube.YouTubeService

+0

我通常只使用「罐子-tf」檢查的jar文件在war文件內部加倍確保包含類文件YouTubeServiceClass。 – 2012-04-07 09:00:19

+0

你什麼時候遇到這個錯誤?在運行時使用'run-app'? – Chris 2012-04-07 09:55:32

+0

是的,我正在使用運行應用程序,並在進入庫視圖時出現異常。 – Simek 2012-04-07 11:44:19

回答

3

NoClassDefFoundError是不一樣的ClassNotFoundException。獲得ClassNotFoundException意味着該類不在那裏,所以你有一個簡單的jar/dependency問題。 NoClassDefFoundError表示找到指定的類,但未找到它引用的類。追蹤這是一個更令人沮喪的問題,因爲JVM並沒有告訴你缺少什麼。

你需要確保你擁有所有的類的多數民衆贊成無法加載的依賴關係,以及他們所有的依賴等

+0

謝謝你解釋。經過研究,我發現com.google.common.collect.Maps丟失了。添加番石榴庫(http://code.google.com/p/guava-libraries/)修復了這個問題。 但由於兼容性問題,我必須將番石榴降級到10.0.1: http://code.google.com/p/gdata-java-client/issues/detail?id=180 – Simek 2012-04-07 16:21:40

0

你無論是在編譯和運行範圍內聲明的所有依賴關係。每個依賴項只能聲明一次。如果您在編譯範圍內聲明瞭一個依賴項,它也將在運行時可用。由於您需要此類進行編譯,因此您應該在'compile'下保留com.google.gdata:gdata-youtube:2.0,並將其從'runtime'中刪除。

可用範圍的描述取自user documentation

  • 構建:依存關係構建系統僅
  • 編譯:依存關係編譯步驟
  • 運行時:在運行時需要的,但不進行編譯(見上文)
  • 測試依賴關係:依賴測試所需的但不是 在運行時(見上文)
  • 提供:在開發時所需依賴關係,而不是在WAR部署
+0

我只留下'編譯'範圍,但仍然出現異常。 – Simek 2012-04-07 11:39:19