Osgi 在adobe CQ5中使用servlet api 3捆绑包

Osgi 在adobe CQ5中使用servlet api 3捆绑包,osgi,aem,Osgi,Aem,我试图在AdobeCQ5安装中使用ServletAPI版本3,但没有取得多大成功 已经有一个包导出javax.servlet包(版本2.5),所以我部署了一个版本为3.1.0的包。这包开始还可以 问题在于启动使用api v3的捆绑包。我遇到了一个我无法完全理解的OSGi异常: POST/system/console/bundles/250 HTTP/1.1]cqse-httpservice%bundles.pluginTitle:无法启动(org.osgi.framework.BundleExc

我试图在AdobeCQ5安装中使用ServletAPI版本3,但没有取得多大成功

已经有一个包导出javax.servlet包(版本2.5),所以我部署了一个版本为3.1.0的包。这包开始还可以

问题在于启动使用api v3的捆绑包。我遇到了一个我无法完全理解的OSGi异常:

POST/system/console/bundles/250 HTTP/1.1]cqse-httpservice%bundles.pluginTitle:无法启动(org.osgi.framework.BundleException:

在现有import 266.0.javax.servlet之间解析模块250.9时,包“javax.servlet”的约束冲突

归咎于[[250.9]包;(&(package=javax.servlet)(版本>=3.0.0)(!(版本>=4.0.0))]

并使用constraint 22.1.javax.servlet

归咎于[250.9 ]包;(包=COM.Tay.Cq.WCM.Field.Frm),[210 ]包; (&(package=org.apache.sling.api.resource)(版本>=2.0.0)),[93.0] package;(&(package=javax.servlet)(版本>=2.4.0)))

  • bundle 266导出javax.servlet v=3.10(我安装了这个)
  • bundle 22导出javax.servlet v=2.5(由CQ5提供)
  • bundle 250(mine)从266中导入javax.servlet,版本=[3.0,4])。它还从210和93中导入包
  • bundle 210从22导入javax.servelt v=2.5(但清单中的导入没有版本。可能这就是问题所在?)
  • bundle 93在导入包中有javax.servlet;version=“2.4”。但不知怎的,它从(22)解析为javax.servlet,version=2.5.0

问题似乎出在bundle 250的依赖项上,但我不确定问题出在哪里。一个包的两个版本可以在OSGi容器中共存。bundle 210和93运行时没有问题。

这很可能是因为所使用的http服务只支持servlet 2.5,这就是为什么这是预安装的ervlet版本。由于您安装了servlet 3.0 api,您的捆绑包确实解决了问题,但当它尝试导出http服务获取的服务时,您遇到了此问题。根本原因是使用的http服务实现。我不知道这是否可行,但您可以尝试使用Pax Web 2替换http服务版本或者3。Pax Web从版本2开始就支持Servlet API。

在阅读注释中的左边部分后,我注意到我的捆绑包的依赖项公开了Servlet API 2.5的类。这导致了约束并阻止了我的捆绑包。如果我理解正确,捆绑包210的类路径将扩展到我的捆绑包


因此,唯一的选择将是删除我的捆绑包与其他捆绑包之间的依赖关系,这恐怕是我无法做到的。我将不得不在没有V3 api的情况下处理这一问题。这篇文章深入阐述了什么是使用约束冲突,以及为什么很难跟踪。希望这能帮助您跟踪您的问题。我担心问题是@Moch Daear评论中的ies。http servlet的某些类由捆绑包的api公开,因此它们的依赖关系需要2.5版。