2016-11-13 5 views
10

私はいくつかのjwtものを行うために私のアンドロイドクライアントでcom.nimbusds.jose.cryptoライブラリを使用しています。アンドロイドjava.lang.NoClassDefFoundError:org.bouncycastle.crypto.engines.AESEngine api 16

これは私が私のGradleファイルに宣言するものである:

compile 'com.nimbusds:nimbus-jose-jwt:4.23' 

すべてがAPI> = 19で正常に動作しますが、私は、API 16上でコードを実行しているとき、私はこの例外を取得しています:

java.lang.NoClassDefFoundError: org.bouncycastle.crypto.engines.AESEngine

ここに問題がありますか?なぜ、クラスAESENGINEはapi 16で利用できないのですか?

+0

java '1.8' ??そのバージョンをダウングレードすることができます '2.26.1' –

+0

私はそのライブラリ内の弾き語りの城への参照を見つけることができません。あなたは、これらを追加しようとすることができますhttp://stackoverflow.com/a/29787286/2308683 –

+0

私は本当にあなたが使用しているライブラリは、Androidで使用できるかどうかはわかりません。代わりの方法があります。 https://github.com/jwtk/jjwt –

答えて

5

nimbus-jose-jwtの従属リストを見ると、bouncycastleライブラリはありません。しかし、ソースコードを参照すると、より正確にはcom.nimbusds.jose.crypto.bcというパッケージには、bouncycastleを依存関係として宣言することなく使用していることがわかります。したがって、図書館では、bouncycastleが存在すると仮定しています。

解決策は、依存関係を手動で追加することです。まず、linkに従って、Androidでbouncycastleを使用する標準的な方法を実装します。

org.bouncycastle.crypto.engines.AESEngineはこれらのライブラリのいずれにも含まれていないため、問題は解決しません。

依存関係{ コンパイル 'org.bouncycastle:bcprov-jdk15on:1.54' }

その後、すべてが正常に動作する必要があります解決策は、1つのより多くの依存関係を追加することです。

概要:

gradle依存関係は次のようにlool必要があります。

dependencies { 
    compile 'com.nimbusds:nimbus-jose-jwt:4.23' 
    compile 'com.madgag.spongycastle:core:1.54.0.0' 
    compile 'com.madgag.spongycastle:prov:1.54.0.0' 
    compile 'com.madgag.spongycastle:pkix:1.54.0.0' 
    compile 'com.madgag.spongycastle:pg:1.54.0.0' 
    compile 'org.bouncycastle:bcprov-jdk15on:1.54' 
} 

、あなたがjava.security.Providerを登録する必要があります。

static { 
    Security.insertProviderAt(new org.spongycastle.jce.provider.BouncyCastleProvider(), 1); 
} 
1

あなたは光背・ホセ・JWTが宣言されていない依存関係bouncycastleに依存するため、環境がbouを提供しない場合にエラーが発生しますncycastleバージョン自体。これはAPIバージョン16で発生します。

これはライブラリの問題ですが、は目的ので完了している可能性が非常に高いですが、BouncycastleはさまざまなJDKバージョンで使用できるためです。 BouncycastleプロジェクトはBouncycastleのバージョン番号に反映させるのではなく、異なるJifバージョンを反映するために異なるArtifact名を使用することに決めました。 これは、バージョン・リゾルバが異なるバージョンを実際には同じアーティファクト(それらが技術的には同じクラスのセットを含むため)であると認識しないため、依存関係管理に問題を引き起こします。バージョンの競合を解決できないため、バージョン解決のエラーを投げることはできません。互換性のないメジャーバージョンでは

org.bouncycastle»bcprov-jdk16

org.bouncycastle»bcprov-jdk15

org.bouncycastle»bcprov-JDK14

これは、クラスパスにはBouncyCastleの複数同意のバージョンにつながることができます予期せぬクラスローダの動作や予期しないclassNotFound/Symbol not foundエラー(古いバージョンが使用されている場合は新しいバージョンが必要な場合)につながる可能性があります。

解決策は単純です:

このようなあなたのGradleファイルで明示的に必要な依存関係を追加します。

dependencies {compile 'org.bouncycastle:bcprov-jdk16:1.46'} 

または

// https://mvnrepository.com/artifact/org.bouncycastle/bcprov-jdk16 
compile group: 'org.bouncycastle', name: 'bcprov-jdk16', version: '1.46' 

をさらにLIBSが欠落している場合は、にしてみてくださいこれらのクラスを含むライブラリを特定し(それらをGoogleにするのが最も簡単です)、それらを明示的に追加します。

1

Android OSはBouncyCastleが既に含まれて出荷されています。 APIレベル16では、AESEngineクラスはAndroid OSに同梱されていませんでした(Androidは後でそのクラスを出荷することにしました)。そのため、クラスを見つけることができません。

コンパイル時にこのクラスは存在しますが、実行時には存在しません。このクラスをAPI 16以下で使用する必要がある場合は、そのクラス/ jarをAPKで出荷する必要があります。書き込み

compile "com.madgag.spongycastle:prov:1.54.0.0" 

のほか

はまた

apk "com.madgag.spongycastle:prov:1.54.0.0" 

これはAPKへのコンパイル時から、このクラスの範囲を拡張します、これを記述する必要があり、これはすべてのバージョンで利用できるようになりますアンドロイド。

注:クラス名の競合を避けるには、BouncyCastleではなくSpongyCastleを使用する必要があります。

関連する問題