阿里巴巴通义千问VL,sdk dashscope-sdk-java流式调用模型踩坑记录,报错:okhttp3/internal/connection/RealCall

解决Java调用通义千问时的okhttp版本冲突问题

今天尝试使用java调用通义千问AL模型,实现图片问答功能,结果在pom.xml中引入最新的dashscope-sdk-java后,按照阿里云官方文档使用流式调用报错:okhttp3/internal/connection/RealCall,在网上搜索无果,经过分析相关功能博主的相关问题博客,终于找到问题根源,特做此记录,希望可以帮助到相关问题的朋友。

阿里云官方调用文档:https://help.aliyun.com/document_detail/2712587.html?spm=a2c4g.2712569.0.i12

1.引入的依赖

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>dashscope-sdk-java</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-simple</artifactId>
                </exclusion>
            </exclusions>
            <version>2.14.0</version>
        </dependency>

2.官方流式调用代码:

    public static void streamCall()
            throws ApiException, NoApiKeyException, UploadFileException {
        MultiModalConversation conv = new MultiModalConversation();
        // must create mutable map.
        MultiModalMessage userMessage = MultiModalMessage.builder().role(Role.USER.getValue())
                .content(Arrays.asList(new HashMap<String, Object>(){{put("image", "https://dashscope.oss-cn-beijing.aliyuncs.com/images/dog_and_girl.jpeg");}},
                        new HashMap<String, Object>(){{put("text", "基于这幅图,讲一个故事");}})).build();
        MultiModalConversationParam param = MultiModalConversationParam.builder()
                .model(MultiModalConversation.Models.QWEN_VL_PLUS)
                .message(userMessage)
                .apiKey("you api key")
                .build();
        Flowable<MultiModalConversationResult> result = conv.streamCall(param);
        result.blockingForEach(item -> {
            System.out.println(item);
        });
    }

    public static void main(String[] args) {
        try {
            streamCall();
        } catch (ApiException | NoApiKeyException | UploadFileException e) {
            System.out.println(e.getMessage());
        }
        System.exit(0);
    }

运行错误信息

Exception in thread "main" java.lang.NoClassDefFoundError: okhttp3/internal/connection/RealCall
	at okhttp3.internal.sse.RealEventSource.connect(RealEventSource.kt:41)
	at okhttp3.sse.EventSources.createFactory$lambda$1(EventSources.kt:34)
	at com.alibaba.dashscope.protocol.okhttp.OkHttpHttpClient.lambda$streamOut$0(OkHttpHttpClient.java:279)
	at io.reactivex.internal.operators.flowable.FlowableCreate.subscribeActual(FlowableCreate.java:71)
	at io.reactivex.Flowable.subscribe(Flowable.java:14935)
	at io.reactivex.internal.operators.flowable.FlowableMap.subscribeActual(FlowableMap.java:37)
	at io.reactivex.Flowable.subscribe(Flowable.java:14935)
	at io.reactivex.internal.operators.flowable.BlockingFlowableIterable.iterator(BlockingFlowableIterable.java:42)
	at io.reactivex.Flowable.blockingForEach(Flowable.java:5772)
	at com.gkza.ruizhi.service.impl.TuringServiceImpl.streamCall(TuringServiceImpl.java:926)
	at com.gkza.ruizhi.service.impl.TuringServiceImpl.main(TuringServiceImpl.java:933)
Caused by: java.lang.ClassNotFoundException: okhttp3.internal.connection.RealCall
	at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
	... 11 more

错误原因:

经过分析错误是与项目中的huaweicloud的esdk-obs-java依赖里的okhttp版本冲突了,需注意pom文件里esdk-obs-java依赖在dashscope-sdk-java上方才会冲突,由此推断只要dashscope-sdk-java依赖上方有依赖里包括okhttp版本与dashscope-sdk-java冲突必会出现此问题。

具体如图:

以下是Maven Helper插件pom文件冲突的分析图

解决方法:

1.将esdk-obs-java依赖更换为与dashscope-sdk-java中的okhttp版本不冲突的版本,

2.pom文件里将esdk-obs-java依赖放到dashscope-sdk-java下方

3.删除esdk-obs-java依赖!

### 关于 `java.lang.NoClassDefFoundError` 的解决方案 当 Java 应用程序抛出 `java.lang.NoClassDefFoundError: okhttp3/internal/http2/StreamResetException` 错误时,这通常意味着 JVM 在运行时尝试加载某个类(这里是 `okhttp3.internal.http2.StreamResetException`),但由于某些原因未能找到其定义。 以下是可能的原因以及相应的解决方法: #### 1. **依赖冲突** 如果项目中存在多个版本的 OkHttp 或其他库之间的不兼容性,则可能导致此类题。可以通过以下方式排查并解决题: - 使用 Maven 或 Gradle 工具来分析项目的依赖树,查找是否存在重复或冲突的依赖项。 - 如果发现有多个版本的 OkHttp 被引入,应统一到同一个版本上。例如,在 Maven 中可以这样指定版本号[^4]: ```xml <dependency> <groupId>com.squareup.okhttp3</groupId> <artifactId>okhttp</artifactId> <version>4.9.0</version> <!-- 替换为你需要的具体版本 --> </dependency> ``` #### 2. **缺少必要的 JAR 文件** 此错误也可能是因为构建过程中未正确打包所需的 JAR 文件。确保在部署应用程序之前已将所有必需的第三方库包含进来。对于基于 IDE 开发的情况,请确认模块设置中的 Libraries 部分包含了完整的 OkHttp 及其子组件集合[^5]。 #### 3. **classpath 设置不当** 另一个常见原因是 classpath 配置错误。即使开发阶段一切正常,但如果目标环境中缺失这些外部资源文件或者路径拼写失误都会引发 NoClassDefFoundErrors 。因此建议重新审视启动脚本里 `-cp` 参数所指向的位置是否准确无误;如果是 Web 容器下的应用则需检查 WEB-INF/lib 下是否有对应 jar 存放。 #### 示例代码片段展示如何验证当前使用的 okHTTP 版本号: ```java System.out.println(Platform.get().toString()); // 输出类似于 &#39;OpenJDK Runtime Environment (build 1.8.0_275-b01)&#39; 和 &#39;OkHttp 3.x.y&#39; ``` --- ### 总结 上述提到的各种情况均有可能造成 `NoClassDefFoundError` 出现。针对具体实例——即涉及 `okhttp3.internal.http2.StreamResetException` 这一特定场景下推荐优先考虑升级至最新稳定版 OKHttp 来规避潜在 bug 同时简化维护成本。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值