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

时间:2015-04-28 07:10:53

标签: java maven osgi cq5 aem

我知道当安装了CQ中的捆绑包的状态时,存在依赖关系,这就是捆绑包不能被激活的原因"。

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

我手动在Felix Console中添加了Jersey客户端Jar,这样我的包被激活但是 Jersey Client Jar不活动所以我不断得到 ClassNotFoundError 在Jersey Client Jar中也是传递依赖。

我尝试了以下内容:

  1. 通过在Felix Console中添加Jars手动尝试解析依赖项。 我失败。循环永远不会结束(Transitive Dependencies)
  2. 通过更改Jersey Core Client Jar的清单尝试了一些调整,我添加了DynamicImport-Package: *。这会欺骗OSGi conatainer,在运行时它会找到Jars。这在过去对我有用,但现在它需要一些不存在的课程。(泽西客户端和我的捆绑包的两个罐子变得活跃但是我得到了 class NOT NOT,因为类实际上不存在无论如何 我试图欺骗OSgi Conatainer 失败
  3. 我尝试了另一件事,我在 /bundle/pom.xml 中添加了所有依赖的Jars。当我使用Maven时,我认为这可以解决问题,但我的包仍然是已安装有效
  4. 我的第三步是悲惨的失败。当你在Felix控制台中手动安装所有Jars时,Maven对你有什么好处?!!

    我该怎么办?

3 个答案:

答案 0 :(得分:1)

首先,Maven只能帮助你构建时依赖关系,Maven依赖关系是jar级别的。将bundle安装到OSGi容器中时,必须处理包级别的运行时依赖性。

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

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

  1. 您可以在捆绑包中嵌入所需的所有依赖项。有效地,您需要嵌入Jersey客户端(并且可以传递所需的所有依赖关系)。您不会将其中的任何内容暴露给其他捆绑包,所有代码都会在您的捆绑包中结束。
  2. 您可以将所需的所有依赖项安装为捆绑包。这意味着您需要传递性地找到运行Jersey客户端所需的所有包。有一些工具可以帮助您。 Maven不是其中之一。
  3. 希望这会有所帮助。这可能不是你希望听到的。

答案 1 :(得分:1)

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

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

您可能已经注意到,通常在CQ5应用程序中,您有2个maven模块(提示:使用他们的maven archetypes创建项目)一个用于内容,一个用于java代码(可能多于一个,或者没有)。 构建内容包时会发生的情况是,任何共享相同groupID的bundle都会自动嵌入到包中,但是您使用的是尚未安装的任何bundle,您应该对其进行配置以便嵌入它。

此示例配置取自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

答案 2 :(得分:0)

我解决了。 @Marcel Offermans和@santiagozky都以你自己的方式正确。但是根据我的经验,我发现了一些事情,我想分享一下。

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

注意:只需使用 bundleall 而非换行查看我的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上的任何输入?