我在我的安卓客户端中使用com.nimbusds.jose.crypto库来做一些jwt内容。
这就是我在gradle文件中声明的内容:
compile 'com.nimbusds:nimbus-jose-jwt:4.23'在api >=19上一切都很好,但是当我在api 16上运行代码时,我得到了这个异常:
java.lang.NoClassDefFoundError: org.bouncycastle.crypto.engines.AESEngine。
这里有什么问题?为什么AESENGINE类在api 16上不可用?
发布于 2016-11-20 14:50:20
如果查看nimbus-jose-jwt的依赖列表,则没有bouncycastle库。但是,如果您查看源代码,更精确地查看包com.nimbusds.jose.crypto.bc,那么您可以看到它使用bouncycastle而不声明为依赖项。因此,库只是假定存在bouncycastle。
解决方案是手动添加依赖项。首先,遵循link实现在Android上使用bouncycastle的标准方法。
然而,这并不能解决问题,因为org.bouncycastle.crypto.engines.AESEngine不在其中一个库中。解决方案是再添加一个依赖项:
依赖项{ compile‘org.奖品城堡:bcprov-jdk15on:1.54’}
那么一切都会好的。
摘要:
gradle依赖关系应该类似于:
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);
}发布于 2017-01-25 10:16:27
Android是随BouncyCastle一起发布的。在API 16中,AESEngine类没有随Android一起提供(Android后来决定发布该类).Therefore,它无法找到该类。
但是,在编译时存在这个类,但在运行时是not.In --当您需要在API 16或API 16以下使用这个类时,您必须将该类/jar随APK一起发送。
除写作外
compile "com.madgag.spongycastle:prov:1.54.0.0"你还得写这个
apk "com.madgag.spongycastle:prov:1.54.0.0"这将将该类的范围从编译时扩展到APK,并且在Android的所有版本中都可以使用。
注意:为了避免类名冲突,您必须使用SpongyCastle而不是BouncyCastle。
发布于 2016-11-23 11:42:43
您的依赖关系尼姆-何塞-jwt没有声明的依赖于赏金城堡,因此,如果环境本身不提供赏金城堡版本,就会发生错误。这种情况发生在API版本16上。
虽然您可以说,这是库的一个问题,但这很可能是在上完成的,因为Bouncy城堡可以用于不同的JDK版本。Bouncy城堡项目决定使用不同的伪名来反映不同的JDK版本,而不是在Bouncy城堡版本号中反映它。这导致了依赖关系管理方面的问题,因为版本解析器不承认不同版本实际上是相同的工件(从技术上讲,因为它们包含一组相同的类)。并且不能解决版本冲突,因此不能抛出版本解决错误,例如在不兼容的主要版本上。
org.bouncycastle bcprov-jdk16 16
对
org.bouncycastle bcprov-jdk15 15
对
org.bouncycastle bcprov-jdk14 14
这可能导致类路径上的赏金城堡出现多个并发版本,这反过来可能导致不可预测的类加载程序行为或不可预测的classNotFound /Symbol未找到错误(如果使用旧版本,则需要更新版本)。
解决方案很简单:
在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'如果缺少更多的库,请尝试标识包含这些类的库(最简单的方法是搜索它们),并显式地添加它们。
https://stackoverflow.com/questions/40572436
复制相似问题