OSGi將Maven與Equinox結合使用

很長時間以來,我一直在努力理解OSGi的真正含義。 它已經存在很長時間了,但是沒有多少人意識到這一點。 人們已經大肆宣傳它是一種非常復雜的技術。 這是我為所有Java開發人員簡化的嘗試。

簡而言之, OSGi是一組規范,這些規范允許對使用Java技術構建的軟件進行模塊化組裝。 它定義了組件–服務的創建和注冊(在啟用OSGi的容器中),以便進行內部通信。 OSGi的另一個好處是,所有這些服務都可以在運行時安裝/卸載/啟動/停止(即可以在運行時熱部署代碼)。 與在諸如WebSphere , JBoss , WebLogic的流行J2EE應用服務器中找到的Tomcat和EJB容器之類的Servlet容器實現類似, OSGi也具有諸如Equinox (這是Eclipse的基礎), Apache Felix …等流行的容器實現。

面向服務的方法是OSGi的強項之一,但是當您不得不處理具有大量依賴關系的應用程序時,我覺得這很重要。 OSGi解決了“ Jar Hell”的問題。
一個例子。 假設您在應用程序中使用兩個庫libX和libY。 我們還假設它們每個在libZ中都有一個依賴關系,但是版本不同。 libX取決于libZ 2.0,而libY取決于libZ 1.0 如果libZ 2.0與libZ 1.0不兼容,則在同一應用程序中同時使用它們時,可能會遇到難以解決的問題。 OSGi可以處理此類問題。 OSGi支持Import-Package指令,該指令可用于為應用程序-服務應使用的任何Java包指定一個版本。 OSGi類加載器能夠根據此信息找到正確的包/罐。 在我之前的示例中,如果庫libX,libY和libZ與OSGi兼容,則可以將它們全部加載到同一JVM中而不會出現問題: libZ 1.0將使用Export-Package指令org.libz; 版本= 1.0 libZ 2.0將使用Export-Package指令org.libz; 版本= 2.0 libX將使用Import-Package指令org.libz; 版本= 2.0 libY將使用Import-Package指令org.libz; 版本= 1.0 OSGi還為Java應用程序帶來了更強大的模塊化概念。 只能在捆綁軟件之外使用通過Export-Package指令導出的軟件包。

在本文中,我將解釋使用Eclipse Equinox容器的OSGi 。 在計算機上安裝了Eclipse IDE的任何人也將OSGi容器安裝在Eclipse插件的文件夾中。

OSGi容器jar文件的名稱類似于org.eclipse.osgi_ <version> .jar

您可以像這樣啟動OSGi

java -jar org.eclipse.osgi_3.5.2.R35x_v20100126.jar -console

附件是我如何啟動OSGi容器的示例屏幕截圖(類似于啟動Tomcat )

現在,我們已經啟動了OSGi容器,讓我們使用Maven創建一個“ HelloWorld” OSGi應用程序。 項目結構如下所示:

以下是該項目的pom.xmlpom.xml還添加了2個配置文件,以便創建另外2個新模塊( MathServiceMathServiceClient ),本文稍后將對此進行說明。

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.linkwithweb.osgi</groupId><artifactId>HelloWorld</artifactId><version>0.0.1-SNAPSHOT</version><name>HelloWorld</name><dependencies><dependency><groupId>org.osgi</groupId><artifactId>org.osgi.core</artifactId><version>4.2.0</version></dependency></dependencies><build><finalName>HelloWorld-${version}</finalName><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>2.3.1</version><configuration><source>1.5</source><target>1.5</target></configuration></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-jar-plugin</artifactId><configuration><archive><manifestFile>src/main/resources/META-INF/MANIFEST.MF</manifestFile></archive></configuration></plugin></plugins></build><profiles><profile><id>MathService</id><build><finalName>MathService-${version}</finalName><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>2.3.1</version><configuration><source>1.5</source><target>1.5</target></configuration></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-jar-plugin</artifactId><configuration><excludes><exclude>**/*.xml</exclude><exclude>**/*.bsh</exclude><exclude>**/*.properties</exclude></excludes><archive><manifestFile>src/main/resources/MathService/META-INF/MANIFEST.MF</manifestFile></archive></configuration></plugin></plugins></build></profile><profile><id>MathServiceClient</id><build><finalName>MathServiceClient-${version}</finalName><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>2.3.1</version><configuration><source>1.5</source><target>1.5</target></configuration></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-jar-plugin</artifactId><configuration><excludes><exclude>**/*.xml</exclude><exclude>**/*.bsh</exclude><exclude>**/*.properties</exclude></excludes><archive><manifestFile>src/main/resources/MathServiceClient/META-INF/MANIFEST.MF</manifestFile></archive></configuration></plugin></plugins></build></profile></profiles></project>

