sofastack / sofa-ark

SOFAArk is a light-weight,java based classloader isolation framework.
https://www.sofastack.tech/projects/sofa-boot/sofa-ark-readme/
Apache License 2.0
1.56k stars 498 forks source link

Spring的component-scan扫不到plugin里的类 #247

Closed johnyannj closed 5 years ago

johnyannj commented 5 years ago

Spring的

他的原理是先getResources("com/xxx");

得到所有jar包里的目录。 然后列举目录里面所有类。 然后使用classloader去load。

当前ark对.class结尾的资源导出进行了处理。但是没有对这种情况进行兼容。

QilongZhang commented 5 years ago

biz 中是不会去扫描 plugin 中的类,除非配置了导出资源,biz 是看不到 plugin 中资源文件。

johnyannj commented 5 years ago

@QilongZhang 感觉ark的plugin 和 biz 必须是很严格要求的形式来使用。 想对一些历史上已经存在的功能模块,或者和biz耦合很紧密的框架类的功能模块,封装成plugin,好多模块使用了SPI扩展, 因为无法修改源码,又不能使用https://github.com/sofastack/sofa-ark/issues/186 改造。还挺麻烦的。

再次感谢您的耐心回复。

QilongZhang commented 5 years ago

@QilongZhang 感觉ark的plugin 和 biz 必须是很严格要求的形式来使用。 想对一些历史上已经存在的功能模块,或者和biz耦合很紧密的框架类的功能模块,封装成plugin,好多模块使用了SPI扩展, 因为无法修改源码,又不能使用#186 改造。还挺麻烦的。

再次感谢您的耐心回复。

可以参考下 sofa-rpc , 如何将框架结合比较紧密的的模块(rpc-sofa-boot-starter) 做成插件,可以看到没有代码修改,只需要 pom 文件即可。 引入 plugin 不一定 plugin 所有依赖的包都是独立加载,像 rpc-sofa-boot-plugin,只有 rpc 核心依赖及其间接依赖才由 plugin classloader 加载,其他和框架结合紧密的部分,比如 spring 相关类都是和应用一起的。从我们内部实践来看,plugin 和 biz 并没有严格的形式,事实上其实反而是相当自由的。

johnyannj commented 5 years ago

@QilongZhang 和你说的类似, 我们现在尝试做的,就是把框架类的spring 微服务类的都放在一个plugin里加载,里面关于类的查找,特殊逻辑处理。 其它“接口” 形式的模块做成独立的plugin。