如题,在整合springboot到equinox时,无法扫描到当前启动类包下的@Component等spring注解类到spring上下文,从而导致相应的bean无法被扫描到。
解决方法
根本原因是spring没有默认提供osgi bundle资源协议解析处理类,导致无法获得资源,直接上代码

标红的位置为空,导致无法在equinox获得资源,此实例在初始化时静态块中加载

应该是此处加载失败导致。
定位到原因,那就好解决了,上当前的解决代码
/**
* 为spring的类扫描路径增加osgi资资解析处理。(将获得的:bundleresource://xxx/xxx.xx转换为绝对路径file:///xxx/xxx.xx).
* spring的类PathMatchingResourcePatternResolver有静态块会尝试检查是否是OSGI环境,如是则会设置Equinox的资源处理。
*/
public static void addOSGIScanPathResolve() {
try {
final Field equinoxResolveMethodField = PathMatchingResourcePatternResolver.class.getDeclaredField("equinoxResolveMethod");
boolean fieldAccessAble = equinoxResolveMethodField.isAccessible();
equinoxResolveMethodField.setAccessible(true);
final Bundle equinoxCommonBundle = SpringUnitUtil.getBundleBySymbolicName("org.eclipse.equinox.common", "3.6.200.v20130402-1505");
final Class FileLocatorClaass = equinoxCommonBundle.loadClass("org.eclipse.core.runtime.FileLocator");
final Method resolveMethod = FileLocatorClaass.getMethod("resolve", URL.class);
equinoxResolveMethodField.set(null,resolveMethod);
equinoxResolveMethodField.setAccessible(fieldAccessAble);
} catch (Exception e) {
e.printStackTrace();
}
}
以上方法在启动器启动时调用即可。
评论区