OSGi简介–模块化Java
OSGi是在Java中定義動態(tài)模塊的方法。 主要為Java實現(xiàn)的三個OSGi容器是Apache Felix , Eclipse Equinox和Knopflefish 。
為什么選擇OSGi? 因為OSGi提供了將應(yīng)用程序劃分為多個模塊的能力,并且那些模塊易于與其他依賴項一起管理。 除此之外,它非常容易安裝,更新,停止和刪除沒有停止引擎的模塊(例如:Tomcat Web應(yīng)用程序容器)。 我們可以使用多種實現(xiàn)方式來影響其他參考。
基于Web的Java框架主要有3個層(表示層,業(yè)務(wù)層和DAO層)。 在那里,我們可以將其分為三個基于OSGi的模塊。 那么我們可以很容易地將錯誤修復(fù)到一層,而不會影響其他錯誤并重新啟動我們的Web容器。 只是我們需要更新模塊。
在OSGi世界中,輸出是捆綁包,可以是Jar或War文件。 捆綁軟件由Java類和其他資源以及一些其他元數(shù)據(jù)組成(向其他捆綁軟件提供服務(wù)和軟件包)。
我將使用Eclipse IDE創(chuàng)建我的第一個捆綁軟件。 因為Eclipse IDe內(nèi)置了Equinox容器(每個eclipse插件都是OSGi捆綁包)。
創(chuàng)建Eclipse插件項目
- 轉(zhuǎn)到新建–>其他–>插件項目 ,然后單擊下一步,將出現(xiàn)新項目創(chuàng)建對話框
- 提供項目名稱和目標(biāo)平臺,如下所示。 然后點擊下一步
項目名稱: com.chandana.Hello.HelloWorld
目標(biāo)平臺:選擇Stranded OSGi
- 在下一個屏幕中,您可以更改捆綁包信息(這些信息可在MANIFEST.MF中找到,稍后我會提供詳細(xì)信息),然后單擊“下一步”按鈕。
- 之后將出現(xiàn)OSGi項目模板選擇對話框。選擇Hello OSGi Bundle,然后單擊Finish。
幾秒鐘后,Eclipse將生成Hello World Plug-In-Project(我?guī)酌腌姏]有響應(yīng):))
在我的項目結(jié)構(gòu)中是這樣的:
Activator.java
package com.chandana.hello.helloworld;import org.osgi.framework.BundleActivator; import org.osgi.framework.BundleContext;public class Activator implements BundleActivator {/** (non-Javadoc)* @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)*/public void start(BundleContext context) throws Exception {System.out.println("Hello World!!");}/** (non-Javadoc)* @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)*/public void stop(BundleContext context) throws Exception {System.out.println("Goodbye World!!");}}Activator是實現(xiàn)BundleActivator的類 接口。 它已經(jīng)停了 然后開始 方法。 ? 當(dāng)捆綁包啟動或停止時,將調(diào)用這些方法 。 此束激活器類在MENIFEST.MF文件( 束激活器條目)中指定。
啟動方法:
捆綁包啟動時,OSGi容器將調(diào)用start方法。 我們可以使用此啟動方法進(jìn)行初始化的數(shù)據(jù)庫連接,注冊服務(wù)以供其他捆綁使用。 停止方式: 捆綁包停止時,OSGi容器調(diào)用stop方法。 我們可以使用此方法從服務(wù)注冊表中刪除服務(wù),例如清理過程
清單文件
Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: HelloWorld Bundle-SymbolicName: com.chandana.Hello.HelloWorld Bundle-Version: 1.0.0.qualifier Bundle-Activator: com.chandana.hello.helloworld.Activator Bundle-Vendor: CHANDANA Bundle-RequiredExecutionEnvironment: JavaSE-1.6 Import-Package: org.osgi.framework;version="1.3.0" Bundle-ManifestVersion
Bundle-ManifestVersion標(biāo)頭顯示OSGi容器,該捆綁包遵循OSGi規(guī)范的規(guī)則。 值為2表示捆綁軟件符合OSGi規(guī)范第4版。 值1表示它符合版本3或更早的版本。
捆綁名稱
Bundle-Name標(biāo)頭定義捆綁的簡短可讀名稱。
Bundle-SymbolicName
Bundle-SymbolicName標(biāo)頭指定捆綁包的唯一名稱。 這是您在從其他捆綁包中引用給定捆綁包時將使用的名稱。
捆綁版本
Bundle-Version標(biāo)頭是捆綁軟件的版本號。
捆綁銷售商
Bundle-Vendor標(biāo)頭是供應(yīng)商的描述(例如,這是我的名字)。
進(jìn)口包裝
Import-Package指示此捆綁包還需要其他Java捆綁包(OSGi)。 我們稱之為依賴性。
出口包裝
導(dǎo)出包指示什么是捆綁包中的公共包,那些導(dǎo)出包可以從其他捆綁包中導(dǎo)入。
運(yùn)行捆綁包:
- 對于“運(yùn)行此項目”,請單擊“運(yùn)行”->“運(yùn)行配置”,在OSGi Framework中,右鍵單擊并創(chuàng)建新的“運(yùn)行配置”。
- 首先取消選中所有目標(biāo)平臺,然后單擊“ 添加必需的捆綁包” 。
- 之后,單擊“運(yùn)行”按鈕,應(yīng)用更改并運(yùn)行項目。
- 運(yùn)行后,項目OSGi控制臺顯示如下。
OSGi終端命令:
開始–啟動指定的捆綁包 停止–停止指定的捆綁包 卸載–卸載指定的捆綁軟件 更新–更新指定的捆綁包 刷新–刷新指定捆綁包的軟件包 b –顯示指定捆綁商品的詳細(xì)信息 標(biāo)頭–打印包標(biāo)頭 服務(wù)–顯示注冊的服務(wù)詳細(xì)信息源代碼
接下來,我將描述如何創(chuàng)建基于依賴的OSGi捆綁軟件。
OSGi服務(wù)是一個Java對象實例,已向OSGi框架注冊了一組屬性。 可以通過服務(wù)注冊表(通過類BundleContext執(zhí)行)訪問服務(wù)。 BundleActivator將在啟動和停止時調(diào)用。 當(dāng)BundleActivator調(diào)用start方法時,我們將注冊我們的服務(wù)。 之后,任何捆綁包都可以訪問該服務(wù)。
服務(wù)包:
在服務(wù)包中,您需要導(dǎo)出服務(wù),并需要通過服務(wù)注冊表進(jìn)行注冊。 當(dāng)我們導(dǎo)出服務(wù)時,我們僅導(dǎo)出接口包。 與往常一樣,這是從其他捆綁包中隱藏實現(xiàn)。
我已經(jīng)創(chuàng)建了一個名為HelloService的示例OSGi項目。
清單文件
Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: HelloService Bundle-SymbolicName: com.chandana.hello.HelloService Bundle-Version: 1.0.0 Bundle-Activator: com.chandana.hello.helloservice.Activator Bundle-Vendor: CHANDANA Bundle-RequiredExecutionEnvironment: JavaSE-1.6 Import-Package: org.osgi.framework;version="1.3.0" Export-Package: com.chandana.hello.service Bundle-ActivationPolicy: lazy服務(wù)接口:
public interface HelloService { public String helloMethods(); }服務(wù)實施:
public class HelloServiceImpl implements HelloService {@Overridepublic String helloMethods() {String retValue = "Inside Hello Service method";return retValue;} }邊界激活劑:
public class Activator implements BundleActivator {ServiceRegistration serviceRegistration;/** (non-Javadoc)* @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)*/public void start(BundleContext context) throws Exception {System.out.println("Bundle Started.....!!!!!");HelloService service = new HelloServiceImpl();serviceRegistration = context.registerService(HelloService.class.getName(), service,null);}/** (non-Javadoc)* @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)*/public void stop(BundleContext context) throws Exception {System.out.println("Bundle Stoped.....!!!!!");serviceRegistration.unregister();} }使用發(fā)布的服務(wù)時,可以從另一個捆綁包中導(dǎo)入它。 因此需要為HelloClient創(chuàng)建另一個插件項目
捆綁內(nèi)容
捆綁包上下文是OSGi運(yùn)行時中單個捆綁包的上下文,它是在捆綁包啟動時創(chuàng)建的。 捆綁包上下文可用于安裝新捆綁包,通過其他捆綁包獲取注冊的服務(wù)以及在框架中注冊服務(wù)。
清單文件
Import-Package: org.osgi.framework;version="1.3.0",com.chandana.hello.service導(dǎo)入捆綁軟件后,您可以訪問該服務(wù)。 重要的是只能通過bundle上下文訪問服務(wù)。 您可以通過BundleContext.getService()方法獲取實際的服務(wù)對象。
激活器類:
public class Activator implements BundleActivator {ServiceReference serviceReference; /** (non-Javadoc)* @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)*/public void start(BundleContext context) throws Exception {serviceReference= context.getServiceReference(HelloService.class.getName());HelloService helloService =(HelloService)context.getService(serviceReference);System.out.println(helloService.helloMethods());}/** (non-Javadoc)* @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)*/public void stop(BundleContext context) throws Exception {context.ungetService(serviceReference);} }context.getServiceReference()方法返回HelloService OSGi服務(wù)引用,使用該服務(wù)引用可以訪問實際的服務(wù)對象。
對于“運(yùn)行此項目”,請單擊“ 運(yùn)行”->“運(yùn)行配置” ,在OSGi Framework中,右鍵單擊并創(chuàng)建新的“運(yùn)行配置” 。 確保HelloService和HelloClient 。
問題 :
如果客戶端訪問服務(wù)時未啟動服務(wù),會發(fā)生什么情況?
如果您停止了該服務(wù)捆綁包,會發(fā)生什么?
代碼倉庫 :
http://code.google.com/p/osgi-world/source/browse/#svn/trunk/com.chandana.hello.HelloService
http://code.google.com/p/osgi-world/source/browse/#svn/trunk/com.chandana.hello.HelloClient
參考:來自JCG合作伙伴的 OSGi(Java模塊化) 簡介和OSGi – 2(OSGi服務(wù))簡介 ? Chandana Napagoda博客上的Chandana Napagoda 。
翻譯自: https://www.javacodegeeks.com/2012/01/introduction-to-osgi-modular-java.html
總結(jié)
以上是生活随笔為你收集整理的OSGi简介–模块化Java的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: WhateverOrigin –与Her
- 下一篇: JavaFX移动应用程序最佳实践,第1部