1

外部 JAR からライブラリを使用しようとしたときに、Grails 2.0 で NoClassDefFound 例外の問題が発生しました。

宣言された JAR が作成された WAR 内にあることを確認しました。また、grials の依存関係レポートは、それに関する問題をマークしていません。

ローカルに追加された 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 を初期化できませんでした

4

2 に答える 2

3

NoClassDefFoundErrorと同じではありませんClassNotFoundExceptionClassNotFoundExceptionクラスがそこにないことを意味するため、単純なjar/依存関係の問題があります。NoClassDefFoundError指定されたクラスは見つかったが、それが参照するクラスが見つからなかったことを意味します。JVM は何が欠けているかを教えてくれないので、追跡するのはもっとイライラする問題です。

ロードに失敗しているクラスのすべての依存関係、およびそれらのすべての依存関係などがあることを確認する必要があります。

于 2012-04-07T15:25:48.053 に答える
0

すべての依存関係がコンパイル スコープとランタイム スコープの両方で宣言されています。各依存関係は一度だけ宣言する必要があります。コンパイル スコープで依存関係を宣言すると、実行時にも利用可能になります。このクラスはコンパイルに必要なので、com.google.gdata:gdata-youtube:2.0 を「コンパイル」の下に保持し、「ランタイム」から削除する必要があります。

ユーザードキュメントから取得した利用可能なスコープの説明:

  • build: ビルド システムのみの依存関係
  • compile: コンパイル ステップの依存関係
  • runtime: 実行時に必要だがコンパイルには必要ない依存関係 (上記参照)
  • test: 実行時ではなくテストに必要な依存関係 (上記を参照)
  • 提供: 依存関係は開発時に必要ですが、WAR のデプロイ時には必要ありません
于 2012-04-07T10:10:58.760 に答える