2014-02-05 89 views
2

我有一個OSGI軟件包依賴於通過功能公開的軟件包。我依賴的 軟件包需要特定版本的軟件包,比如com.company.antlr.runtime (3.0.1)。該功能將打包兩個版本,即com.company.antlr.runtime (3.0.1)com.company.antlr.runtime (3.2.0)基於Eclipse功能的啓動無法解決依賴關係

的問題是,當我提出在Eclipse中基於特徵的啓動配置與我的包(以一個功能)以及包含我靠包裝上的功能,我得到一個丟失的約束 驗證錯誤,指出需要捆綁com.company.antlr.runtime(3.0.1)缺少 。

添加com.company.antlr.runtime (3.0.1)作爲捆綁功能啓動沒有效果,我仍然得到相同的驗證錯誤。

另一方面,如果我進行基於捆綁的啓動配置,其中包含與特徵中包裝的完全相同的 捆綁包,則不存在驗證問題。

的問題可以用這個最小的例子來說明:

org.example.examplebundle具有清單:

Manifest-Version: 1.0 
Bundle-ManifestVersion: 2 
Bundle-Name:Examplebundle 
Bundle-SymbolicName: org.example.examplebundle 
Bundle-Version:1.0.0.qualifier 
Bundle-RequiredExecutionEnvironment: JavaSE-1.7 
Require-Bundle: com.company.antlr.runtime;bundle-version="[3.0.1,3.0.1]" 

和特徵org.example.examplefeature具有feature.xml的:

<feature 
     id="org.example.examplefeature" 
     label="Examplefeature" 
     version="1.0.0.qualifier"> 

    <plugin 
     id="org.eclipse.osgi" 
     download-size="0" 
     install-size="0" 
     version="0.0.0" 
     unpack="false"/> 

    <plugin 
     id="org.example.examplebundle" 
     download-size="0" 
     install-size="0" 
     version="0.0.0" 
     unpack="false"/> 

    <plugin 
     id="com.company.antlr.runtime" 
     download-size="0" 
     install-size="0" 
     version="3.0.1" 
     unpack="false"/> 

    <plugin 
     id="com.company.antlr.runtime" 
     download-size="0" 
     install-size="0" 
     version="3.2.0" 
     unpack="false"/> 

</feature> 

製作僅使用此功能的基於功能的啓動將導致驗證錯誤。 使用該功能中包含的四個軟件包進行基於軟件包的啓動不會導致驗證錯誤。

然後,我嘗試添加必要的捆綁軟件以使用控制檯,並從org.example.examplefeature功能中刪除軟件包org.example.examplebundle,然後使用基於功能的啓動運行它。然後我發現捆綁com.company.antlr.runtime (3.0.1)根本沒有啓動。

如果我將相同的必要捆綁添加到基於捆綁的發佈中,我可以觀察到com.company.antlr.runtime (3.0.1)com.company.antlr.runtime (3.2.0)都處於活動狀態。

我在此基礎上的猜測是,基於功能的啓動的解析程序得出結論認爲,版本號最高的軟件包是足夠的,因此根本不啓動舊版本。

考慮到這一假設,我想在我需要一個完美的匹配 爲com.company.antlr.runtime (3.0.1)通過包括在feature.xml下面的代碼片段的feature.xml的明確規定:

<requires> 
    <import 
     plugin="com.company.antlr.runtime" 
     version="3.0.1" 
     match="perfect" 
     /> 
    </requires> 

但是,唉,無濟於事。

所以,我現在的問題是:有沒有辦法解決這個問題,同時保持基於功能的啓動?

爲了完整性:我運行Eclipse 4.3開普勒和OSGi 3.8.1

+0

Rikke,你最終找到解決方案嗎? –

+0

不,不是真的。最後,我們必須更新所有內容以使用最新版本的antlr,以便我們不再需要該版本的兩個版本。幸運的是,這在合理的時間內是可行的。這可能並非總是如此! –

+0

我在Eclipse中發現了一個錯誤[產品驗證找不到需要兩個版本的插件](https://bugs.eclipse.org/bugs/show_bug.cgi?id=367187)併爲它提供補丁。它似乎將在下一個版本中得到修復。 –

回答

0

似乎使用的是基於捆綁啓動時自動啓動設置爲true兩捆。 使用基於功能的啓動程序時,除非已將「默認自動啓動」設置爲true或創建產品定義併爲這些軟件包設置啓動級別,否則不能這樣做。

+0

對於功能和基於捆綁的啓動,我都將「默認自動啓動」設置爲true。你的意思是我應該能夠在這種情況下明確地爲特徵中的捆綁包設置自動啓動嗎? –

+0

好吧,我有一次這個「默認自動啓動」的問題。所以我開始創建產品文件來測試我的基於rcp的功能。您可以在使用該功能時設置包含在功能中的單個捆綁包的起始級別。 .product文件可用於啓動equinox(它也將在工作區中創建基於捆綁的啓動文件)。 – Cristiano

相關問題