我知道,安装在CQ捆绑的状态时,有依赖性,这就是为什么束不能被“激活”。
我使用的是新泽西州的客户v 2.17在CQ5服务,所以我需要泽西核心客户端JAR。 我加在/bundle/pom.xml的依赖。 我的包成功编译和部署,但从未轮番活跃
我在菲利克斯控制台手动添加泽西客户端jar,这样做我的包得到了激活,但泽西客户端JAR是不活跃 ,所以我不断收到ClassNotFoundError因为有在泽西客户端JAR传递依赖为好。
我试过如下:
- 手动试图通过在菲利克斯控制台添加罐解析相关性。 我失败了 。 该循环永远不会结束(传递依赖)
- 我通过改变球衣核心客户端JAR 的清单尝试了一些调整 ,我加
DynamicImport-Package: *
。 这个技巧在OSGi conatainer,在运行时它会找到的罐子。 这为我工作在过去,但现在它需要一些类不存在( 这两个罐Jersey客户端和我的捆绑变得活跃,但我得到的类未找到错误的班其实并不存在 ,不管我有多当傻子了OSGi Conatainer) 失败 。 - 所以尝试另一件事,我添加了所有相关的JAR在/bundle/pom.xml。 由于我使用Maven我认为这将解决这个问题,但我的包还在安装不活跃
我的第三个步骤是一个悲惨的失败。 什么是好Maven来您,当您安装反正所有的罐子手动菲利克斯控制台?!
我该怎么办 ?
首先,Maven的不仅可以帮助您构建时依赖关系,并Maven依赖是在罐子水平。 当安装捆绑成一个OSGi容器,你必须处理运行时的依赖,这是在包级别。
所以编译时和运行时之间的不匹配,作为依赖的工作方式不同。 你可能会说Maven是不是很好匹配可言,这就是为什么至少有一些人是做了很多的OSGi应用程序已切换到BND / Bndtools和命令行摇篮建设。
回到你的问题。 您正在运行到运行时缺少的依存关系。 你的包是进口不受任何管束导出包。 为了解决这个问题,你可以使用以下两种策略之一:
- 您可以嵌入你需要你的包内所有的依赖。 有效这里你需要嵌入Jersey客户端(和传递性,它需要所有的依赖)。 你不会暴露任何那些其它捆绑,所有的代码将在你的包中结束。
- 你可以安装你需要的包依赖关系。 这意味着你需要传递地找到你需要运行Jersey客户端的所有包。 有一些可以帮助您与工具。 Maven是不是其中之一。
希望这可以帮助。 它可能不是你希望听到的。
@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>
请参阅文档有关如何使用此命令的更多选项
我解决了它。 无论@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任何投入?