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.54k stars 487 forks source link

打包ark plugin后,如何正常使用导出类中的spring特性 #60

Closed seaHeater closed 6 years ago

seaHeater commented 6 years ago

Your question

ark plugin导出类中的spring特性被屏蔽

Your scenes

对内提供了一个基础包,希望可以解决其他项目maven引入后,可能出现的依赖冲突问题。

使用sofa-ark的步骤: 1.将基础包打包成ark plugin,导出需要的类; 2.spring-boot项目引入ark plugin和sofa-ark-springboot-starter,打成ark包; 3.执行2生成的可执行包

结果: 1.不涉及到spring的类能正常通过PluginClassLoader加载; 2.使用spring相关特性的类,会出现以下几类错误和异常: 1)ArrayStoreException(Application监听器) 2)ClassCastException(Condition注解) 3)java.lang.LinkageError(get bean)

Your advice

对于需要打包成ark plugin导出的类,如果用到了spring特性,spring-boot项目引入这样的插件,有没有什么比较好的解决方案

Environment

QilongZhang commented 6 years ago

@seaHeater ark plugin 和 ark biz 是两层模型,参考 https://alipay.github.io/sofastack.github.io/docs/ ark plugin 只能委托给 plugin 相互加载类,即 ark plugin 只看的到其他 ark plugin 的导出类,不能委托 ark biz加载类。 ark biz 运行在 ark plugin 之上,默认情况下,ark biz能看到ark plugin所有的导出类。如果ark plugin使用了spring类,但是没有导出。那么这个ark plugin和ark biz使用的spring 类必然是不同的类加载器加载,导致报LinkageError等错误。

如果把spring相关包打入到 ark plugin,需要确认一点,ark biz使用这个ark plugin的时候,spring相关的类确保是同一个类加载器加载。有两个解决方案:

QilongZhang commented 6 years ago

@seaHeater 先关了,如果有其他问题可以重新打开。

seaHeater commented 6 years ago

感谢你提供的方案,问题已经得到了解决~~