本文介绍了用Idea搭建OSGI项目开发的过程,演示使用的JDK8,Equinor OSGI Framework。

OSGI简介

OSGI的全称是Open Service Gateway Initiative,直译就是开放服务网关。最新的OSGI定义是The Dynamic Module System for Java,即面向java的动态模块化系统。

在传统Web开发中,我们为了进行功能的分离,经常会进行模块划分,比如基础信息模块交由A和B做,接口信息模块交由C和D做。最终,再汇集到一起,组成一个完整的项目。在这整一个流程中,我们做到的只是逻辑上的解耦,最终这些模块还是运行于同一服务器上,共享同一个classpath。这时就会出现一个局限性问题,比如现在接口规范改了,我只想停掉接口信息模块,而基础信息模块仍能正常运行,这显然是无法实现的。而使用OSGI可以完美解决这个问题,OSGI是基于模块(Bundle)驱动的,每个模块都有属于自己的classpath和类加载器,模块之间通过服务注册和发现进行关联,每个模块有着自己独立的生命周期,我们可以动态地对模块进行加载、卸载、更新。摘自https://www.jianshu.com/p/11d...。

OSGI可以理解成是JVM单进程内的SOA,当然也支持多进程分布式的模块之间的调用。

Equinor下载

下载地址:https://download.eclipse.org/...

本文下载的是equinox-SDK-4.11.zip,下载后进行解压,后面需要用到这个解压目录。

Idea创建OSGI工程

File -> New -> Project,选择Java,点击Next,创建一个空工程。

继续点击Next。

填写项目名称,这里叫osgi_demo。

分别创建api、server、client三个OSGI模块。

创建模块时勾选OSGI作为开发环境,Use library从刚才下载的Equinox解压的目录下的plugins目录中选择org.eclipse.osgi_3.13.300.v20190218-1622.jar。

创建模块完成之后,打开idea的preferences,在Languages & Frameworks找到OSGI Framework Instances选项。

添加Equinox,Home directory选择刚才解压的Equinox目录。

编写演示代码

结构如下图

api模块中定义接口类IHelloService

package osgi.demo.api;

public interface IHelloService {

/**

* 和某人打招呼

* @param somebody

* @return

*/

String sayHello(String somebody);

}

server模块接口实现类HelloServiceImpl

package osgi.demo.server;

import osgi.demo.api.IHelloService;

public class HelloServiceImpl implements IHelloService {

@Override

public String sayHello(String somebody) {

return "hello " + somebody;

}

}

server模块服务注册类HelloServerBundle

package osgi.demo.server;

import org.osgi.framework.BundleActivator;

import org.osgi.framework.BundleContext;

import osgi.demo.api.IHelloService;

import java.util.Dictionary;

import java.util.Hashtable;

public class HelloServerBundle implements BundleActivator {

@Override

public void start(BundleContext bundleContext) throws Exception {

IHelloService service = new HelloServiceImpl();

Dictionary properties = new Hashtable<>();

//服务注册

bundleContext.registerService(IHelloService.class, service, properties);

}

@Override

public void stop(BundleContext bundleContext) throws Exception {

}

}

client模块调用服务类HelloClientBundle

package osgi.demo.client;

import org.osgi.framework.BundleActivator;

import org.osgi.framework.BundleContext;

import org.osgi.framework.ServiceReference;

import osgi.demo.api.IHelloService;

import java.util.Objects;

public class HelloClientBundle implements BundleActivator {

@Override

public void start(BundleContext bundleContext) throws Exception {

//获取到IHelloService服务引用

ServiceReference reference = bundleContext.getServiceReference(IHelloService.class);

if (Objects.nonNull(reference)) {

//发现服务

IHelloService service = bundleContext.getService(reference);

if (Objects.nonNull(service)) {

System.out.println(service.sayHello("jecyhw"));

}

//注销服务

bundleContext.ungetService(reference);

}

}

@Override

public void stop(BundleContext bundleContext) throws Exception {

}

}

各模块OGSI配置

api模块配置,导出接口定义所在包osgi.demo.api(Additional properties是bundle的相关属性配置的地方)。

server模块配置,配置HelloServerBundle类作为该bundle的启动类。

client模块配置,配置HelloClientBundle类作为该bundle的启动类。

osgi启动配置并运行

选择Edit Configurations。

添加OSGI Bundles。

配置如下。

client模块调用了server的服务,按照依赖关系,server模块需要先启动,把服务注册在osgi框架中,client模块才能调用到,Start level是用来定义bundle模块的启动优先级,值越小,启动优先级越高。

Framework start level是整个osgi框架的启动级别,也就是整个项目的启动级别,大于这个值的bundle模块是不会被启动的。如果这个值为1,client模块的启动级别为2,client模块是不会被启动的,可以调整试试。

点击OK之后,就可以运行了。

运行结果截图。

参考资料

Java模块化之路 —— OSGI介绍

深入理解OSGi:Equinox原理、应用与最佳实践

