2017-10-05 116 views
2

我正在使用serviceMix來部署我的包。而我使用maven創建我的包如下:如何在eclipse上鍊接OSGI包?

 <plugin> 
      <groupId>org.apache.felix</groupId> 
      <artifactId>maven-bundle-plugin</artifactId> 
      <version>2.3.6</version> 
      <extensions>true</extensions> 
      <configuration> 
       <instructions> 
        <Bundle-SymbolicName>${project.groupId}.${project.artifactId}</Bundle-SymbolicName> 
        <Bundle-Description>${project.description}</Bundle-Description> 
        <Bundle-Activator>mycom.project.PubSub.activator.Activator</Bundle-Activator> 
        <Import-Package>*,org.apache.camel.osgi,org.java_websocket.*, mycom.project.ManageSQL.Interface.SQLInterface 
        </Import-Package> 
        <Export-Package>mycom.project.PubSub.Manager.Manager</Export-Package> 
        <Private-Package>org.java_websocket.*, mycom.project.PubSub.*, io.socket.*, okhttp3.*, okhttp3.internal.connection, okio.*, org.json.*</Private-Package> 
        <BundleType>project</BundleType> 
       </instructions> 
      </configuration> 
     </plugin> 

我導入一個類從我的人的一個捆綁如下:

<Import-Package>*,org.apache.camel.osgi,org.java_websocket.*, mycom.project.ManageSQL.Interface.SQLInterface</Import-Package> 

但是,當我嘗試訪問它我目前的捆綁中,它給了我錯誤,沒有這樣的課程。
我使用eclipse和maven創建捆綁包並將它們部署到serviceMix上。
這是我嘗試使用該捆綁包的pom項目的圖像。

enter image description here

及以下就是我創建並想使用它的導入包捆的形象。

enter image description here

回答

0

您爲Maven的捆綁插件提供的配置是相當不尋常的,而且可能不符合你真正想要的東西。

<Bundle-SymbolicName>${project.groupId}.${project.artifactId}</Bundle-SymbolicName> 
<Bundle-Description>${project.description}</Bundle-Description> 

這兩個項目都很好,但我相信${project.groupId}.${project.artifactId}是一個包的符號名默認使用Maven的捆綁插件的時候,所以它可以省略

<Bundle-Activator>mycom.project.PubSub.activator.Activator</Bundle-Activator> 

使用BundleActivator是通常不推薦,因爲它是非常低級的入口點。有很多尖銳的邊緣,容易讓事情發生嚴重錯誤。通常情況下,你會被推薦使用一個組件框架,比如Declarative Services,它爲你做了大部分的努力工作。這是宣佈激活課程的正確方法,但其他讀者請注意。

<Import-Package>*, org.apache.camel.osgi, org.java_websocket.*, mycom.project.ManageSQL.Interface.SQLInterface</Import-Package> 

這是寫得不好的Import-Package指令。一般而言,您不應該在處指定此標頭,插件會爲您計算正確的列表。如果你確實指定了這個頭文件,那麼它是高級用法,你必須小心。

首先這個標題是錯誤的,因爲令牌被當作一個過濾器列表,並依次進行解釋。從*開始,標題的其餘部分是不相關的。

其次,這個頭文件必須是包列表(或glob匹配/否定),並且不能包含類名稱。如果mycom.project.ManageSQL.Interface.SQLInterface不是類名,那麼它嚴重違反了Java命名約定。

我建議您完全刪除Import-Package配置條目。

<Export-Package>mycom.project.PubSub.Manager.Manager</Export-Package> 

如同Import-Package指令,Export-Package必須採取包名稱,而不是一個類名。

<Private-Package>org.java_websocket.*, mycom.project.PubSub.*, io.socket.*, okhttp3.*, okhttp3.internal.connection, okio.*, org.json.*</Private-Package> 

Private-Package指令(結合Export-Package指令)負責決定哪些類將結束打包成捆的。將另一個包的依賴關係重新包裝到您自己的包中是很不尋常的(雖然並非前所未有)。這有點像本機可執行文件中的靜態鏈接,但是您需要非常小心,以避免重新打包通過API公開的內容,以避免在運行時出現嚴重問題。

Private-PackageExport-Package只能包含位於編譯類路徑上的程序包。猜測這就是爲什麼你的包不包含你期望的東西,但我會質疑爲什麼你要重新包裝這些包。

<BundleType>project</BundleType> 

這是全局名稱空間中的自定義標題。我會建議使用對您的公司更爲獨特的東西,或者如果它沒有實際用途,請刪除標題。