Jetty 9.4.x升级至10版本时OSGi依赖验证报错如何解决
Jetty 10 OSGi迁移服务加载能力缺失错误解决方案
你遇到的错误是Jetty 10的org.eclipse.jetty.webapp bundle在MANIFEST.MF中声明了如下依赖要求:
Require-Capability: osgi.serviceloader; filter:"(osgi.serviceloader=org.eclipse.jetty.webapp.Configuration)"
该要求表示需要OSGi运行环境提供ServiceLoader能力,来加载org.eclipse.jetty.webapp.Configuration接口的实现类,你的现有启动配置没有满足该要求,所以触发验证错误。
修复方案
方案1:调整SPI Fly启动配置(优先推荐,符合OSGi规范)
你已经引入了Aries SPI Fly动态bundle来处理ServiceLoader的OSGi适配,只需要调整配置即可:
- 将
org.apache.aries.spifly.dynamic.bundle的启动级别调整为1,确保它在所有Jetty bundle之前启动,这样才能正常为Jetty的SPI接口做字节码增强 - 确认
org.eclipse.osgi.services的版本不低于3.7,满足OSGi ServiceLoader规范1.0的要求 - 替换你当前使用的SLF4J 2.0.0.alpha1预览版为正式发布的SLF4J 2.0.x版本,避免日志依赖兼容问题
- 将
方案2:手动注册Configuration服务(适合嵌入式Jetty场景)
如果你是自行编码启动嵌入式Jetty,可以手动将需要的Configuration实现注册到OSGi服务注册表,跳过SPI自动扫描的要求,示例代码如下:
import org.eclipse.jetty.webapp.*; import org.osgi.framework.BundleContext; import org.osgi.framework.FrameworkUtil; // 获取当前bundle的上下文 BundleContext context = FrameworkUtil.getBundle(getClass()).getBundleContext(); // 按需添加你需要用到的Jetty WebApp配置实现 Configuration[] configs = new Configuration[]{ new WebXmlConfiguration(), new AnnotationConfiguration(), new JettyWebXmlConfiguration(), new FragmentConfiguration() }; // 注册服务 for (Configuration config : configs) { context.registerService(Configuration.class.getName(), config, null); }方案3:手动指定WebApp配置(最简方案,不需要依赖SPI能力)
如果你完全不需要Jetty的自动配置发现机制,在初始化WebAppContext的时候直接传入配置列表,即可绕过ServiceLoader依赖检查:
WebAppContext webApp = new WebAppContext(); // 手动指定所有需要的配置,不需要从SPI加载 webApp.setConfigurations(new Configuration[]{ new WebXmlConfiguration(), new JettyWebXmlConfiguration() });
内容的提问来源于stack exchange,提问作者flavio.donze
相关产品推荐
相关产品推荐

