osgi捆绑包状态不活动(cq5 maven项目)为什么?

gtlvzcf8  于 2021-07-13  发布在  Java
关注(0)|答案(3)|浏览(323)

我知道当cq中的bundle的状态被安装时,存在依赖关系,这就是bundle不能“活动”的原因。
我在cq5服务中使用jersey客户机v2.17,所以我需要jersey核心客户机jar。我在/bundle/pom.xml中添加了依赖项。我的bundle成功地编译和部署了,但从未变为活动状态
我在felix控制台中手动添加了jersey客户机jar,通过这样做,我的包被激活了,但是jersey客户机jar没有激活,所以我不断得到classnotfounderror,因为jersey客户机jar中也有可传递的依赖项。
我尝试了以下方法:
手动尝试通过在felix控制台中添加jar来解析依赖关系。我失败了。循环永不结束(可传递依赖项)
我补充说,我尝试了一些调整,通过更改jersey核心客户机jar的清单 DynamicImport-Package: * . 这会欺骗osgi conatainer,让它在运行时找到jar。这在过去对我很有效,但现在它需要一些不存在的类(jersey客户端和我的bundle中的jar都处于活动状态,但是我得到了class not found error,因为不管我如何试图欺骗osgi conatainer,这些类实际上都不存在)失败了。
所以我尝试了另一件事,在/bundle/pom.xml中添加了所有依赖jar。由于我使用maven,我认为这可以解决这个问题,但我的bundle仍然安装不活跃
我的第三步是惨败。当你在felix控制台手动安装所有jar时,maven对你有什么好处?!!
我该怎么办?

huwehgph

huwehgph1#

首先,maven只帮助您处理构建时依赖关系,而maven依赖关系是jar级别的。在将bundle安装到osgi容器中时,必须处理运行时依赖关系,这些依赖关系在包级别。
因此,构建时和运行时之间存在不匹配,因为依赖项的工作方式不同。你可能会说maven根本不是一个很好的匹配,这就是为什么至少一些做了大量osgi应用程序的人已经转向bnd/bndtools和命令行gradle构建。
回到你的问题上来。您在运行时遇到缺少的依赖项。您的包正在导入任何包都没有导出的包。要解决这个问题,可以使用以下两种策略之一:
您可以将所需的所有依赖项嵌入到包中。在这里,您需要有效地嵌入jersey客户机(以及它所需的所有依赖项)。您不会将这些代码中的任何一个暴露给其他包,所有代码最终都会出现在您的包中。
您可以将所需的所有依赖项作为捆绑包安装。这意味着您需要以传递方式找到运行jersey客户端所需的所有包。有一些工具可以帮助你。Maven不是其中之一。
希望这有帮助。这可能不是你希望听到的。

cdmah0mi

cdmah0mi2#

@marcel offermans的回答是正确的,您应该安装包需要运行的所有依赖项,如果它们太多,则说明您没有正确地管理它们。至于如何轻松部署它们,cq5有一个很好的方法。
在cq5中,您通常通过软件包安装应用程序,这些软件包不过是一个zip文件,其中既包含要复制到jcr存储库的内容,也包含应用程序可能需要的任何java包。
您可能已经注意到,通常在cq5应用程序中有两个maven模块(提示:使用它们的maven原型来创建项目),一个用于内容,另一个用于java代码(可能不止一个,也可能没有)。当您构建内容包时,任何共享相同groupid的包都会自动嵌入到包中,但是如果您使用的是任何尚未安装的包,则应该对其进行配置,使其也嵌入到包中。
此配置示例取自软件包文档。它应该让您了解如何将任何需要部署到osgi容器的依赖项与应用程序一起添加到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>

最后一个技巧是,在中使用osgi依赖项查找器 http://localhost:4502/system/console/depfinder 查找您可能需要的任何依赖项。它可能已经安装在您的示例中,而您没有注意到。
如果您想要将jar嵌入到bundle中,这样它就不会暴露,那么您可以使用maven bundle插件(我假设您正在使用它,因为它是aem开发的标准),使用 Embed-Dependency 命令:

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

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

sg24os4d

sg24os4d3#

我解决了。无论是@marcel offermans还是@santiagozky,你都是正确的。但有些事情是我通过自己的经历发现的,我想和大家分享。
1) maven bundle插件-这个maven概要文件帮助您下载所有依赖项(包括直到最后一级的可传递依赖项),将它们自动转换为osgi格式并将其放在您的目标文件夹中。所以你可以直接上传到osgi控制台。点击此链接
注意:只使用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提到的方法将bundle放在install文件夹中,但它不是osgi格式,因此bundle不会启动。关于这个@santiagozky有什么消息吗?

相关问题