Android低版本下从com.auth0.jwt.JWT迁移至io.jsonwebtoken.Jwts求助
解决Android 26以下版本JWT创建兼容问题(迁移到JJWT库)
问题原因
你使用的com.auth0.jwt库依赖Java 8及以上特性,而Android 26以下版本对Java 8特性支持不完善,导致JWTCreator类无法被加载,抛出NoClassDefFoundError异常。
迁移到io.jsonwebtoken(JJWT)库的实现步骤
1. 添加依赖
在Module级别的build.gradle中引入JJWT的依赖:
implementation 'io.jsonwebtoken:jjwt-api:0.11.5' implementation 'io.jsonwebtoken:jjwt-impl:0.11.5' implementation 'io.jsonwebtoken:jjwt-jackson:0.11.5'
2. 替换原有代码
JJWT的API风格与auth0库接近,以下是对应你原有逻辑的实现:
import io.jsonwebtoken.Jwts; import io.jsonwebtoken.SignatureAlgorithm; import io.jsonwebtoken.security.Keys; import java.util.Date; import java.nio.charset.Charset; // 生成JWT令牌的方法 String generateToken(long time, Object claim) { // 将字符串密钥转换为JJWT所需的SecretKey对象 byte[] keyBytes = "my secret key".getBytes(Charset.forName("UTF-8")); return Jwts.builder() // 设置过期时间,对应原代码的withExpiresAt .setExpiration(new Date(System.currentTimeMillis() + time)) // 添加自定义Claim,对应原代码的withClaim .claim("myClaim", claim) // 可继续添加其他自定义Claim // .claim("anotherClaim", anotherValue) // 使用HMAC256算法签名,传入密钥和指定算法 .signWith(Keys.hmacShaKeyFor(keyBytes), SignatureAlgorithm.HS256) // 生成最终的JWT字符串 .compact(); }
关键API对应说明
Jwts.builder()等价于原库的JWT.create()setExpiration(Date)等价于原库的withExpiresAt(Date)claim(String, Object)等价于原库的withClaim(String, Object)signWith(SecretKey, SignatureAlgorithm)等价于原库的sign(Algorithm.HMAC256(...))
兼容注意点
- 用
Charset.forName("UTF-8")替代StandardCharsets.UTF_8,适配Android 26以下版本 - 移除原有
com.auth0.jwt的依赖,避免类冲突
内容的提问来源于stack exchange,提问作者Andrei Naumets
相关产品推荐
相关产品推荐

