OSGi包状态无效(CQ5 Maven项目)为什么?(OSGi Bundle status is n

2019-10-22 20:51发布

我知道,安装在CQ捆绑的状态时,有依赖性,这就是为什么束不能被“激活”。

我使用的是新泽西州的客户v 2.17在CQ5服务,所以我需要泽西核心客户端JAR。 我加在/bundle/pom.xml的依赖。 我的包成功编译和部署,但从未轮番活跃

我在菲利克斯控制台手动添加泽西客户端jar,这样做我的包得到了激活,但泽西客户端JAR是不活跃 ,所以我不断收到ClassNotFoundError因为有在泽西客户端JAR传递依赖为好。

我试过如下:

  1. 手动试图通过在菲利克斯控制台添加罐解析相关性。 我失败了 。 该循环永远不会结束(传递依赖)
  2. 通过改变球衣核心客户端JAR 的清单尝试了一些调整 ,我加DynamicImport-Package: * 。 这个技巧在OSGi conatainer,在运行时它会找到的罐子。 这为我工作在过去,但现在它需要一些类不存在( 这两个罐Jersey客户端和我的捆绑变得活跃,但我得到的类未找到错误的班其实并不存在 ,不管我有多当傻子了OSGi Conatainer) 失败
  3. 所以尝试另一件事,我添加了所有相关的JAR在/bundle/pom.xml。 由于我使用Maven我认为这将解决这个问题,但我的包还在安装活跃

我的第三个步骤是一个悲惨的失败。 什么是好Maven来您,当您安装反正所有的罐子手动菲利克斯控制台?!

我该怎么办 ?

Answer 1:

首先,Maven的不仅可以帮助您构建时依赖关系,并Maven依赖是在罐子水平。 当安装捆绑成一个OSGi容器,你必须处理运行时的依赖,这是在包级别。

所以编译时和运行时之间的不匹配,作为依赖的工作方式不同。 你可能会说Maven是不是很好匹配可言,这就是为什么至少有一些人是做了很多的OSGi应用程序已切换到BND / Bndtools和命令行摇篮建设。

回到你的问题。 您正在运行到运行时缺少的依存关系。 你的包是进口不受任何管束导出包。 为了解决这个问题,你可以使用以下两种策略之一:

  1. 您可以嵌入你需要你的包内所有的依赖。 有效这里你需要嵌入Jersey客户端(和传递性,它需要所有的依赖)。 你不会暴露任何那些其它捆绑,所有的代码将在你的包中结束。
  2. 你可以安装你需要的包依赖关系。 这意味着你需要传递地找到你需要运行Jersey客户端的所有包。 有一些可以帮助您与工具。 Maven是不是其中之一。

希望这可以帮助。 它可能不是你希望听到的。



Answer 2:

@Marcel Offermans答案是正确的,你应该安装捆绑软件需要运行,如果他们是太多了,你不管理这些正确依赖关系。 至于如何轻松地部署它们,CQ5有这样做的一个很好的方式。

在CQ5您通常通过安装包的应用程序,这只不过是一个zip文件,其中既包含内容的内容被复制到JCR库和任何Java绑定您的应用程序可能需要。

您可能已经注意到,在正常的应用程序CQ5你有2个Maven的模块,(小提示:用自己的Maven原型创建您的项目中)的内容,一个用于Java代码(可能不止一个,或无)。 当你建立的内容包是该共享同一组ID的任何束被自动嵌入到包,但你使用的是未安装任何包会发生什么,你应该配置它,所以它被嵌入为好。

此示例配置是从所拍摄的包文档 。 它应该给你的如何添加需要部署与应用程序一起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找到你可能需要的任何依赖。 它可能已安装在您的实例没有你注意到。

如果你想要的是嵌入一个包内的罐子,所以它不外露,你可以做到这一点使用Maven束-插件(我假设,因为它是AEM开发的标准,你正在使用它),使用Embed-Dependency命令:

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

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



Answer 3:

我解决了它。 无论@Marcel Offermans和@santiagozky你是在你自己的方式是正确的。 但也有,我发现通过我的经验出头,我想与大家分享。

1)MAVEN捆绑Plugin- 这Maven的配置文件可以帮助你下载所有的依赖关系(包括那些传递至去年的水平),在你的目标文件夹会自动将它们转换为OSGi的格式,并将其放置。 因此,人们可以上传他们的OSGi控制台直接。 按照此链接

注:只要使用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)方法Mentiond由@santiagozky把捆在安装文件夹但它不是OSGi的格式 ,所以捆不启动。 在这个@santiagozky任何投入?



文章来源: OSGi Bundle status is not Active (CQ5 Maven Project) WHY?