我知道,当安装了CQ中捆绑软件的状态时,就存在依赖关系,这就是为什么捆绑软件不能处于“活动”状态的原因。
我在CQ5服务中使用的是Jersey Client v 2.17,所以我需要Jersey Core Client Jar。我在/bundle/pom.xml中添加了依赖项。我的捆绑包成功编译并部署,但从未启用
我在Felix Console中手动添加了Jersey客户端Jar,这样做是激活了我的捆绑包,但Jersey客户端Jar不处于活动状态,所以我不断收到ClassNotFoundError,因为Jersey客户端Jar中也有传递性依赖项。
我尝试了以下方法:
通过在Felix Console中添加Jar手动尝试解决依赖关系。
我失败了。循环永无止境(传递依赖项)
我添加了DynamicImport-Package: *
,尝试通过更改Jersey Jersey Core Client Jar的清单进行一些调整。这欺骗了OSGi容器,即在运行时将找到Jar。过去这对我有用,但是现在它需要一些不存在的课程。(Jars the Jersey Client和My Bundle都变为活动状态,但我得到了
找不到类,因为实际上没有类,所以出现错误
我尝试欺骗OSgi Conatainer多少钱)失败。
因此,尝试了另一件事,我在/bundle/pom.xml中添加了所有依赖的Jar。当我使用Maven时,我认为这可以解决问题,但是我的捆绑包仍未安装
我的第三步是一个惨痛的失败。无论如何,无论如何在Felix控制台中手动安装所有Jars时,Maven对您有什么好处?!
我该怎么办 ?
最佳答案
首先,Maven仅在构建时依赖项方面为您提供帮助,并且Maven依赖项位于jar级别。将捆绑软件安装到OSGi容器中时,您必须处理程序包级别的运行时依赖项。
因此,由于依赖项的工作方式不同,因此在构建时和运行时之间存在不匹配。您可能会说Maven根本不是一个很好的选择,这就是为什么至少有些做很多OSGi应用程序的人已经切换到Bnd / Bndtools和命令行Gradle构建的原因。
回到你的问题。您在运行时遇到缺少的依赖项。您的捆绑软件正在导入未由任何捆绑软件导出的软件包。要解决此问题,可以使用以下两种策略之一:
您可以将所需的所有依赖项嵌入到包中。实际上,您需要在此嵌入Jersey客户端(以及传递其所需的所有依赖项)。您不会将其中任何一个暴露给其他包,所有代码都将最终出现在您的包中。
您可以将所需的所有依赖项安装为捆绑包。这意味着您需要暂时找到运行Jersey客户端所需的所有软件包。有一些工具可以帮助您。 Maven不是其中之一。
希望这可以帮助。这可能不是您希望听到的。