Grails 2.0依赖NoClassDefFound问题

时间:2012-04-07 08:43:16

标签: grails groovy dependencies noclassdeffounderror buildconfig

当我尝试使用外部JAR中的库时,我在Grails 2.0中遇到了NoClassDefFound异常的问题。

我已经检查过声明的JAR是否在创建的WAR内部,还有关系依赖 - 报告不会标记任何问题。

本地添加的JAR或从Maven repo下载似乎没有区别。我也试图清理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类

2 个答案:

答案 0 :(得分:3)

NoClassDefFoundErrorClassNotFoundException不同。获得ClassNotFoundException表示该类不存在,因此您有一个简单的jar /依赖问题。 NoClassDefFoundError表示找到了指定的类,但找不到它引用的类。追踪是一个更令人沮丧的问题,因为JVM没有告诉你缺少什么。

您需要确保您拥有无法加载的类的所有依赖项及其所有依赖项等。

答案 1 :(得分:0)

您在编译和运行时范围内都声明了所有依赖项。每个依赖项只应声明一次。如果在编译范围中声明依赖项,它也将是可用的运行时。由于您需要此类进行编译,因此您应该在'compile'下保留com.google.gdata:gdata-youtube:2.0,并将其从'runtime'中删除

可用范围的说明,取自user documentation

  • build:仅适用于构建系统的依赖项
  • compile:编译步骤的依赖关系
  • 运行时:运行时需要的依赖关系,但不用于编译(参见上文)
  • test:测试所需的依赖关系,但不是在运行时(见上文)
  • 提供:开发时需要的依赖关系,但在WAR部署期间不需要依赖关系