1

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

我检查了声明的 JAR 是否在创建的 WAR 中,grialsdependecies-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"
        )
    }

...

}

库控制器.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

4

2 回答 2

3

NoClassDefFoundError不一样ClassNotFoundException。获得一个ClassNotFoundException意味着类不存在,所以你有一个简单的 jar/依赖问题。NoClassDefFoundError表示找到了指定的类,但没有找到它引用的类。这是一个更令人沮丧的问题,因为 JVM 不会告诉您缺少什么。

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

于 2012-04-07T15:25:48.053 回答
0

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

可用范围的描述,取自用户文档

  • build:仅构建系统的依赖项
  • compile:编译步骤的依赖项
  • 运行时:运行时需要但编译不需要的依赖项(见上文)
  • 测试:测试所需的依赖项,但在运行时不需要(见上文)
  • 提供:开发时需要的依赖项,但在 WAR 部署期间不需要
于 2012-04-07T10:10:58.760 回答