tuya / tuya-connector

tuya-connector helps you efficiently create cloud development projects regarding the OpenAPI or message subscription capabilities. You can put all the focus on business logic without taking care of server-side programming nor relational databases.
Apache License 2.0
59 stars 34 forks source link

java.lang.NoClassDefFoundError: retrofit2/Call #30

Closed iszhaojn closed 5 months ago

iszhaojn commented 2 years ago

您好,我使用1.1.0版本的tuya-spring-boot-starter,调用接口的时候出现Caused by: java.lang.NoClassDefFoundError: retrofit2/Call 导致异常的是retrofit2.Retrofit#validateServiceInterface方法内的service.getDeclaredMethods() 此时service的值是com.xxxxx.ssssss.service.deviceprovider.tuya.ability.api.$DeviceConnector,也就是我定义的涂鸦接口 ,service对象的类加载器为AppClassLoader

运行环境 JDK11 解压jar后依赖包都在 tuya-spring-boot-starter-1.1.0.jar tuya-api-1.1.0.jar tuya-messaging-1.1.0.jar tuya-common-1.1.0.jar retrofit-2.9.0.jar okhttp-4.9.3.jar okio-jvm-2.8.0.jar gson-2.8.6.jar converter-gson-2.9.0.jar

请问开发者是否遇到过类似的问题呢?

com.tuya.connector.api.exceptions.ConnectorException: Error invoke connector. Cause: java.lang.NoClassDefFoundError: retrofit2/Call
    at com.tuya.connector.api.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:21) ~[connector-api-1.1.1.jar!/:na]
    at com.tuya.connector.api.core.ConnectorProxy.invoke(ConnectorProxy.java:57) ~[connector-api-1.1.1.jar!/:na]
    at com.sun.proxy.$Proxy150.getStatusById(Unknown Source) ~[na:na]
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na]
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
    at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na]
    at com.tuya.connector.api.plugin.Invocation.proceed(Invocation.java:29) ~[connector-api-1.1.1.jar!/:na]
    at com.tuya.connector.api.error.ErrorProcessorInterceptor.intercept(ErrorProcessorInterceptor.java:29) ~[connector-api-1.1.1.jar!/:na]
    at com.tuya.connector.api.plugin.Plugin.invoke(Plugin.java:26) ~[connector-api-1.1.1.jar!/:na]
    at com.sun.proxy.$Proxy150.getStatusById(Unknown Source) ~[na:na]
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na]
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
    at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na]
    at com.tuya.connector.api.plugin.Invocation.proceed(Invocation.java:29) ~[connector-api-1.1.1.jar!/:na]
    at com.tuya.connector.api.context.ContextInterceptor.intercept(ContextInterceptor.java:30) ~[connector-api-1.1.1.jar!/:na]
    at com.tuya.connector.api.plugin.Plugin.invoke(Plugin.java:26) ~[connector-api-1.1.1.jar!/:na]
    at com.sun.proxy.$Proxy150.getStatusById(Unknown Source) ~[na:na]
    at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183) ~[na:na]
    at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1655) ~[na:na]
    at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:484) ~[na:na]
    at java.base/java.util.stream.ForEachOps$ForEachTask.compute(ForEachOps.java:290) ~[na:na]
    at java.base/java.util.concurrent.CountedCompleter.exec(CountedCompleter.java:746) ~[na:na]
    at java.base/java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:290) ~[na:na]
    at java.base/java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(ForkJoinPool.java:1020) ~[na:na]
    at java.base/java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1656) ~[na:na]
    at java.base/java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1594) ~[na:na]
    at java.base/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:183) ~[na:na]
Caused by: java.lang.NoClassDefFoundError: retrofit2/Call
    at java.base/java.lang.Class.getDeclaredMethods0(Native Method) ~[na:na]
    at java.base/java.lang.Class.privateGetDeclaredMethods(Class.java:3166) ~[na:na]
    at java.base/java.lang.Class.getDeclaredMethods(Class.java:2309) ~[na:na]
    at retrofit2.Retrofit.validateServiceInterface(Retrofit.java:187) ~[retrofit-2.9.0.jar!/:na]
    at retrofit2.Retrofit.create(Retrofit.java:141) ~[retrofit-2.9.0.jar!/:na]
    at com.tuya.connector.api.core.delegate.RetrofitDelegate.<init>(RetrofitDelegate.java:79) ~[connector-api-1.1.1.jar!/:na]
    at com.tuya.connector.api.core.delegate.DelegateFactory.forRetrofit(DelegateFactory.java:23) ~[connector-api-1.1.1.jar!/:na]
    at com.tuya.connector.api.core.ConnectorProxy.invoke(ConnectorProxy.java:47) ~[connector-api-1.1.1.jar!/:na]
    ... 28 common frames omitted
Caused by: java.lang.ClassNotFoundException: retrofit2.Call
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581) ~[na:na]
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178) ~[na:na]
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522) ~[na:na]
    ... 36 common frames omitted
iszhaojn commented 2 years ago

经排查和依赖无关,是多线程调用的情况下会出异常,复现代码如下

        List.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10).parallelStream().forEach(v -> {
            connector.getById(deviceId);
        });
q1763868326 commented 2 years ago

我们这边用您提供的代码片段并没有触发对应的报错内容,可能与jdk版本或者编译器版本存在一定关系