OSGi环境下Maven包装Bundle访问另一包装Bundle时抛出类未找到异常
核心问题
你遇到的ClassNotFoundException: okhttp3.Authenticator本质原因是:wrap生成的google-maps-services bundle将okhttp3标记为可选依赖,从它的Manifest可以明确看到:
Import-Package = ..., okhttp3;resolution:=optional, ...
而google-maps-services运行时完全依赖okhttp3,OSGi容器不会自动解析可选依赖,直接导致类加载失败。
解决方案步骤
1. 重新wrap google-maps-services,强制okhttp3为必须依赖
修改你的wrap命令,通过Pax Wrap的指令覆盖默认的Import-Package配置,把okhttp3设为强制导入:
<bundle>wrap:mvn:com.google.maps/google-maps-services/0.9.2$Import-Package=okhttp3;resolution:=mandatory,*</bundle>
这里的$是Pax Wrap的参数分隔符,后面的Import-Package指令会替换wrap工具自动生成的导入配置,确保okhttp3被标记为必须依赖,其他包保持自动生成逻辑。
2. 清理业务bundle的冗余配置
看你的address-parser bundle的Manifest,它导出了okhttp3和com.squareup.okhttp3包,但这些已经由wrap后的okhttp bundle导出了,业务bundle不需要重复导出,建议删除Export-package里的这两个条目,避免类加载冲突:
- Export-package: com.squareup.okhttp3,okhttp3, ... + Export-package: ... # 仅保留你自己的业务相关包即可
3. 验证配置生效
重新部署后,检查wrap_mvn_com.google.maps_google-maps-services_0.9.2的Manifest,确保Import-Package里的okhttp3不再带有resolution:=optional:
Import-Package = ..., okhttp3, ...
补充说明
Wrap工具默认会将一些依赖标记为可选,这是为了兼容某些库的可选依赖场景,但对于google-maps-services这种硬依赖okhttp3的库,必须手动强制依赖解析,否则OSGi容器不会主动绑定对应的bundle。
附:你提供的异常堆栈
Caused by: java.lang.NoClassDefFoundError: okhttp3/Authenticator at com.google.maps.GeoApiContext$Builder.<init>(GeoApiContext.java:318) at com.elavon.nabsd.creditsafe.beans.GooglePlacesAPIContext.<clinit>(GooglePlacesAPIContext.java:11) at com.elavon.nabsd.creditsafe.beans.AddressParser.getAddress(AddressParser.java:35) at com.elavon.nabsd.creditsafe.beans.AddressParser.dummyResponse(AddressParser.java:76) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.apache.camel.component.bean.MethodInfo.invoke(MethodInfo.java:408) at org.apache.camel.component.bean.MethodInfo$1.doProceed(MethodInfo.java:279) at org.apache.camel.component.bean.MethodInfo$1.proceed(MethodInfo.java:252) ... 13 more Caused by: java.lang.ClassNotFoundException: okhttp3.Authenticator not found by wrap_mvn_com.google.maps_google-maps-services_0.9.2 [1180] at org.apache.felix.framework.BundleWiringImpl.findClassOrResourceByDelegation(BundleWiringImpl.java:1556) at org.apache.felix.framework.BundleWiringImpl.access$400(BundleWiringImpl.java:77) at org.apache.felix.framework.BundleWiringImpl$BundleClassLoader.loadClass(BundleWiringImpl.java:1993) at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ... 24 more
内容的提问来源于stack exchange,提问作者fg78nc

