coze 的jwt和若依冲突解决方案

Aperta
#103 3 commenti 0 reazioni 0 assegnatari Vedi su GitHub

Nessuno ha ancora preso questa issue.

Valutazione

Difficoltà
3/5
Tempo stimato
1-2 giorni
Idoneità per principianti
38/100
Tipo di issue
Bug
Chiarezza
Abbastanza chiara
Stato di attività
Ferma
Stack tecnologico
java

Direzione di ricerca

Inizia dalle voci dello stack trace di DefaultJWTBuilder.generateJWT e JWTOAuthClient.doGetAccessToken, quindi esamina l’albero delle dipendenze pertinente di pom.xml per le versioni di jjwt in ruoyi-tax, ruoyi-common e coze-api. Conferma la versione di JWT risolta e verifica che l’esempio OAuth non generi più NoSuchMethodError dopo una build Maven pulita.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Descrizione

问题现象

在使用 coze-api 进行JWT OAuth认证时遇到运行时错误:

Exception in thread "main" java.lang.NoSuchMethodError: io.jsonwebtoken.JwtBuilder.signWith(Ljava/security/Key;Lio/jsonwebtoken/SignatureAlgorithm;)Lio/jsonwebtoken/JwtBuilder;
	at com.coze.openapi.service.auth.DefaultJWTBuilder.generateJWT(DefaultJWTBuilder.java:25)
	at com.coze.openapi.service.auth.JWTOAuthClient.doGetAccessToken(JWTOAuthClient.java:114)
	at com.coze.openapi.service.auth.JWTOAuthClient.getAccessToken(JWTOAuthClient.java:52)
	at com.ruoyi.coze.controller.JWTOAuthExample.main(JWTOAuthExample.java:95)

根本原因分析

核心问题:JWT库版本冲突

项目中同时存在多套JWT相关依赖:

项目原有依赖 (ruoyi-common):

io.jsonwebtoken:jjwt-api:0.9

io.jsonwebtoken:jjwt-impl:0.9

io.jsonwebtoken:jjwt-jackson:0.9

coze-api自带依赖:

com.auth0:java-jwt:3.18.2

io.jsonwebtoken:jjwt-api:0.11.5

io.jsonwebtoken:jjwt-impl:0.11.5

io.jsonwebtoken:jjwt-jackson:0.11.5

冲突机制:

不同版本的JWT库API签名不兼容

类加载器无法确定使用哪个版本的方法实现

运行时调用到错误版本的方法签名

问题诊断过程

  1. 依赖树分析
mvn dependency:tree -pl ruoyi-tax | grep -E "(jwt|coze)"

发现多个JWT库同时存在:

[INFO] \- com.coze:coze-api:jar:0.3.2:compile
[INFO]    +- com.auth0:java-jwt:jar:3.18.2:compile
[INFO]    +- io.jsonwebtoken:jjwt-api:jar:0.11.5:compile
[INFO]    +- io.jsonwebtoken:jjwt-impl:jar:0.11.5:runtime
[INFO]    +- io.jsonwebtoken:jjwt-jackson:jar:0.11.5:runtime

解决方案

方案一

升级父项目依赖,使依赖保持一致:

pom.xml中改为:

<jwt.version>0.11.5</jwt.version>

然后清理 maven:

方案二

业务项目中移除依赖:

<!-- 移除coze-api的所有exclusions -->
<dependency>
    <groupId>com.coze</groupId>
    <artifactId>coze-api</artifactId>
    <version>0.3.2</version>
    <!-- 不添加任何exclusions,让其使用完整的JWT依赖 -->
</dependency>

<!-- 从ruoyi-common中排除JWT依赖,避免冲突 -->
<dependency>
    <groupId>com.ruoyi</groupId>
    <artifactId>ruoyi-common</artifactId>
    <exclusions>
        <exclusion>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt</artifactId>
        </exclusion>
        <exclusion>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt-api</artifactId>
        </exclusion>
        <exclusion>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt-impl</artifactId>
        </exclusion>
        <exclusion>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt-jackson</artifactId>
        </exclusion>
    </exclusions>
</dependency>

补充:两种方案可以同时使用,在我的测试中,方案一执行后清理 maven 后依然不行,方案二也不行,第二天起来丢给 ai 分析了一波(可能是用命令清理了缓存还是什么,就可以了),删除了方案二的代码依旧可行,我的最终代码是保留了方案一

Lingua principale
Java
Stelle
214
Fork
97
Metriche di merge delle PR
Nessuna PR unita negli ultimi 30g

Guida per i contributori

Apri la guida per i contributori

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di coze-dev/coze-java

Tutte le issue di coze-dev/coze-java

Issue simili

Altre issue su Java

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.