背景

公司有一个自动化测试平台,核心模块使用 Scala 编写,最近升级Dubbo版本,发现泛化调用时,报 No adaptive method exist on extension 异常。

Dubbo 泛化调用 No adaptive method exist on extension 异常修复

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Caused by: java.lang.IllegalStateException: Failed to create adaptive instance: java.lang.IllegalStateException: Can't create adaptive extension interface org.apache.dubbo.common.extension.ExtensionFactory, cause: No adaptive method exist on extension org.apache.dubbo.common.extension.ExtensionFactory, refuse to create the adaptive class!
at org.apache.dubbo.common.extension.ExtensionLoader.getAdaptiveExtension(ExtensionLoader.java:620)
at org.apache.dubbo.common.extension.ExtensionLoader.<init>(ExtensionLoader.java:153)
at org.apache.dubbo.common.extension.ExtensionLoader.getExtensionLoader(ExtensionLoader.java:175)
at org.apache.dubbo.config.ReferenceConfig.<clinit>(ReferenceConfig.java:110)
... 49 common frames omitted
Caused by: java.lang.IllegalStateException: Can't create adaptive extension interface org.apache.dubbo.common.extension.ExtensionFactory, cause: No adaptive method exist on extension org.apache.dubbo.common.extension.ExtensionFactory, refuse to create the adaptive class!
at org.apache.dubbo.common.extension.ExtensionLoader.createAdaptiveExtension(ExtensionLoader.java:1083)
at org.apache.dubbo.common.extension.ExtensionLoader.getAdaptiveExtension(ExtensionLoader.java:616)
... 52 common frames omitted
Caused by: java.lang.IllegalStateException: No adaptive method exist on extension org.apache.dubbo.common.extension.ExtensionFactory, refuse to create the adaptive class!
at org.apache.dubbo.common.extension.AdaptiveClassCodeGenerator.generate(AdaptiveClassCodeGenerator.java:92)
at org.apache.dubbo.common.extension.ExtensionLoader.createAdaptiveExtensionClass(ExtensionLoader.java:1096)
at org.apache.dubbo.common.extension.ExtensionLoader.getAdaptiveExtensionClass(ExtensionLoader.java:1092)
at org.apache.dubbo.common.extension.ExtensionLoader.createAdaptiveExtension(ExtensionLoader.java:1081)
... 53 common frames omitted

默认情况下,dubbo 提供了一个自适应实现 AdaptiveExtensionFactory 参考:https://www.mail-archive.com/[email protected]/msg00121.html 文章所述,那我可能是没有加载自适应实现,导致报错。

通过 arthas 查看,发现没有加载自适应实现。

怀疑是打包时候没有把自适应实现打进包里,随着猜测搜索 sbt assembly + SPI 的问题。下面这个问题最为接近。

参考 https://stackoverflow.com/questions/74879217/sbt-assembly-and-lucene-an-spi-class-of-type-org-apache-lucene-codecs-codec-wit 有类似经历

这里自适应实现是通过 SPI 机制加载类,可能是打包是被忽略了,检查打包配置。
sbt assembly 打包配置