OSGi Bundle 状态不是活动的(CQ5 Maven 项目)为什么?

OSGi Bundle status is not Active (CQ5 Maven Project) WHY?

我知道当安装CQ中的bundle状态时,存在依赖关系,这就是为什么bundle不能"Active"。

我在 CQ5 服务中使用 Jersey Client v 2.17,所以我需要 Jersey Core Client Jar。我在 /bundle/pom.xml 中添加了依赖项。我的包成功编译和部署 但从未激活

我在 Felix 控制台中手动添加了 Jersey 客户端 Jar,通过这样做我的包被激活但是 Jersey 客户端 Jar 未激活 所以我一直在 ClassNotFoundError 因为在 Jersey Client Jar 中也有传递依赖。

我尝试了以下方法:

  1. 已尝试通过在 Felix 控制台中添加 Jar 来手动解决依赖项。 我失败。循环永无止境(传递依赖)
  2. 尝试通过更改 Jersey Core 客户端 Jar 的清单 进行一些调整,我添加了 DynamicImport-Package: *。这会欺骗 OSGi 容器,在运行时它会找到 Jars。这在过去对我有用,但现在它需要一些不存在的 classes。(Jersey Client 和 My Bundle 都激活了,但我得到了 class 未找到错误,因为 classes 实际上 不存在 无论如何 我多么想愚弄 OSgi Conatainer)Failed.
  3. 所以尝试了另一件事,我在/bundle/pom.xml中添加了所有依赖的Jars。当我使用 Maven 时,我认为这会解决问题,但我的包仍然 Installed NOT Active

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

我该怎么办?

首先,Maven只是帮助你构建时依赖,Maven依赖是jar级别的。将捆绑包安装到 OSGi 容器中时,您必须处理 运行 时间依赖性,这些依赖性处于包级别。

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

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

  1. 您可以将所有需要的依赖项嵌入到您的包中。实际上,您需要在此处嵌入 Jersey Client(以及传递它所需的所有依赖项)。您不会将其中任何一个暴露给其他包,所有代码最终都会在您的包中。
  2. 您可以将所需的所有依赖项作为捆绑包安装。这意味着您需要传递性地找到 运行 Jersey Client 所需的所有包。有一些工具可以帮助您做到这一点。 Maven 不是其中之一。

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

@Marcel Offermans 的回答是正确的,你应该安装你的包需要的所有依赖项 运行,如果它们太多,你没有正确管理它们。至于如何轻松部署它们,CQ5 有一个很好的方法。

在 CQ5 中,您通常通过包安装应用程序,这些包只是一个 zip 文件,其中包含要复制到 JCR 存储库中的内容以及您的应用程序可能需要的任何 Java 包。

您可能已经注意到,通常在 CQ5 应用程序中您有 2 个 maven 模块(提示:使用它们的 maven archetypes 来创建您的项目)一个用于内容,一个用于 java 代码(可能是不止一个,或 none)。 当你构建内容包时会发生什么,任何共享相同 groupID 的包都会自动嵌入到包中,但如果你使用的是任何尚未安装的包,你应该配置它以便它也被嵌入。

此示例配置取自 package documentation。它应该让您了解如何添加任何需要部署到 OSGi 容器的依赖项以及您的应用程序:

 <plugin>
       <groupId>com.day.jcr.vault</groupId>
        <artifactId>content-package-maven-plugin</artifactId>
        <version>0.0.20</version>
        <extensions>true</extensions>
        <configuration>
        <filters>
            <filter>
            <root>/apps/myapp</root>
            </filter>
         </filters>
         <embeddeds>
            <embedded>
            <groupId>org.apache.sling</groupId>
            <artifactId>org.apache.sling.jcr.jackrabbit.usermanager</artifactId>
            <target>/apps/myproject/install</target>
             </embedded>
         </embeddeds>
         </configuration>
    </plugin>

作为最后的提示,使用 http://localhost:4502/system/console/depfinder 中的 OSGi 依赖项查找器来查找您可能需要的任何依赖项。它可能已经安装在您的实例中而您没有注意到。

如果您想要将 jar 嵌入包中,这样它就不会暴露,您可以使用 maven-bundle-plugin 来实现(我假设您正在使用它,因为它是 AEM 的标准开发),使用 Embed-Dependency 命令:

<Embed-Dependency>artifactId</Embed-Dependency>

有关如何使用此命令的更多选项,请参阅 the documentation

我解决了。 @Marcel Offermans 和@santiagozky 都以你自己的方式是正确的。但是有一些我通过我的经验发现的东西,我想分享一下。

1)MAVEN Bundle Plugin- 此 Maven 配置文件可帮助您下载所有依赖项(包括传递性依赖项直到最后一级),自动将它们转换为 OSGi 格式并将其放入目标文件夹中。 所以可以直接在 OSGi 控制台上传它们。关注这个Link

注意: 只需使用 bundleall 而不是 wrap 请参阅我的 pom 条目

<!-- My Profile to Resolve Tansitive Dependencies -->
        <profile>
                  <id>create-osgi-bundles-from-dependencies</id>      
                  <build>
                        <plugins>
                             <plugin>
                                   <groupId>org.apache.felix</groupId>
                                   <artifactId>maven-bundle-plugin</artifactId>
                                   <version>2.0.1</version>
                                   <extensions>true</extensions>
                                   <executions>
                                         <execution>
                                               <id>wrap-my-dependency</id>
                                               <goals>
                                                     <goal>bundleall</goal>
                                               </goals>
                                               <configuration>
                                                     <wrapImportPackage>;</wrapImportPackage>
                                               </configuration>
                                         </execution>
                                   </executions>
                             </plugin>
                        </plugins>
                  </build>   
            </profile>
        <!-- transitive dependenceis ENds -->

使用命令:mvn -Pcreate-osgi-bundles-from-dependencies bundle:bundleall

2) @santiagozky 提到的方法将捆绑包放入安装文件夹 但它不是 OSGi 格式 ,因此捆绑包不会启动。关于这个@santiagozky 的任何输入?