java - OSGi Bundle 状态不是 Active(CQ5 Maven 项目)为什么?

标签 java maven osgi aem

我知道当CQ中的bundle安装时,存在依赖关系,这就是bundle不能为“Active”的原因。

我在 CQ5 服务中使用 Jersey Client v 2.17,因此我需要 Jersey Core Client Jar。我在 /bundle/pom.xml 中添加了依赖项。我的包已成功编译并部署但从未处于 Activity 状态

我在 Felix Console 中手动添加了 Jersey 客户端 Jar,通过执行此操作,我的 bundle 已激活,但 Jersey 客户端 Jar 未激活,因此我不断收到 ClassNotFoundError 信息也是 Jersey Client Jar 中的传递依赖项。

我尝试了以下方法:

  1. 尝试通过在 Felix Console 中添加 Jars 来手动解决依赖关系。 我失败了。循环永无止境(传递依赖)
  2. 通过更改 Jersey Core Client Jar 的 list 进行了一些调整,添加了 DynamicImport-Package: *。这会欺骗 OSGi 容器,使其在运行时找到 Jars。这在过去对我有用,但现在它需要一些不存在的类。(Jars the Jersey Client 和 My Bundle 都变得活跃,但我得到 找不到类错误,因为无论如何,类实际上不存在 我多么想欺骗 OSgi Conatainer)失败
  3. 因此尝试了另一件事,我在/bundle/pom.xml中添加了所有依赖的Jars。当我使用 Maven 时,我认为这可以解决问题,但我的包仍然是已安装而不是 Activity

我的第三步彻底失败了。无论如何,当您在 Felix 控制台中手动安装所有 Jars 时,Maven 对您有什么好处?!!

我应该做什么?

最佳答案

首先,Maven 仅帮助您处理构建时依赖关系,而 Maven 依赖关系处于 jar 级别。将 bundle 安装到 OSGi 容器中时,您必须处理包级别的运行时依赖项。

因此,构建时和运行时之间存在不匹配,因为依赖项的工作方式不同。您可能会说 Maven 根本不是那么好的匹配,这就是为什么至少一些做大量 OSGi 应用程序的人已经转向 Bnd/Bndtools 和命令行 Gradle 构建。

回到你的问题。您在运行时遇到缺少依赖项的情况。您的 bundle 正在导入任何 bundle 都未导出的包。要解决此问题,您可以使用以下两种策略之一:

  1. 您可以将所需的所有依赖项嵌入到包中。实际上,您需要嵌入 Jersey 客户端(以及它需要的所有依赖项)。您不会将其中任何一个暴露给其他 bundle ,所有代码最终都会在您的 bundle 中。
  2. 您可以将所需的所有依赖项安装为 bundle 。这意味着您需要间接查找运行 Jersey 客户端所需的所有包。有一些工具可以帮助您做到这一点。 Maven 不是其中之一。

希望这有帮助。这可能不是您希望听到的。

关于java - OSGi Bundle 状态不是 Active(CQ5 Maven 项目)为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29912636/

相关文章:

java - Android编程(cocos2d),白色矩形代替图像

java - 如何检查点是否在对角线周围的矩形内?

java - 如何在单个 Docker 容器中提供多模块 spring boot 应用程序?

java - System.out.print() 在测试方法中不显示任何内容

java - Maven:复制到 FTP 抛出 java.io.IOException:非法搜索

java - 在 OSGi 中更好地处理线程上下文类加载器

osgi - 当存在多个实现时,优先考虑容器内的 OSGi 服务选择

Java 在标签上打印。 MediaSize 的问题

java - 我如何在 OSGi 包中使用 Spring bean?

java - 计算 : How to add the operator before each number like a real calc