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

OSGi简介–模块化Java相关推荐

  1. java 模块化osgi_OSGi简介–模块化Java

    java 模块化osgi OSGi联盟是这种搁浅的管理机构,它始于1999年.其最初目标是为网络设备创建开放搁浅. 基于此思想,此规范也针对Java引入. Eclipse在Java中是第一个. 他们于 ...

  2. 模块化Java简介(转载infoq)

    在过去几年,Java模块化一直是一个活跃的话题.从JSR 277(现已废止)到JSR 291,模块化看起来是Java进化过程中的必经一环.即便是基于JVM的未来语言,比如Scala,也考虑了模块化的问 ...

  3. osgi简介_OSGi:简介

    osgi简介 为基于Java的系统创建的OSGi提供了模块化系统的框架. OSGi使得可以定义每个单独模块与其他模块的依赖关系,并使用户能够控制生命周期并动态更改系统的每个组件. OSGi是一个规范, ...

  4. 1.OSGI企业应用开发-OSGI简介

    一.OSGI简介 OSGI全称为Open Service Gateway Initiative(开放服务网关规范),有两个层面的含义,一方面它指OSGi Alliance组织:另一方面指该组织制定的一 ...

  5. android 揭示动画_Java专家考虑了模块化Java的未来,并揭示了Java 11愿望清单中的内容

    android 揭示动画 "以一流的公民身份将模块的概念引入Java中是一个好主意" 我们的Java 10访谈系列即将结束,但是我们还有两个主题需要讨论: 模块化的未来和Java ...

  6. java class 静态模块_Java API 最佳设计实践:在模块化和非模块化 Java 环境中使用...

    了解在设计 Java API 时应该运用的一些 API 设计实践.这些实践通常很有用,而且可确保 API 能在诸如 OSGi 和 Java Platform Module System (JPMS) ...

  7. cxf springmvc_拥抱模块化Java平台:Java 10上的Apache CXF

    cxf springmvc 自Java 9发布最终将Project Jigsaw交付给大众以来,已经过去了整整一年的时间. 这是一段漫长的旅程,但是在那里,所以发生了什么变化? 这是一个很好的问题,答 ...

  8. 使用JBoss Modules来模块化Java

    本文的英文原文Modularized Java with JBoss Modules是JBoss Modules的作者David写的,由HollisChuang翻译在使用JBoss Modules来模 ...

  9. Java密码体系结构简介:Java Cryptography Architecture (JCA) Reference Guide

    来自Java官方的文档,作备忘使用. 简介: Java平台非常强调安全性,包括语言安全,密码学,公钥基础设施,认证,安全通信和访问控制. JCA是平台的一个主要部分,包含一个"提供者&quo ...

最新文章

  1. 实战ALV OO技术实现添加工具条按钮
  2. 067_this关键字
  3. 【javascript】四舍五入
  4. C语言程序练习-L1-030 一帮一 (15分)
  5. 吉林大学计算机与科学专业排名,吉林大学专业排名 哪些王牌专业推荐就读
  6. dj鲜生-通过邮箱发送加密的激活链接
  7. 计算机原理测试卷一,计算机原理章节测考试试卷一.doc
  8. 大数据之-Hadoop之HDFS的API操作_网络拓扑_节点离客户端的距离计算---大数据之hadoop工作笔记0067
  9. mysql lvs 读写分离_mysql高可用架构方案之二(keepalived+lvs+读写分离+负载均衡)
  10. android期末大作业_关于大学期末的一点碎碎念
  11. Eclipse连接小米手机无连接显示解决办法
  12. SSH服务移植到ARM单板
  13. 360应用宝上架流程及所需材料
  14. 大一计算机策划案怎么做,计算机类大一社会实践活动策划书
  15. 最适合汽车软件开发的生态系统是什么?
  16. 锦锐单片机开发工具_锦锐触摸MCU 单片机方案开发
  17. Cadence创建异形焊盘教程(详细操作)
  18. vue 后台翻译_前端使用vue-i18n做中英文翻译
  19. vue 使用vue-i18n 实现多语系(国际化)
  20. 群辉通过Docker搭建Redis集群

热门文章

  1. java泛型程序设计——反射和泛型
  2. ssh无密码登陆权威指南
  3. 索引---B+Tree
  4. 只读事务上下文_我可以/应该在事务上下文中使用并行流吗?
  5. akka和rabbitmq_Akka Notes –演员记录和测试
  6. Java中的证书透明度验证
  7. 引导性GCP:带有Google Cloud Pub / Sub的Spring Cloud Stream
  8. Spring Boot应用程序的“本地服务”
  9. java 可变参数方法_Java方法中的参数太多,第7部分:可变状态
  10. 设计模式 工厂方法_工厂设计模式–一种有效的方法