[英]OSGi Bundle status is not Active (CQ5 Maven Project) WHY?
我知道,當安裝了CQ中捆綁軟件的狀態時,就存在依賴關系,這就是為什么捆綁軟件不能處於“活動”狀態的原因。
我在CQ5服務中使用Jersey Client v 2.17,所以我需要Jersey Core Client Jar。 我在/bundle/pom.xml中添加了依賴項 。 我的捆綁包成功編譯並部署, 但從未啟用
我在Felix Console中手動添加了Jersey客戶端Jar,通過這樣做,我的捆綁包被激活,但Jersey客戶端Jar不處於活動狀態,所以我一直收到ClassNotFoundError,因為Jersey客戶端Jar中也有傳遞性依賴項。
我嘗試了以下方法:
DynamicImport-Package: *
。 這欺騙了OSGi容器,即在運行時將找到Jars。 過去這對我有用,但是現在它需要一些不存在的類。( Jars the Jersey Client和My Bundle都處於活動狀態,但我發現類未找到錯誤,因為無論我有多少,這些類實際上都不存在嘗試愚弄OSgi容器( 失敗) 。 我的第三步是一個慘痛的失敗。 無論如何,無論如何在Felix控制台中手動安裝所有Jars時,Maven對您有什么好處?
我該怎么辦 ?
首先,Maven僅在構建時依賴項方面為您提供幫助,並且Maven依賴項位於jar級別。 將捆綁軟件安裝到OSGi容器中時,必須處理程序包級別的運行時依賴項。
因此,由於依賴項的工作方式不同,因此在構建時與運行時之間存在不匹配。 您可能會說Maven根本不是一個很好的選擇,這就是為什么至少有些做很多OSGi應用程序的人已經切換到Bnd / Bndtools和命令行Gradle構建的原因。
回到你的問題。 您在運行時遇到缺少的依賴項。 您的捆綁軟件正在導入未由任何捆綁軟件導出的軟件包。 要解決此問題,可以使用以下兩種策略之一:
希望這可以幫助。 這可能不是您希望聽到的。
@Marcel Offermans的答案是正確的,您應該安裝捆綁軟件需要運行的所有依賴項,如果它們太多,則說明管理不正確。 關於如何輕松部署它們,CQ5有一個不錯的方法。
在CQ5中,您通常通過軟件包安裝應用程序,這些軟件包不過是一個zip文件,其中包含要復制到JCR存儲庫中的內容內容以及您的應用程序可能需要的任何Java捆綁包。
您可能已經注意到,通常在CQ5應用程序中,您有2個maven模塊(提示:使用其maven原型創建您的項目),其中1個用於內容,而一個用於Java代碼(可以不止一個,也可以不多個)。 構建內容包時,將發生任何共享相同groupID的捆綁包自動嵌入到該包中的情況,但是如果您使用的是尚未安裝的任何捆綁包,則應對其進行配置,使其也被嵌入。
此示例配置來自軟件包文檔 。 它應該使您了解如何添加需要與應用程序一起部署到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>
請參閱文檔以獲取有關如何使用此命令的更多選項
我解決了 @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提及的方法將捆綁軟件放入安裝文件夾, 但它不在OSGi FORMAT中 ,因此捆綁軟件無法啟動。 @santiagozky有任何輸入嗎?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.