Neil Bartlett 最近發(fā)布了 BndTools 1.0.0,,它是為 Eclipse 所用的 OSGi 開(kāi)發(fā)環(huán)境,。這個(gè)工具通過(guò)其 github 代碼庫(kù)提供了源代碼,你也可以從 Eclipse Marketplace 直接把它安裝到 Eclipse 運(yùn)行時(shí)中,。
BndTools 為我們提供了一種使用 Eclipse 開(kāi)發(fā) OSGi bundles 的方式,。它沒(méi)有通過(guò)直接編輯Manifest.MF
的方式定義依賴關(guān)系,而是使用 Bnd 文件基于 Bnd 工具驅(qū)動(dòng)工具鏈(toolchain),。它還提供了介紹性的教程,。此外,BndTools 還具有自動(dòng)化語(yǔ)義版本控制功能(automated semantic versioning),,它會(huì)將已構(gòu)建的組件和之前發(fā)布的組件相比較,,讓算法來(lái)決定是否對(duì)大、中,、小三種版本號(hào)進(jìn)行升級(jí),,而不是讓用戶人為決定。
InfoQ 抓住了和 Neil Bartlett 會(huì)面的機(jī)會(huì),,詢問(wèn)他為何要?jiǎng)?chuàng)建 BndTools:
Neil Bartlett:我曾經(jīng)做過(guò)很多 OSGi 的培訓(xùn),,發(fā)現(xiàn) OSGi 開(kāi)發(fā)工具總是存在一個(gè)問(wèn)題,那就是過(guò)于笨重,,初學(xué)者很難理解和使用,。由于我具備一些開(kāi)發(fā) Eclipse plug-in 的經(jīng)驗(yàn),所以就開(kāi)始構(gòu)建一些小工具,,讓我和學(xué)生們的工作更輕松,。隨著時(shí)間的推移,這些工具成為比較完整的,、集成的 OSGi 開(kāi)發(fā)環(huán)境,。
現(xiàn)在我會(huì)使用 BndTools 來(lái)完成所有的 OSGi 開(kāi)發(fā),并且,,由于 Eclipse plug-in 本身也基于 OSGi,,所以我甚至使用 BndTools 來(lái)完成它自身的開(kāi)發(fā)。
InfoQ:它與 Bnd 有什么關(guān)系呢,?
Neil Bartlett:對(duì)于構(gòu)建和分析 OSGi bundle 來(lái)說(shuō),,Bnd 是一種極為強(qiáng)大的底層工具。它是由 Peter Kriens (OSGi 聯(lián)盟的技術(shù)總監(jiān))開(kāi)發(fā)的,,OSGi 聯(lián)盟使用它來(lái)構(gòu)建自己的 API 套件、兼容性測(cè)試以及引用實(shí)現(xiàn)的 bundle,。作為一種底層工具,,它很容易繼承,并且可以直接從命令行調(diào)用,,可以被 ANT 任務(wù)所使用,,也可以嵌入到 Maven 和 IDE 中,。
BndTools 使用 bnd 作為它的“引擎”。所有主要功能都是 bnd 本身提供的,,而 BndTools 只是描述什么時(shí)候應(yīng)該調(diào)用 bnd,,并以更好的形式來(lái)展現(xiàn)結(jié)果。由于很多其它工具也集成了 bnd,,所以 bnd 所使用的描述文件幾乎已經(jīng)成為一種事實(shí)上的標(biāo)準(zhǔn),,這意味著 BndTools 開(kāi)發(fā)者很容易與使用其它工具的開(kāi)發(fā)者協(xié)作,也可以在選擇其它工具的時(shí)候很容易地完成遷移,。
InfoQ:BndTools 與 Eclipse 的 PDE 相比怎么樣,?
Neil Bartlett:Eclipse PDE 是另一種基于 Eclipse 的 OSGi 開(kāi)發(fā)環(huán)境。BndTools 沒(méi)有以任何方式重用 PDE,,但是 BndTools 和 PDE 都是基于 Eclipse 的 Java 開(kāi)發(fā)工具集(JDT)構(gòu)建的,。
PDE 所遵循的開(kāi)發(fā)哲學(xué)和 bnd 以及 BndTools 不同,它被稱之為“manifest 優(yōu)先(manifest first)”,。在 PDE 中,, 你需要直接編輯 MANIFEST.MF 文件,它會(huì)直接集成到 bundle 中,,而不需要任何后續(xù)處理,。我們的開(kāi)發(fā)哲學(xué)是,MANIFEST.MF 應(yīng)該當(dāng)作編譯器輸出來(lái)對(duì)待:也就是說(shuō),,應(yīng)該使用更簡(jiǎn)單的源代碼來(lái)生成這個(gè)文件,。這非常重要,因?yàn)橥暾?MANIFEST.MF 文件中會(huì)包含很多重復(fù)的信息,,或者應(yīng)該直接從 Java 代碼中繼承的信息,,比方說(shuō)包一級(jí)的依賴關(guān)系列表。手動(dòng)編輯這樣的信息是個(gè)苦力活,,而且容易出錯(cuò),。
InfoQ:在 JRebel 和基本的 Java 項(xiàng)目之上使用 OSGi 有何優(yōu)勢(shì)?
Neil Bartlett:JRebel 是一種很強(qiáng)大的工具,,它可以讓我們?cè)陂_(kāi)發(fā)過(guò)程中更快地重新部署代碼,,但是不管是在運(yùn)行時(shí)還是在構(gòu)建時(shí),它都沒(méi)有提供任何一種模塊系統(tǒng)(module system),。OSGi 通過(guò)封裝和受約束的,、明確的依賴關(guān)系強(qiáng)制指定了模塊邊界。OSGi 的目的就是要幫你改善應(yīng)用程序的架構(gòu),,創(chuàng)建出可重用的組件,,而 JRebel 是要盡可能快地把你的代碼從 IDE 中提取出來(lái),然后部署到 Java EE 應(yīng)用程序服務(wù)器中。
同時(shí),,OSGi 還具有模塊動(dòng)態(tài)熱交換(dynamic hot-swapping)的特性,,該特性已經(jīng)足夠有效,所以我認(rèn)為開(kāi)發(fā) OSGi 程序的時(shí)候 JRebel 并不是特別有用,。BndTools 對(duì)此也有幫助:當(dāng)你保存了 Java 源文件的時(shí)候,,代碼就會(huì)重新編譯、打包到 bundle 中,,并且推送到正在運(yùn)行的應(yīng)用程序中,。
InfoQ:BndTools 能夠與其他構(gòu)建環(huán)境——像 Maven 和 Ant/Ivy——集成嗎?
Neil Bartlett:BndTools 的“本地”構(gòu)建系統(tǒng)是 bnd 本身,,它支持 Apache Ant 同時(shí)構(gòu)建多個(gè)項(xiàng)目,,這也是 OSGi 聯(lián)盟構(gòu)建他們的 1300 多個(gè) bundle 的方式。Bnd 擁有插件化的庫(kù)系統(tǒng)(pluggable repository system),,這讓我們可以使用任何一種后端的庫(kù)技術(shù),,包括 Ivy。
對(duì)于 Maven 用戶來(lái)說(shuō),,最流行的 OSGi 開(kāi)發(fā)方式就是使用 Maven Bundle Plugin,,它是另一種集成了 bnd 的工具。BndTools 通過(guò)這個(gè)插件以及 M2Eclipse 與 Maven 集成,。在這種情況下,,M2Eclipse 會(huì)負(fù)責(zé)管理構(gòu)建依賴關(guān)系(顯然是在 POM 中),并負(fù)責(zé)實(shí)際上構(gòu)建 bundle 的工作,,而 BndTools 會(huì)提供編輯和分析 bundle 描述符以及依賴關(guān)系的方式,,還提供了設(shè)置和執(zhí)行運(yùn)行配置(run configurations)的方式,這就是它的價(jià)值所在,。
InfoQ:想要開(kāi)始使用 BndTools,,有沒(méi)有教程可供使用?
Neil Bartlett:有的,,你可以在 http://bndtools.org/doc/tutorials/找到,。
InfoQ:你能使用 BndTools 編寫 Java 源代碼,而不需要在編碼的時(shí)候依賴 OSGi 嗎,?
Neil Bartlett:可以,,BndTools 希望你可以使用 OSGi 聲明式服務(wù)以 POJO 樣式編寫組件,而不依賴于 OSGi,。這樣,,這些組件就可以在 OSGi 之外進(jìn)行單元測(cè)試,并在非 OSGi 的生產(chǎn)環(huán)境——像 Sprint 或 JavaEE——中使用,。
你甚至還會(huì)發(fā)現(xiàn) BndTools 具有配置模塊和分析依賴關(guān)系的功能,,即便你還沒(méi)有做好部署到 OSGi 中的準(zhǔn)備,它們對(duì)于提高代碼的模塊性很有幫助。例如,,我們可以使用 PojoSR 提供類似于 OSGi 的服務(wù)注冊(cè),它會(huì)支持 OSGi 的大多數(shù)特性,,只是不支持在 OSGi 中必須要使用的模塊邊界,。這樣它可以幫助你將遺留應(yīng)用程序遷移到 OSGi,并且在 BndTools 中開(kāi)發(fā),,這樣你就能夠看到應(yīng)用程序還差多少才能夠完全運(yùn)行在完整的 OSGi 上,。
InfoQ:Bnd 可能會(huì)支持其它 IDE 嗎,像 IntelliJ 和 NetBeans,。
Neil Bartlett:BndTools 本身與 Eclipse 聯(lián)系非常緊密,,不會(huì)支持其它 IDE。然而,,其他 IDE 也開(kāi)始整合 bnd,,讓它們更易于互操作。例如,,IntelliJ 就有 Osmorc 項(xiàng)目,,它會(huì)使用 bnd,并且在多種方式上與 BndTools 的開(kāi)發(fā)哲學(xué)類似,。我已經(jīng)與 Osmorc 的首席開(kāi)發(fā)者合作,,讓開(kāi)發(fā)者能夠更輕松地使用各種 IDE 來(lái)協(xié)同工作。
在我上次詢問(wèn)的時(shí)候,,NetBeans 項(xiàng)目還沒(méi)有計(jì)劃直接支持 OSGi 的開(kāi)發(fā),。但是,NetBeans 非常專注于 Maven,,使用 NetBeans 的 OSGi 開(kāi)發(fā)者通常會(huì)使用 Maven Bundle Plugin,,之前我們也曾提到,它也是 BndTools 最初集成 Maven 的方式,。
你可以使用 Eclipse Marketplace 來(lái)安裝 BndTools,。
查看英文原文:BndTools provides OSGi Development in Eclipse