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 中也有传递依赖。
我尝试了以下方法:
- 已尝试通过在 Felix 控制台中添加 Jar 来手动解决依赖项。
我失败。循环永无止境(传递依赖)
- 我尝试通过更改 Jersey Core 客户端 Jar 的清单 进行一些调整,我添加了
DynamicImport-Package: *
。这会欺骗 OSGi 容器,在运行时它会找到 Jars。这在过去对我有用,但现在它需要一些不存在的 classes。(Jersey Client 和 My Bundle 都激活了,但我得到了
class 未找到错误,因为 classes 实际上 不存在 无论如何
我多么想愚弄 OSgi Conatainer)Failed.
- 所以尝试了另一件事,我在/bundle/pom.xml中添加了所有依赖的Jars。当我使用 Maven 时,我认为这会解决问题,但我的包仍然 Installed NOT Active
我的第三步惨败。无论如何,当您在 Felix 控制台中手动安装所有 Jars 时,Maven 对您有什么好处?!!
我该怎么办?
首先,Maven只是帮助你构建时依赖,Maven依赖是jar级别的。将捆绑包安装到 OSGi 容器中时,您必须处理 运行 时间依赖性,这些依赖性处于包级别。
因此构建时间和 运行 时间之间存在不匹配,因为依赖项的工作方式不同。您可能会争辩说 Maven 根本不是一个很好的匹配项,这就是为什么至少一些执行大量 OSGi 应用程序的人已经切换到 Bnd/Bndtools 和命令行 Gradle 构建的原因。
回到你的问题。您 运行 正在 运行 时遇到缺少的依赖项。您的包正在导入未被任何包导出的包。要解决此问题,您可以使用以下两种策略之一:
- 您可以将所有需要的依赖项嵌入到您的包中。实际上,您需要在此处嵌入 Jersey Client(以及传递它所需的所有依赖项)。您不会将其中任何一个暴露给其他包,所有代码最终都会在您的包中。
- 您可以将所需的所有依赖项作为捆绑包安装。这意味着您需要传递性地找到 运行 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 的任何输入?
我知道当安装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 中也有传递依赖。
我尝试了以下方法:
- 已尝试通过在 Felix 控制台中添加 Jar 来手动解决依赖项。 我失败。循环永无止境(传递依赖)
- 我尝试通过更改 Jersey Core 客户端 Jar 的清单 进行一些调整,我添加了
DynamicImport-Package: *
。这会欺骗 OSGi 容器,在运行时它会找到 Jars。这在过去对我有用,但现在它需要一些不存在的 classes。(Jersey Client 和 My Bundle 都激活了,但我得到了 class 未找到错误,因为 classes 实际上 不存在 无论如何 我多么想愚弄 OSgi Conatainer)Failed. - 所以尝试了另一件事,我在/bundle/pom.xml中添加了所有依赖的Jars。当我使用 Maven 时,我认为这会解决问题,但我的包仍然 Installed NOT Active
我的第三步惨败。无论如何,当您在 Felix 控制台中手动安装所有 Jars 时,Maven 对您有什么好处?!!
我该怎么办?
首先,Maven只是帮助你构建时依赖,Maven依赖是jar级别的。将捆绑包安装到 OSGi 容器中时,您必须处理 运行 时间依赖性,这些依赖性处于包级别。
因此构建时间和 运行 时间之间存在不匹配,因为依赖项的工作方式不同。您可能会争辩说 Maven 根本不是一个很好的匹配项,这就是为什么至少一些执行大量 OSGi 应用程序的人已经切换到 Bnd/Bndtools 和命令行 Gradle 构建的原因。
回到你的问题。您 运行 正在 运行 时遇到缺少的依赖项。您的包正在导入未被任何包导出的包。要解决此问题,您可以使用以下两种策略之一:
- 您可以将所有需要的依赖项嵌入到您的包中。实际上,您需要在此处嵌入 Jersey Client(以及传递它所需的所有依赖项)。您不会将其中任何一个暴露给其他包,所有代码最终都会在您的包中。
- 您可以将所需的所有依赖项作为捆绑包安装。这意味着您需要传递性地找到 运行 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 的任何输入?