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