如果仔細觀察pom.xml,您將看到我們創建的每個OSGi捆綁包都有3個MANIFEST.MF定義。 這么說,讓我解釋一下OSGi捆綁包是什么。 OSGi軟件包本質上與標準Java“ jar”文件相同,但其特定配置在“ jar的Manifest”文件中定義。 OSGi容器讀取“ jar”的清單文件中的所有OSGi特定條目,以激活捆綁包。 那不是很酷嗎? 使用OSGi,我們避免像其他框架一樣學習任何新的元數據格式!

這是我為MathServiceClient 捆綁包定義的示例Manifest.MF

Manifest-Version: 1.0
Bundle-Name: MathServiceClient
Bundle-Activator: com.linkwithweb.osgi.service.client.MathServiceClientActivator
Bundle-SymbolicName: MathServiceClient
Bundle-Version: 1.0.0
Import-Package: org.osgi.framework,com.linkwithweb.osgi.service

如您所見,除Manifest-Version以外的所有條目都是OSGi特定的。 這些條目定義了如何激活捆綁軟件,捆綁軟件的名稱和版本,其所有從屬庫以及暴露給其他服務使用的擴展點。

讓我向您展示如何將“ HelloWorld”捆綁軟件安裝到Equinox OSGi Container中。 以下是“ HelloWorld”捆綁包的MANIFEST.MF文件和Activator類。

package com.linkwithweb.osgi;import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;/*** @author Ashwin Kumar**/
public class HelloActivator implements BundleActivator {public void start(BundleContext context) {System.out.println("Hello World");}public void stop(BundleContext context) {System.out.println("Goodbye All");}
}
Manifest-Version: 1.0
Bundle-Name: HelloWorld
Bundle-Activator: com.linkwithweb.osgi.HelloActivator
Bundle-SymbolicName: HelloWorld
Bundle-Version: 1.0.0
Import-Package: org.osgi.framework

要構建捆綁包,請運行“ mvn clean package”

它將在您的Maven項目的目標文件夾中創建HelloWorld-0.0.1-SNAPSHOT.jar 。 這是顯示如何在Equinox中安裝和啟動“ HelloWorld”捆綁軟件的圖像

如您所見,我們使用install命令安裝捆綁軟件,并使用start命令,使用捆綁軟件安裝后容器返回的捆綁軟件ID啟動捆綁軟件。

現在,就捆綁軟件的生命周期而言,啟動捆綁軟件將觸發對捆綁軟件的Activator類的“ start ”方法的調用,而停止捆綁軟件將觸發對捆綁軟件的Activator類的“ stop ”方法的調用。 我們可以在容器的終端中看到上述行為的結果,該終端在模塊啟動時顯示“ Hello World”消息!

恭喜,您已經了解了OSGi的基礎知識,并且已經部署了第一個捆綁軟件!

曝光和消費服務

為了解釋這一點,我將實現一個非常簡單的示例,在該示例中,我將發布一個可以添加兩個數字的服務。

首先,我們需要定義一個接口,以向外部捆綁包(客戶端)公開“添加”功能