osgi php,idea搭建osgi项目开发学习相关推荐

  1. 【Qt+OpenCV项目开发学习】二、图片查看器应用程序开发

    一.前言 本博客将讲解如何用Qt+OpenCV开发一款图片查看器的Windows应用程序,其实不用OpenCV也能开发出这类软件,作者目的是为了学习Qt+OpenCV开发项目,所以会使用OpenCV, ...

  2. webpack搭建vue项目开发环境【文档向学习】

    为何有这篇文章 各个社区已经有无数篇帖子介绍如何使用webpack搭建前端项目,但无论是出于学习webpack的目的还是为了解决工作实际需要都面临着一个现实问题,那就是版本更新.别人的帖子可能刚写好版 ...

  3. 项目怎么部署到服务器上_项目开发学习 云服务器的部署

    在项目开发和学习的过程中,前端与后端进行数据交互是非常重要的一环,无论是web开发还是移动开发,都会涉及到这一问题.如今在涉及到数据交互的应用中,后台都有云服务器做支撑.通俗地讲,你自己的电脑就可以看 ...

  4. Java实战项目开发学习书籍

    学习Java 练手小项目书籍 学习JavaScript 的操作书籍

  5. phalcon index.php,Phalcon环境搭建与项目开发

    简介 Phalcon 是开源.全功能栈.使用 C 扩展编写.针对高性能优化的 PHP 5 框架. 开发者不需要学习和使用 C 语言的功能, 因为所有的功能都以 PHP 类的方式暴露出来,可以直接使用. ...

  6. PHP Web项目开发学习,经验谈

    列个表格吧,看着也比较方便: 时间 事项 六月 七月 八月 九月 工作任务 前端页面 服务端页面 地图定位 服务器搭建 图片上传 视频文件信息的获取 关键词 Css+div+js PHP,谷歌maps ...

  7. Jenkins高级篇之Pipeline技巧篇-1-小白搭建Pipeline项目开发环境

    之前,有人和我说,pipeline教程这里,关于如何创建pipeline的git项目和,如何在jenkins上做pipeline的测试这块,在前面文章交代不清楚.这里我补上一篇,通过这一篇,小白也能开 ...

  8. 第2章搭建CRM项目开发环境(数据库设计)

    2.1CRM数据库设计 2.1.1数据库设计原则 我们可以结合项目原型来考虑数据库设计,市场活动,用户,这些都是需要是持久化的,所以都需要设计成表.表和表之间通常还会有一定的关系.看每一个创建表单上都 ...

  9. UE4数字孪生项目开发学习大纲

    目录 初步学习 模型制作编辑 材质Shader开发 灯光氛围调节 蓝图基础 C/C++基础 UMG开发 角色动画 媒体播放 资产打包与加载 文件解析 多人协同开发 数字孪生项目框架 进阶学习 Gis数 ...

最新文章

  1. 面向函数范式编程(Functional programming)
  2. sess.run()详解
  3. 数据库服务器管理系统,数据库管理系统服务器
  4. Spark-sql:以编程方式执行Spark SQL查询(通过反射的方式推断出Schema,通过StrutType直接指定Schema)
  5. (转)linux自动备份oracle数据库并上传到备份服务器 脚本实现
  6. linux添加usb打印机,打印机配置和添加本地打印机
  7. edem颗粒替换_Altair EDEM Professional 2020.2安装教程(附替换补丁)
  8. python2.7 BeautifulSoup 爬QQ空间说说-含源码-第一天
  9. ms office excel2013教程 - 数据有效性
  10. php中根据二维数组某个字段的值查找对应的一维数组
  11. Network 【HTTPS请求/AFN】
  12. vsftpd服务----配置
  13. Telegram公布个人身份验证工具,可共享财务及ICO数据
  14. chrome自动翻译导致网页文本错乱
  15. Linux操作系统下Moodle平台的搭建
  16. 【ftp】725本电子书下载
  17. vue字符串列表转换数组_vue 数组对接字符串 传值时候,join(',') 一下 watch
  18. 基于SAE特征融合的合成孔径雷达图像的目标识别
  19. python用字典存储学生成绩_掌握Python字典的12个例子
  20. AI测谎仪:通过微表情在法庭检测谎言,性能已优于人类

热门文章

  1. 笛卡尔积 java_Java中任意集的笛卡尔积
  2. 一看就懂关于阿里云服务器地域和可用区的选择方法
  3. 「镁客·请讲」酷哇机器人刘力源:主打低速自动驾驶场景,AI环卫需求正在急速增长... 1
  4. 【linux】记录一次crontab定时任务+ lsof 无法正常执行的问题
  5. 单商户SaaS商城系统-v2.1.0更新啦!
  6. simplify3d 打印参数设置笔记
  7. java实现k 近邻算法_K近邻算法哪家强?KDTree、Annoy、HNSW原理和使用方法介绍
  8. Extjs下拉框 Combobox
  9. c++调用powershell_从ShellCode启动PowerShell后门
  10. 基于DSP+FPGA的多轴运动控制平台(一)硬件设计