OSGi简介–模块化Java

OSGi联盟是这一搁浅的管理机构,它始于1999年。其最初目标是为网络设备创建开放搁浅。 基于此思想,此规范也针对Java引入。 Eclipse在Java中是第一个。 他们于2004年6月推出了基于OSGi的Eclipse IDE。

OSGi是在Java中定义动态模块的方法。 主要为Java实现的三个OSGi容器是Apache Felix , Eclipse Equinox和Knopflefish 。

为什么选择OSGi? 因为OSGi提供了将应用程序划分为多个模块的能力,并且那些模块易于与其他依赖项一起管理。 除此之外,它非常容易安装,更新,停止和删除没有停止引擎的模块(例如:Tomcat Web应用程序容器)。 我们可以使用多种实现方式来影响其他参考。

基于Web的Java框架主要有3个层(表示层,业务层和DAO层)。 在那里,我们可以将其分为三个基于OSGi的模块。 那么我们可以很容易地将错误修复到一层,而不会影响其他错误并重新启动我们的Web容器。 只是我们需要更新模块。

在OSGi世界中,输出是捆绑包,可以是Jar或War文件。 捆绑软件由Java类和其他资源以及一些其他元数据组成(向其他捆绑软件提供服务和软件包)。

我将使用Eclipse IDE创建我的第一个捆绑软件。 因为Eclipse IDe内置了Equinox容器(每个eclipse插件都是OSGi捆绑包)。

创建Eclipse插件项目

  • 转到新建–>其他–>插件项目 ,然后单击下一步,将出现新项目创建对话框
  • 提供项目名称和目标平台,如下所示。 然后点击下一步

项目名称: com.chandana.Hello.HelloWorld
目标平台:选择Stranded OSGi

  • 在下一个屏幕中,您可以更改捆绑包信息(这些信息可在MANIFEST.MF中找到,稍后我会提供详细信息),然后单击“下一步”按钮。
  • 之后将出现OSGi项目模板选择对话框。选择Hello OSGi Bundle,然后单击Finish。

几秒钟后,Eclipse将生成Hello World Plug-In-Project(我几秒钟没有响应:))

在我的项目结构中是这样的:

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是实现BundleActivator的 接口。 它已经停了 然后开始 方法。   当捆绑包启动或停止时,将调用这些方法 。 此束激活器类在MENIFEST.MF文件( 束激活器条目)中指定。

启动方法:
捆绑包启动时,OSGi容器将调用start方法。 我们可以使用此启动方法进行初始化的数据库连接,注册服务以供其他捆绑使用。 停止方式: 捆绑包停止时,OSGi容器调用stop方法。 我们可以使用此方法从服务注册表中删除服务,例如清理过程

清单文件

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标头显示OSGi容器,该捆绑包遵循OSGi规范的规则。 值为2表示捆绑软件符合OSGi规范第4版。 值1表示它符合版本3或更早的版本。

捆绑名称
Bundle-Name标头定义捆绑的简短可读名称。

Bundle-SymbolicName
Bundle-SymbolicName标头指定捆绑包的唯一名称。 这是您在从其他捆绑包中引用给定捆绑包时将使用的名称。

捆绑版本
Bundle-Version标头是捆绑软件的版本号。

捆绑销售商
Bundle-Vendor标头是供应商的描述(例如,这是我的名字)。

进口包装
Import-Package指示此捆绑包还需要其他Java捆绑包(OSGi)。 我们称之为依赖性。

出口包装
导出包指示什么是捆绑包中的公共包,那些导出包可以从其他捆绑包中导入。

运行捆绑包:

  • 对于“运行此项目”,请单击“运行”->“运行配置”,在OSGi Framework中,右键单击并创建新的“运行配置”。
  • 首先取消选中所有目标平台,然后单击“ 添加必需的捆绑包”
  • 之后,单击“运行”按钮,应用更改并运行项目。
  • 运行后,项目OSGi控制台显示如下。

OSGi终端命令:

开始–启动指定的捆绑包
停止–停止指定的捆绑包
卸载–卸载指定的捆绑软件
更新–更新指定的捆绑包
刷新–刷新指定捆绑包的软件包
b –显示指定捆绑商品的详细信息
标头–打印包标头
服务–显示注册的服务详细信息

源代码

接下来,我将描述如何创建基于依赖的OSGi捆绑软件。

OSGi服务是一个Java对象实例,已向OSGi框架注册了一组属性。 可以通过服务注册表(通过类BundleContext执行)访问服务。 BundleActivator将在启动和停止时调用。 当BundleActivator调用start方法时,我们将注册我们的服务。 之后,任何捆绑包都可以访问该服务。

服务包:

在服务包中,您需要导出服务,并需要通过服务注册表进行注册。 当我们导出服务时,我们仅导出接口包。 与往常一样,这是从其他捆绑包中隐藏实现。

我已经创建了一个名为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

服务接口:

public interface  HelloService {    public String helloMethods();
}

服务实施:

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();}
}

使用发布的服务时,可以从另一个捆绑包中导入它。 因此需要为HelloClient创建另一个插件项目

捆绑内容

捆绑包上下文是OSGi运行时中单个捆绑包的上下文,它是在捆绑包启动时创建的。 捆绑包上下文可用于安装新捆绑包,通过其他捆绑包获取注册的服务以及在框架中注册服务。

清单文件

Import-Package: org.osgi.framework;version="1.3.0",com.chandana.hello.service

导入捆绑软件后,您可以访问该服务。 重要的是只能通过bundle上下文访问服务。 您可以通过BundleContext.getService()方法获取实际的服务对象。

激活器类:

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服务引用,使用该服务引用可以访问实际的服务对象。

对于“运行此项目”,请单击“ 运行”->“运行配置” ,在OSGi Framework中,右键单击并创建新的“运行配置” 。 确保HelloServiceHelloClient

问题
如果客户端访问服务时未启动服务,会发生什么情况?
如果您停止了该服务捆绑包,会发生什么?

代码仓库
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服务)简介   Chandana Napagoda博客上的Chandana Napagoda 。


翻译自: https://www.javacodegeeks.com/2012/01/introduction-to-osgi-modular-java.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/373420.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HDU FatMouse's Speed 基本DP

题意:要求找到的体重递增,速度递减的老鼠,并且输出最长的长度数,而且输出各自的序列数。Special Judge 思路:先按体重由小到大排序,再找最长速度递减序列。 转移方程:mou[i].w>mou[j].w&am…

java xmpp openfire_搭建Xmpp服务器Openfire

step1、 安装java环境这里是检测是否安装java的网页如没有安装则进行以下步骤1、下载jdk7的mac版:jdk-7u79-macosx-x64.dmg2、安装好之后,在命令行进入以下路径查看#cd /Library/Java/JavaVirtualMachines/3、再查看你自己安装的版本#ls版本为jdk-8u171-…

JavaFX移动应用程序最佳实践,第1部分

到现在为止,所有对JavaFX感兴趣的人都会知道,JavaFX Mobile发行了不久 前。 可以肯定的是,这真是令人难以置信。 我感到筋疲力尽,在发行期间我什至没有精力去写博客…… 但是到目前为止,我感到很恢复,并且希…

Spark程序运行报错解决(1)

报错内容:System memory 259522560 must be at least 4.718592E8. Please use a larger heap size. 解决:Window——Preference——Java——Installed JREs——选中一个Jre 后 Edit 在Default VM arguments 里加入:-Xmx512M 转载于:https://w…

java setsolinger_java socket 的参数选项解读(转)

在MulticastSocket的源代码里有设置多播的方法:public void setInterface(InetAddress inf) throwsSocketException {if(isClosed()) {throw new SocketException("Socket is closed");}checkAddress(inf, "setInterface");synchronized(infLoc…

【转】Linux终端下 dstat 监控工具

转自https://linux.cn/article-3215-1.html dstat 是一个可以取代vmstat,iostat,netstat和ifstat这些命令的多功能产品。dstat克服了这些命令的局限并增加了一些另外的功能,增加了监控项,也变得更灵活了。dstat可以很方便监控系统…

Tomcat和IntelliJ –在webapps文件夹之外部署war文件

目前,我正在开发一个Android应用程序,该应用程序需要云中托管的大量REST服务来支持。 我基于对Java,Groovy以及最重要的Spring的支持选择了Google App Engine 。 我开发了一个基于Spring MVC的REST应用程序,并使用ContentNegotiat…

[HDU1232] 畅通工程 (并查集 or 连通分量)

Input 测试输入包含若干测试用例。每个测试用例的第1行给出两个正整数&#xff0c;分别是城镇数目N ( < 1000 )和道路数目M&#xff1b;随后的M行对应M条道路&#xff0c;每行给出一对正整数&#xff0c;分别是该条道路直接连通的两个城镇的编号。为简单起见&#xff0c;城镇…

java jdbc连接db2数据库_Java连接db2数据库(常用数据库连接五)

1.安装好db2数据库&#xff0c;并建立表如下&#xff1a;2.eclipse或myeclipse中建立工程并导入java连接db2所需要的jar包db2java.jar 下载地址&#xff1a;http://download.csdn.net/detail/whzhaochao/64149813.建立iConn接口&#xff0c;代码如下&#xff1a;package com.zh…

在Windows上,迁移VisualSVN server

最近在搭建自动化测试框架&#xff0c;顺便了解了一下SVN的搭建。对于一般的使用场景&#xff0c;VisualSVN还是挺方便的&#xff0c;而且上手特别快。 由于是第一个demo&#xff0c;后期要迁移到其他服务器上面&#xff0c;所以就熟悉了一下server的迁移。以下是一些记录信息&…

练习脚本三:日志清除

日志清除 #!/bin/bash #清除日志脚本&#xff0c;版本2 LOG_DIR/var/logROOT_UID0 #$UID为0的时候&#xff0c;用户才具有root用户的权限#判断是否使用root用户来运行 if [ "$UID" -ne "$ROOT_UID" ];thenecho "Must be root to run this script.&qu…

Oracle通过邀请Weaver和Chin推动JavaFX向前发展

我昨天发布了愚人节帖子&#xff0c;内容涉及加入NASA协助探索红色大行星。 那个帖子与事实相距不远... NASA开发的技术的所有细节都是100&#xff05;准确的。 哎呀&#xff0c;即使我辞职也是事实&#xff01; 唯一不正确的部分是我将加入的公司。 在NASA协助探索火星的工作也…

java privilege的用法_java反射--注解的定义与运用以及权限拦截

自定义注解类编写的一些规则:1. Annotation型定义为interface, 所有的Annotation会自动继承java.lang.Annotation这一接口,并且不能再去继承别的类或是接口.2. 参数成员只能用public或默认(default)这两个访问权修饰3. 参数成员只能用基本类型byte,short,char,int,long,float,d…

WinForm------TextEdit只能输入数字

代码: this.textEdit1.Properties.Mask.EditMask "\d"; this.textEdit1.Properties.Mask.MaskType MaskType.RegEx; 转载于:https://www.cnblogs.com/tianhengblogs/p/6093634.html

mysql使用随笔

mysql 删除语句 &#xff1a;delete from 表名 where 条件; 例如 delete from tbuserinfo where id 2;mysql 查询语句 &#xff1a;select * 列名 from 表名 where 条件;mysql 模糊查询 &#xff1a; SELECT * FROM 表名 WHERE 列名 LIKE "3%&qu…

JavaFX:创建Sprite动画

到目前为止&#xff0c;尽管我的大多数文章都涉及JavaFX属性和绑定&#xff0c;但今天我想写一讲我也致力于JavaFX运行时的另一部分&#xff1a;动画API。 在本文中&#xff0c;我将解释如何在JavaFX中编写自定义动画&#xff0c;以及如何使用这种方法为Sprite动画创建类。 &am…

java tick_Java中的Clock tick()方法

可以使用tick()Java中Clock类中的方法在所需的时间范围内舍入基本时钟的瞬间。此方法需要两个参数&#xff0c;即基本时钟和滴答的持续时间。同样&#xff0c;返回在所需持续时间内四舍五入的基本时钟时刻。演示此的程序如下所示-示例import java.time.*;public class Main {pu…

JAVA 常用框架和工具

集成开发工具&#xff08;IDE&#xff09;&#xff1a;Eclipse、MyEclipse、Spring Tool Suite&#xff08;STS&#xff09;、Intellij IDEA、NetBeans、JBuilder、JCreator JAVA服务器&#xff1a;tomcat、jboss、websphere、weblogic、resin、jetty、apusic、apache 负载均衡…

MySQL Doublewrite Buffer及业务评估

1. 关于Doublewrite Buffe的总结 Doublewrite Buffer&#xff1a;Doublewrite Buffer出现的初衷是防止buffer pool中的脏页刷新到磁盘中&#xff0c;出现部分写的问题&#xff0c;innodb页大小一般为16k&#xff0c;而Linux操作系统的block size一般为4k。这样在刷新的过程中&a…

使用UIBinder的GWT自定义按钮

这是一个有关如何在GWT上使用UIBinder创建自定义按钮的示例。 public class GwtUIBinderButton implements EntryPoint {public void onModuleLoad() {Button button new Button();button.setText("Button");button.addClickHandler(new ClickHandler(){Overridepub…