Closed zhengchangqing closed 1 year ago
可以发一下更多的日志吗,instantiate这个后面应该有更具体的错误原因,我也出现过类似错误,已经可以自己手动解决了
我也出现了同样的问题,原因这个依赖是宿主的,但是biz本身没有这个依赖,但是biz是基于spring创建的,在初始化的时候会在EnvironmentPostProcessorApplicationListener把宿主对应的依赖类拿出来通过Class,forname进行加载.请问这个问题最后是怎么解决的? 难道要通过sofaboot进行spring上下文隔离? @penglinzhang @gaosaroma
我也出现了同样的问题,原因这个依赖是宿主的,但是biz本身没有这个依赖,但是biz是基于spring创建的,在初始化的时候会在EnvironmentPostProcessorApplicationListener把宿主对应的依赖类拿出来通过Class,forname进行加载.请问这个问题最后是怎么解决的? 难道要通过sofaboot进行spring上下文隔离? @penglinzhang @gaosaroma
是这个问题导致的,因为 EnvironmentPostProcessorApplicationListener 的这段逻辑会从基座里搜索 EnvironpentPostProcessor,然后搜索出了 com.baomidou.mybatisplus.autoconfigure.SafetyEncryptProcessor
,但是在初始化的时候会从模块里查找这个类,因为这个类在模块里没有声明过,所以模块是查找不到这个类的。
解决方法:模块里也声明下mybatis-plus-boot-starter这个依赖,pom 的scope 可以设置为 provided。这是启动的成功的截图
我也出现了同样的问题,原因这个依赖是宿主的,但是biz本身没有这个依赖,但是biz是基于spring创建的,在初始化的时候会在EnvironmentPostProcessorApplicationListener把宿主对应的依赖类拿出来通过Class,forname进行加载.请问这个问题最后是怎么解决的? 难道要通过sofaboot进行spring上下文隔离? @penglinzhang @gaosaroma
是这个问题导致的,因为 EnvironmentPostProcessorApplicationListener 的这段逻辑导致 EnvironpentPostProcessor 只会从基座里搜索,然后搜索出了
com.baomidou.mybatisplus.autoconfigure.SafetyEncryptProcessor
,但是在初始化的时候会从模块里查找这个类,因为这个类在模块里没有声明过,所以模块是查找不到这个类的。解决方法:模块里也声明下mybatis-plus-boot-starter这个依赖,pom 的scope 可以设置为 provided。这是启动的成功的截图
这样修改是能解决现有的问题,但是master-biz里面的com.baomidou.mybatisplus.autoconfigure.SafetyEncryptProcessor,在非master的biz启动时也要进行处理,这个逻辑本身是不是有点问题呢?是否可以改成当启动非master的biz的时候,不必要的不处理
如果有方案,可以提 proposal 或者 PR。
我也出现了同样的问题,原因这个依赖是宿主的,但是biz本身没有这个依赖,但是biz是基于spring创建的,在初始化的时候会在EnvironmentPostProcessorApplicationListener把宿主对应的依赖类拿出来通过Class,forname进行加载.请问这个问题最后是怎么解决的? 难道要通过sofaboot进行spring上下文隔离? @penglinzhang @gaosaroma
现在解决方案比较粗暴,就是把宿主应用的这个依赖在Biz应用中声明(虽然没啥用),然后scope为provided,可以暂时解决这个问题。
我有一个方案,EnvironmentPostProcessorApplicationListener扫描EnvironmentPostProcessor是可以传入resourceLoader,而这个resourceLoader正是application.getResourceLoader(),我暂且改造启动类SpringApplication的resourceLoader为BizClassLoader(一般正是null)程序可以启动成功,至于有没有其他影响还不清楚,但初步看是能成的。
我也出现了同样的问题,原因这个依赖是宿主的,但是biz本身没有这个依赖,但是biz是基于spring创建的,在初始化的时候会在EnvironmentPostProcessorApplicationListener把宿主对应的依赖类拿出来通过Class,forname进行加载.请问这个问题最后是怎么解决的? 难道要通过sofaboot进行spring上下文隔离? @penglinzhang @gaosaroma
现在解决方案比较粗暴,就是把宿主应用的这个依赖在Biz应用中声明(虽然没啥用),然后scope为provided,可以暂时解决这个问题。
我有一个方案,EnvironmentPostProcessorApplicationListener扫描EnvironmentPostProcessor是可以传入resourceLoader,而这个resourceLoader正是application.getResourceLoader(),我暂且改造启动类SpringApplication的resourceLoader为BizClassLoader(一般正是null)程序可以启动成功,至于有没有其他影响还不清楚,但初步看是能成的。
这样如何呢
我的方法比较粗暴,直接自己给biz创建一个。 然后就不报错了~ 暂时没有发现什么影响!
目前采用 @penglinzhang 提供的方法解决的: https://github.com/koupleless/samples/blob/main/springboot-samples/web/tomcat/biz2-web-single-host/src/main/java/com/alipay/sofa/web/biz2/Biz2Application.java
在模块main方法里指定 resourceLoader
Describe the bug
当宿主应用依赖多于业务应用且该依赖实现了SpringBoot的扩展点EnvironmentPostProcessor时,采用合并部署模式,业务应用启动报错。报错信息如下:
Steps to reproduce
宿主应用: sofa-ark-spring-guides 业务应用: spring-boot-ark-biz
① 宿主应用修改pom.xml:
② 宿主应用修改启动类:
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
③ 业务应用修改pom.xml:
Environment
java -version
): 1.8.0_73uname -a
): Windows10