koupleless / koupleless

modular dev framework and serving platform to enable app evolve from monolithic to microservices and also serverless smoothly. 模块化研发框架与运维调度系统,帮助应用解决研发运维系列痛点问题,省资源、秒级启动、灵活部署、快速需求交付等
https://koupleless.io
Apache License 2.0
164 stars 35 forks source link

Jdk ServiceLoader class cast exception when Biz install #148

Closed rapidark closed 5 months ago

rapidark commented 6 months ago

Describe the question or bug

When biz install, spring class use Jdk AppClassLoader loaded class, when spring refresh, scan base biz classpath classes, the ServicLoader generic class is load from JdkAppClassLoader, but ServiceLoader load impl Class is from BizClassLoader, class cast exception caused.

For example: env: 1: Base biz classpath containe nacos-client.jar 2: Module bizA nacos-client.jar pom dependency scope is compile.

When install Module bizA, spring context refresh, com.alibaba.nacos.client.config.filter.impl.ConfigFilterChainManager created. ` public ConfigFilterChainManager(Properties properties) {

ServiceLoader<IConfigFilter> configFilters = ServiceLoader.load(IConfigFilter.class);

for (IConfigFilter configFilter : configFilters) {

    addFilter(configFilter);

}

} `

spring class use Jdk AppClassLoader, scaned ConfigFilterChainManager used from Jdk AppClassLoader, ServiceLoader<IConfigFilter> configFilters the define code IConfigFilter is used from Jdk AppClassLoader,

configFilters = ServiceLoader.load(IConfigFilter.class); ServiceLoader.load impl class "com.alibaba.nacos.client.config.filter.impl.ConfigEncryptionFilter" isLoad from BizClassLoader, and ConfigEncryptionFilter's interface class "com.alibaba.nacos.api.config.filter.IConfigFilter" is load from BizClassLoader,

now, the class "com.alibaba.nacos.client.config.filter.impl.ConfigEncryptionFilter" from BizClassLoader can't be cast to "com.alibaba.nacos.api.config.filter.IConfigFilter" define in the code "ServiceLoader configFilters " which "IConfigFilter" class load from Jdk AppClassLoader.

Expected behavior

Install biz module success.

Actual behavior

Caused by: java.util.ServiceConfigurationError: com.alibaba.nacos.api.config.filter.IConfigFilter: com.alibaba.nacos.client.config.filter.impl.ConfigEncryptionFilter not a subtype

Environment

lvjing2 commented 6 months ago

support nacos @gaosaroma

gaosaroma commented 5 months ago

Koupleless version: 2.1.0 SOFAArk version: 3.1.0 JVM version: 17

是使用 springboot 3.2.x 么? 在 springboot 3.2.x 下,koupleless.runtime.version 2.1.x, sofaark version 3.1.x, JVM version: 17, 需要使用 0.3.0-RC 及以上版本的 nacos-config-spring-boot-starter 和 nacos-discovery-spring-boot-starter

在 springboot 3.0.x 或 3.1.x 下,koupleless.runtime.version 2.0.x, sofaark version 3.0.x, JVM version: 17, 也需要使用 0.3.0-RC 及以上版本的 nacos-config-spring-boot-starter 和 nacos-discovery-spring-boot-starter

本地实验了下,用以上版本,模块和基座能正常使用 nacos 做配置管理

gaosaroma commented 5 months ago

如果是其他使用方式,请提供下更完整的依赖信息

gaosaroma commented 5 months ago

没有其他问题的话,这个 issue 就先关闭了,有问题欢迎随时 reopen