簡體   English   中英

OSGi捆綁包狀態未激活(CQ5 Maven項目)為什么?

[英]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中也有傳遞性依賴項。

我嘗試了以下方法:

  1. 通過在Felix Console中添加Jar,手動嘗試解決依賴關系。 失敗了 循環永無止境(傳遞依賴項)
  2. 嘗試通過更改 Jersey Core Client Jar 的清單進行一些調整,並添加了DynamicImport-Package: * 這欺騙了OSGi容器,即在運行時將找到Jars。 過去這對我有用,但是現在它需要一些不存在的類。( Jars the Jersey Client和My Bundle都處於活動狀態,但我發現類找到錯誤,因為無論我多少,這些類實際上都不存在嘗試愚弄OSgi容器( 失敗)
  3. 因此,嘗試了另一件事,我在/bundle/pom.xml中添加了所有依賴的Jar。 由於我使用Maven我認為這將解決這個問題,但我的包還在安裝活躍

我的第三步是一個慘痛的失敗。 無論如何,無論如何在Felix控制台中手動安裝所有Jars時,Maven對您有什么好處?

我該怎么辦 ?

首先,Maven僅在構建時依賴項方面為您提供幫助,並且Maven依賴項位於jar級別。 將捆綁軟件安裝到OSGi容器中時,必須處理程序包級別的運行時依賴項。

因此,由於依賴項的工作方式不同,因此在構建時與運行時之間存在不匹配。 您可能會說Maven根本不是一個很好的選擇,這就是為什么至少有些做很多OSGi應用程序的人已經切換到Bnd / Bndtools和命令行Gradle構建的原因。

回到你的問題。 您在運行時遇到缺少的依賴項。 您的捆綁軟件正在導入未由任何捆綁軟件導出的軟件包。 要解決此問題,可以使用以下兩種策略之一:

  1. 您可以將所需的所有依賴項嵌入到包中。 實際上,這里您需要嵌入Jersey客戶端(以及傳遞其所需的所有依賴項)。 您不會將其中任何一個暴露給其他包,所有代碼都將最終出現在您的包中。
  2. 您可以將所需的所有依賴項安裝為捆綁包。 這意味着您需要暫時找到運行Jersey客戶端所需的所有軟件包。 有一些工具可以幫助您。 Maven不是其中之一。

希望這可以幫助。 這可能不是您希望聽到的。

@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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM