簡體   English   中英

OSGI Import-Package:版本vs bundle-version - 有什么區別?

[英]OSGI Import-Package: version vs bundle-version - what's the difference?

我無法將OSGi包加載到第三方框架中。 它一直拒絕我的捆綁包,因為我指定了不存在的Import-Package版本,即使我知道他們正在使用我想要/需要的版本加載捆綁包。 為了解決這個問題,我暫時禁用了我的版本要求,但它有點難看。

Import-Package: com.ghc.ghTester.expressions,org.apache.ws.security;vers
 ion=0,org.apache.ws.security.components.crypto;version=0,org.apache.ws.
 security.message;version=0,org.apache.ws.security.message.token;version
 =0,org.apache.ws.security.processor;version=0

當我查看Manifest的依賴時,我看到:

Bundle-Version: 1.5.11
Bundle-ClassPath: wss4j-1.5.11.jar
Bundle-Vendor: Apache
Export-Package: org.apache.ws.axis.security,
 org.apache.ws.axis.security.handler,
 org.apache.ws.security,
 org.apache.ws.security.action,
 org.apache.ws.security.components.crypto,
 org.apache.ws.security.conversation,
 org.apache.ws.security.conversation.dkalgo,
 org.apache.ws.security.handler,
 org.apache.ws.security.message,
 org.apache.ws.security.message.token,
 org.apache.ws.security.processor,
 org.apache.ws.security.saml,
 org.apache.ws.security.transform,
 org.apache.ws.security.util

在向Framework團隊抱怨之后,他們告訴我我需要在我的Import-Package語句中使用bundle-version而不是version ,例如:

Import-Pacakge: org.apache.ws.security;bundle-version=[1.5.0,2)

我已經閱讀了OSGi規范(第50頁) ,但似乎無法理解這兩個值之間的細微差別:

開發人員可以指定任意匹配屬性。 請參見屬性匹配(第58頁)。預定義了以下任意匹配屬性:

•version - 用於選擇導出程序包版本的版本范圍。 語法必須遵循版本范圍(第36頁)。有關版本選擇的詳細信息,請參閱第54頁的語義版本控制。如果未指定此屬性,則假定為[0.0.0,∞)。

•specification-version - 此屬性是version屬性的別名,僅用於簡化從早期版本的遷移。 如果存在version屬性,則值必須相等。

•bundle-symbolic-name - 導出包的包符號名稱。 對於片段包,這將是主機包的符號名稱。

•bundle-version - 用於選擇導出捆綁包的捆綁版本的版本范圍。 默認值為[0.0.0,∞)。 請參見第54頁的語義版本控制。對於片段包,版本來自主機包。

有人可以澄清versionbundle-version之間的區別嗎? 從我閱讀文檔的方式來看,bundle-version(即:manifest的Bundle-Version )將擴展到bundle中的所有包。 那么包版本(即:version)是否與Import-Package語句中的bundle-version(即:bundle-version)相同? 為什么有能力以不同的方式指定兩者?

它非常簡單: bundle-version將您綁定到導出包的bundle的版本,而version綁定到包本身的版本。

你幾乎從來沒有想用bundle-version進口。 導出包的版本幾乎無關緊要......事實上,當您導入包時,您甚至不應該關心導出它的包的標識。 這是你關心的包,而不是它來自的包。

誰告訴你使用bundle-version 可能有一些非常特殊的原因,但我對此表示懷疑。 更有可能是告訴你這個的人錯了。

您詢問:

那么包版本(即:version)是否與Import-Package語句中的bundle-version(即:bundle-version)相同?

不,不是! 捆綁版本與包版本無關。 更改包時,您可以更改該包的版本。 捆綁只是一種交付機制。

UPDATE

重讀您的問題,我注意到未指定依賴項導出的包的版本。 這意味着框架將所有內容導出為版本0.0.0,因為這是未指定版本時的“默認”版本。 一個軟件包的版本着重並不默認它所在的軟件包的版本。不幸的是,這個框架的作者似乎對OSGi沒有很好的理解。

更新2

由於您使用的框架不提供版本,因此我建議創建一個無代碼包裝程序包,它可以使用附加的適當版本重新導出包。 這個構建起來非常簡單,它將把所有的丑陋都保存在一個地方。 然后,您的任何其他捆綁包都可以使用普通版本導入包。

既然你沒有告訴我有問題的捆綁的BSN,我會稱之為“org.foo”。 首先創建一個名為manifest.txt的文件,如下所示:

Bundle-ManifestVersion: 2
Bundle-SymbolicName: org.foo.wrapper
Bundle-Version: 1.5.11
Require-Bundle: org.foo; bundle-version="[1.5.11,1.5.11]"
Export-Package: org.apache.ws.axis.security;version=1.5,
 org.apache.ws.axis.security.handler;version=1.5,
 ...

(顯然我已經對這里的版本做了一些其他假設,你可以糾正。)

現在構建包:

jar cfm wrapper.jar manifest.txt

現在你有了這個包,你的普通包可以導入這樣的包:

Import-Package: org.apache.ws.security; version="[1.5,2)"

希望您使用的是基於bnd的工具,在這種情況下,將為您生成包含版本范圍的Import-Package標頭。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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