package com.linkwithweb.osgi.service;/*** @author Ashwin Kumar**/
public interface MathService {/*** @param a* @param b* @return*/public int add(int a, int b);
}

現在執行類

package com.linkwithweb.osgi.service;/*** @author Ashwin Kumar**/
public class MathServiceImpl implements MathService {/* (non-Javadoc)* @see com.linkwithweb.osgi.service.MathService#add(int, int)*/public int add(int a, int b) {// TODO Auto-generated method stubreturn a+b;}}

接下來是Activator類,該類將“添加”服務注冊到OSGi容器。

package com.linkwithweb.osgi.service;import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;/*** @author Ashwin Kumar**/
public class MathServiceActivator implements BundleActivator {/** (non-Javadoc)** @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)*/public void start(BundleContext context) {MathService service = new MathServiceImpl();// Third parameter is a hashmap which allows to configure the service// Not required in this examplecontext.registerService(MathService.class.getName(), service, null);System.out.println("Math Service Registered");}/** (non-Javadoc)** @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)*/public void stop(BundleContext context) {System.out.println("Goodbye From math service");}
}

以下是“添加”服務包的清單文件。

Manifest-Version: 1.0
Bundle-Name: MathService
Bundle-Activator: com.linkwithweb.osgi.service.MathServiceActivator
Bundle-SymbolicName: MathService
Bundle-Version: 1.0.0
Import-Package: org.osgi.framework
Export-Package: com.linkwithweb.osgi.service

如果您觀察上面的清單,您會注意到我們正在導出一些軟件包,以便以后使用。 同樣,必須在此處定義所有運行時所需的軟件包(使用Import-Package指令)。

就像本文的上一節一樣,使用以下命令來構建jar文件

mvn -PMathService軟件包

您可以在下面看到安裝和啟動OSGi捆綁軟件的命令。

以下是“添加”服務的使用者的實現。 消費者打包在OSGi捆綁激活器類中,僅用于演示目的。 您可以自由地將使用者作為單獨的OSGi服務實施,因為OSGi服務可以相互通信!

package com.linkwithweb.osgi.service.client;import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceReference;import com.linkwithweb.osgi.service.MathService;/*** @author Ashwin Kumar**/
public class MathServiceClientActivator implements BundleActivator {MathService service;private BundleContext context;/** (non-Javadoc)** @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)*/public void start(BundleContext context) {this.context = context;// Register directly with the serviceServiceReference reference = context.getServiceReference(MathService.class.getName());service = (MathService) context.getService(reference);System.out.println(service.add(1, 2));}	/** (non-Javadoc)** @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)*/public void stop(BundleContext context) {System.out.println(service.add(5, 6));}
}

跟隨是“添加”服務使用者捆綁包的清單文件。

Manifest-Version: 1.0
Bundle-Name: MathServiceClient
Bundle-Activator: com.linkwithweb.osgi.service.client.MathServiceClientActivator
Bundle-SymbolicName: MathServiceClient
Bundle-Version: 1.0.0
Import-Package: org.osgi.framework,com.linkwithweb.osgi.service

要創建,安裝并啟動“添加”服務客戶端捆綁包,請遵循以下步驟:

mvn -PMathServiceClient軟件包

就這樣! 希望你喜歡它!

您可以在此處下載本文的源代碼

參考:來自Felicitas和Beatitudo博客的 JCG合作伙伴 Aswin的OSGI,適合初學者使用Maven和Equinox(HowTo) 。

相關文章 :
  • Java Code Geeks Andygene Web原型
  • Spring,Quartz和JavaMail集成教程
  • 使用Spring將POJO公開為JMX MBean
  • 依賴注入–手動方式

翻譯自: https://www.javacodegeeks.com/2011/06/osgi-using-maven-equinox.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/374575.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/374575.shtml
英文地址,請注明出處:http://en.pswp.cn/news/374575.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

note05-計算機網絡

5.網絡安全 被動攻擊(UDP報文被截獲 被 進行流量分析) 主動攻擊 1.篡改(更改報文流 偽報文) 2.惡意程序(病毒、木馬、蠕蟲、炸彈) 3.拒絕服務Dos 密碼體制 1.對稱密鑰密碼體制(DES IDEA) 即加密和解密的密鑰K相同 2.公鑰密碼體制(RSA) A加密使用PKB公鑰 B解密使用對應的私鑰SK…

825. 適齡的朋友

適齡的朋友 在社交媒體網站上有 n 個用戶。給你一個整數數組 ages &#xff0c;其中 ages[i] 是第 i 個用戶的年齡。 如果下述任意一個條件為真&#xff0c;那么用戶 x 將不會向用戶 y&#xff08;x ! y&#xff09;發送好友請求&#xff1a; age[y] < 0.5 * age[x] 7 ag…

struts2設置文件上傳大小

利用struts2想要設置或者限制上傳文件的大小,可以在struts.xml配置文件里面進行如下配置: <constant name"struts.multipart.maxSize" value"10000000" /> 上面這句話的意思是設置文件上傳大小&#xff0c;最大不超過9.8M。計算方式如下&#xff1a;…

Java命名約定

我想寫這篇簡短的文章來幫助某些難以記住Java API類和方法名稱的人。 如您所知&#xff0c;Java是區分大小寫的語言&#xff0c;要構建Java程序&#xff0c;您需要使用許多內置API類和方法。 而且&#xff0c;初學者發現很難準確地記住方法名稱和類名稱而不改變大小寫。 但是實…

smarty引擎之練習

關于smarty最直觀的感受就是分離了頁面中html和php的代碼&#xff0c;頁面不再混亂&#xff0c;很清晰了…… smarty->assign();//注冊 smarty->display();//加載模板 除了老師給的表&#xff0c;kemu,nandu,type都建了表格&#xff0c;便于使用 main.php <?phpinclu…

Heron 論文翻譯及理解

Heron 論文翻譯及理解 背景介紹&#xff1a; Heron是號稱Twitter流數據處理的新一代實現&#xff0c;是StormV2。我們首先回顧一下Storm系統的問題 worker日志混亂&#xff0c;如果一個bolt日志過大&#xff0c;會沖掉其他bolt的日志worker之間因為沒有資源隔離&#xff0c;因此…

1688比賽中的配對次數

給你一個整數 n &#xff0c;表示比賽中的隊伍數。比賽遵循一種獨特的賽制&#xff1a; 如果當前隊伍數是 偶數 &#xff0c;那么每支隊伍都會與另一支隊伍配對。總共進行 n / 2 場比賽&#xff0c;且產生 n / 2 支隊伍進入下一輪。 如果當前隊伍數為 奇數 &#xff0c;那么將…

Hadoop:簡單介紹

什么是Hadoop&#xff1a; Hadoop是一種用Java編寫的框架&#xff0c;用于在大型商品硬件集群上運行應用程序&#xff0c;并具有類似于Google File System和MapReduce的功能 。 HDFS是高度容錯的分布式文件系統&#xff0c;與Hadoop一樣&#xff0c;旨在部署在低成本硬件上。 它…

PHP中__get()和__set()的用法實例詳

剛剛看到一個對我有用的文章&#xff0c;我就把它摘抄下來了。 php面向對象_get(),_set()的用法 一般來說&#xff0c;總是把類的屬性定義為private&#xff0c;這更符合現實的邏輯。但是&#xff0c;對屬性的讀取和賦值操作是非常頻繁的&#xff0c;因此在PHP5中&#xff0…

Javascript 異步編程的4種方法

你可能知道&#xff0c;Javascript語言的執行環境是"單線程"&#xff08;single thread&#xff09;。 所謂"單線程"&#xff0c;就是指一次只能完成一件任務。如果有多個任務&#xff0c;就必須排隊&#xff0c;前面一個任務完成&#xff0c;再執行后面一…

力扣奇偶鏈表

給定單鏈表的頭節點 head &#xff0c;將所有索引為奇數的節點和索引為偶數的節點分別組合在一起&#xff0c;然后返回重新排序的列表。 第一個節點的索引被認為是 奇數 &#xff0c; 第二個節點的索引為 偶數 &#xff0c;以此類推。 請注意&#xff0c;偶數組和奇數組內部的…

JAVA入門之方法

所謂方法&#xff0c;就是用來解決一類問題的代碼的有序組合&#xff0c;是一個功能模塊。 一般情況下&#xff0c;定義一個方法的語法是&#xff1a; 其中&#xff1a; 1、 訪問修飾符&#xff1a;方法允許被訪問的權限范圍&#xff0c; 可以是 public、protected、private 甚…

使用Netbeans開發App Engine Java

如果您剛開始進行App引擎開發&#xff0c;那么您可能會感覺Eclipse是首選的IDE。 而且&#xff0c;Google還單獨提供了它的Eclipse IDE 官方插件 。 但是不使用Eclipse的人呢&#xff1f; 當然&#xff0c;您始終可以進行命令行開發&#xff0c;但是現在這些人是誰&#xff01;…

JAVA基本類庫介紹

我們曾經講過&#xff0c;Java已經為編程者編制了許多類&#xff0c;這些類已經經過測試&#xff0c;基本上不存在錯誤&#xff0c;這些類都是我們編程的基礎。如果不利用這些已存在的類&#xff0c;我們的 編程工作將變得異常復雜&#xff0c;所以我們應盡可能多的掌握Java基本…

力扣回文鏈表

給你一個單鏈表的頭節點 head &#xff0c;請你判斷該鏈表是否為回文鏈表。如果是&#xff0c;返回 true &#xff1b;否則&#xff0c;返回 false 。 class Solution {public boolean isPalindrome(ListNode head) {List<Integer> res new ArrayList<Integer>()…

JAVA運算符和優先級

1、算術運算符&#xff1a; 和 -- 既可以出現在操作數的左邊&#xff0c;也可以出現在右邊&#xff0c;但結果是不同&#xff0c;如&#xff1a; ①int a5&#xff1b;int ba&#xff1b; #先把a賦給b&#xff0c;a再自增 ②int a5&#xff1b;int ba&#xff1b;   #a先…

將JSON功能添加到您的GWT應用程序中

JSON簡介 在Web應用程序上工作時&#xff0c;總是會出現客戶端-服務器數據交換的問題。 在此問題上有多種方法&#xff0c;其中許多使用XML進行交換。 執行此任務的一種不太知名的格式是JSON。 JSON&#xff08;JavaScript對象表示法&#xff09;是一種輕量級的數據交換格式。…

win10資源管理器怎么打開_讓你效率倍增的電腦神器,最強資源管理器增強工具「QTTabBar」...

前言Windows 自帶的資源管理器的功能比較簡單&#xff0c;夠用是夠用了&#xff0c;但有時也確實無法滿足我們對更便捷高效的操作方式的追求。「QTTabBar」正是一個非常強大的 Windows 資源管理器增強工具&#xff01;不僅支持多標簽頁管理&#xff0c;還有許多便捷的擴展功能&…

android橫向滑動選擇的view

做文字編輯&#xff0c;從網上找來的。 HorizontalScrollSelectView&#xff1a; public boolean mAlwaysOverrideTouch true;protected ListAdapter mAdapter;private int mLeftViewIndex -1;private int mRightViewIndex 0;protected int mCurrentX;protected int mNextX;…

適用于Mac OS X的官方Java 7 –狀態

希望到現在&#xff0c;每個人都知道蘋果公司去年加入了OpenJDK項目。 這意味著什么&#xff1f; 蘋果將??把用于私有Mac Java構建的代碼作為GPL代碼貢獻給OpenJDK 甲骨文將接管Java的Mac端口 隨著時間的流逝&#xff0c;Mac平臺將成為Java世界中完全一流的公民 對于想要在…