1

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

私は、宣言されたJARが作成されたWARの内側にあることを確認しました。また、grials 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

など、あなたがロードに失敗していますクラスのすべての依存関係、およびその依存関係のすべてを持っていることを確認する必要がありますWARファイル内に、クラスファイルYouTubeServiceClassが含まれていることを二重に確認します。 –

+0

いつこのエラーが発生しますか?実行時に 'run-app'を使用していますか? – Chris

+0

はい、実行アプリを使用していますが、ライブラリビューに入るときに例外が表示されます。 – Simek

答えて

3

NoClassDefFoundErrorClassNotFoundExceptionと同じではありません。クラスが存在しないので、単純なjar /依存関係の問題が発生することを意味します。ClassNotFoundExceptionを取得すると、クラスが存在しません。 NoClassDefFoundErrorは、指定されたクラスが見つかりましたが、参照するクラスが見つかりませんでした。 JVMが何が欠けているかを教えてくれないので、追跡するのがはるかに不満な問題です。

あなたは、私は通常ちょうどjarファイルを検査する「ジャー-tf」を使用します

+0

ありがとうございます。調査の結果、com.google.common.collect.Mapsが見つからなかったことがわかりました。 guava-libraries(http://code.google.com/p/guava-libraries/)を追加すると、その問題が修正されました。 互換性の問題により、グアバを10.0.1にダウングレードする必要があります: http://code.google.com/p/gdata-java-client/issues/detail?id=180 – Simek

0

を初期化できませんでした。各依存関係は一度だけ宣言する必要があります。コンパイルスコープに依存関係を宣言すると、実行時にも使用可能になります。このクラスがコンパイルに必要なので、com.google.gdata:gdata-youtube:2.0を 'compile'の下に置き、 'runtime'から削除してください。

user documentationから取得できるスコープの説明:

  • ビルド:ビルドシステムのみ
  • コンパイルのための依存性:実行時ではなくコンパイルに必要な依存関係(上記参照)
  • テスト:テストのために必要な依存関係コンパイルステップ
  • のランタイムに依存だがしかし 実行時に(上記参照)
  • 提供:WARの展開時に、開発時に必要な依存関係はなく、
+0

私は 'コンパイル'スコープだけを残しましたが、例外は引き続き表示されます。 – Simek