使用BND構(gòu)建OSGi Bundle時(shí)如何只導(dǎo)出第三方依賴的包到MANIFEST.MF中而不解壓到j(luò)ar中?

本文是純第三方依賴的Eclipse插件的構(gòu)建和自動(dòng)更新的后續(xù)钥顽。

背景

之前構(gòu)建純第三方依賴的Eclipse插件的時(shí)候蔚袍,通過(guò)Export-Package導(dǎo)出了不少包(例如apache commons、xstream、slf4j等)給其他插件使用窃诉,因?yàn)閷?dǎo)出包太多,導(dǎo)致Eclipse插件在查找類的時(shí)候出現(xiàn)了性能問(wèn)題赤套,所以現(xiàn)在想僅開放必要的內(nèi)部包飘痛,公共組件的包由外部插件提供,一些必要的調(diào)用通過(guò)該插件內(nèi)部的代碼類來(lái)提供容握。所以做了兩個(gè)修改:

  1. Export-Package中移除了公共組件的包宣脉,僅保留項(xiàng)目相關(guān)jar的包的導(dǎo)出。
  2. 代碼工程中增加了src/main/java源碼文件夾剔氏,通過(guò)自定義工具類實(shí)現(xiàn)對(duì)插件內(nèi)部類的配置塑猖。

經(jīng)過(guò)修改后重新打包竹祷,發(fā)現(xiàn)打包后的bundle jar中除了自定義的類、第三方j(luò)ar之外羊苟,Export-Package中定義的導(dǎo)出包及其中的類也被解壓到了bundle jar中塑陵,解壓后的包和class以及jar都存在于bundle jar中,這樣肯定是有問(wèn)題的践险。

問(wèn)題原因

通過(guò)查閱BND的資料猿妈,發(fā)現(xiàn)之前對(duì)Export-Package的理解有誤,之前一直以為該配置對(duì)應(yīng)的是Bundle MANIFEST.MF中的Export-Package巍虫,添加到該配置中的插件包及插件內(nèi)部jar中的包可以供外部插件訪問(wèn)彭则。其實(shí)BND中的Export-Package并不僅僅是這個(gè)功能,先貼一段BND中的解釋說(shuō)明:

<Export-Package>
The <Export-Package> instruction is a list of packages for the bundle to export. These packages are copied into the resulting bundle JAR file from the available classes (i.e., project classes, dependencies, and class path); thus, it is possible to include classes into your bundle that are not associated with source files in your project. <Export-Package> can be specified with package patterns using the '*' wildcard. Also, it is possible to exclude packages using negation by starting the package pattern with '!'. Thus, non-negated patterns indicate which of the available packages to include in the bundle, whereas negated patterns indicate which should not be included in the bundle.

The list of package patterns is ordered and earlier patterns are applied before later patterns. For example, if you specify "org.foo.,!org.foo.impl" the second pattern has no effect since all org.foo packages have already been selected by the first pattern. Instead, you should specify "!org.foo.impl,org.foo.", which will export all org.foo packages except org.foo.impl.

Following standard OSGi R4 syntax, package patterns can include both directives and attributes, which will be copied appropriately into the generated Export-Package manifest header. Besides explicitly listing package version attributes, BND will also determine package versions by examining the source JAR file or from packageinfo files in the package directory.

注意上述說(shuō)明中的黑體部分占遥。重點(diǎn)在第一段俯抖,第一段已經(jīng)說(shuō)明了添加到Export-Package中的包中的class會(huì)被復(fù)制到生成的bundle jar中,同時(shí)加入到MANIFEST.MF的Export-Package頭中瓦胎。
但是我們之前構(gòu)建的bundle jar芬萍,并沒(méi)有將Export-Package包中的class復(fù)制到bundle jar中,是本次增加了src/main/java后才出現(xiàn)解壓class的現(xiàn)象搔啊,原因未知柬祠。

解決辦法

BND官網(wǎng)的常見問(wèn)題文檔中,第一條即是該問(wèn)題“當(dāng)我嵌入bundle中一個(gè)依賴時(shí)為什么我在bundle jar中看見了重復(fù)的類负芋?”漫蛔,看來(lái)這個(gè)問(wèn)題比較普遍_。先來(lái)看BND給的解釋說(shuō)明:

Having two copies of classes, both unpacked and embedded as jars, is a sign that your Embed-Dependency and Export-Package instructions are overlapping. Export-Package tells BND to pull in classes found in the named packages from the build classpath and add them to the bundle, Embed-Dependency tells BND to embed (or inline if enabled) whole artifacts in the bundle.

BND的意思是如果你在最終的bundle jar中看見了重復(fù)的class和它所在的jar旧蛾,說(shuō)明你在Embed-DependencyExport-Package中的定義重疊了莽龟。換句話說(shuō)就是,你同時(shí)配置了Embed-DependencyExport-Package锨天,Export-Package將包中的class解壓到bundle jar毯盈,Embed-Dependency將jar復(fù)制到bundle jar中。
如果你僅僅是想在最終的bundle jar的MANIFEST.MF的Export-Package頭中導(dǎo)出包病袄,并不想同時(shí)將包中的class解壓到bundle中搂赋,你需要使用<_exportcontents>替代Export-Package,具體做法:

  1. 移除<Export-Package>
  2. 在Embed-Dependency之后添加<_exportcontents>益缠,例如:
<Embed-Dependency>*</Embed-Dependency>
<_exportcontents>org.apache.commons.*</_exportcontents>

參考資料

Apache Felix Bundle Plugin Frequently Asked Questions
使用BND構(gòu)建包含純第三方依賴的Eclipse插件

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末厂镇,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子左刽,更是在濱河造成了極大的恐慌,老刑警劉巖酌媒,帶你破解...
    沈念sama閱讀 216,402評(píng)論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件欠痴,死亡現(xiàn)場(chǎng)離奇詭異迄靠,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)喇辽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門掌挚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人菩咨,你說(shuō)我怎么就攤上這事吠式。” “怎么了抽米?”我有些...
    開封第一講書人閱讀 162,483評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵特占,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我云茸,道長(zhǎng)是目,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,165評(píng)論 1 292
  • 正文 為了忘掉前任标捺,我火速辦了婚禮懊纳,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘亡容。我一直安慰自己嗤疯,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評(píng)論 6 388
  • 文/花漫 我一把揭開白布闺兢。 她就那樣靜靜地躺著茂缚,像睡著了一般。 火紅的嫁衣襯著肌膚如雪列敲。 梳的紋絲不亂的頭發(fā)上阱佛,一...
    開封第一講書人閱讀 51,146評(píng)論 1 297
  • 那天,我揣著相機(jī)與錄音戴而,去河邊找鬼凑术。 笑死,一個(gè)胖子當(dāng)著我的面吹牛所意,可吹牛的內(nèi)容都是我干的淮逊。 我是一名探鬼主播,決...
    沈念sama閱讀 40,032評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼扶踊,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼泄鹏!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起秧耗,我...
    開封第一講書人閱讀 38,896評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤备籽,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體车猬,經(jīng)...
    沈念sama閱讀 45,311評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡霉猛,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了珠闰。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片惜浅。...
    茶點(diǎn)故事閱讀 39,696評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖伏嗜,靈堂內(nèi)的尸體忽然破棺而出坛悉,到底是詐尸還是另有隱情,我是刑警寧澤承绸,帶...
    沈念sama閱讀 35,413評(píng)論 5 343
  • 正文 年R本政府宣布裸影,位于F島的核電站,受9級(jí)特大地震影響八酒,放射性物質(zhì)發(fā)生泄漏空民。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評(píng)論 3 325
  • 文/蒙蒙 一羞迷、第九天 我趴在偏房一處隱蔽的房頂上張望界轩。 院中可真熱鬧,春花似錦衔瓮、人聲如沸浊猾。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)葫慎。三九已至,卻和暖如春薇宠,著一層夾襖步出監(jiān)牢的瞬間偷办,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工澄港, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留椒涯,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,698評(píng)論 2 368
  • 正文 我出身青樓回梧,卻偏偏與公主長(zhǎng)得像废岂,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子狱意,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容