IDEA中osgi的开发应用指南详解

前言

最近一直在接触osgi的开发任务,了解到本部门都在使用IDEA作为开发工具,而只有本小组还在使用Eclipse。正好赶上版本发布之后的空闲期,因此想要将osgi插件的开发从Eclipse转至IDEA。搜了不少资料,但是均不够详细,经过几天的仔细摸索,终于成功移植了自己的项目,在此也分享给大家在IDEA上开发osgi,对于IDEA的使用操作过程。

OSGI简介

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

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

新建工程

IDEA自带OSGI开发工具包,因此无需像Eclipse一样下载Plug-in Development,直接使用。
众所周知,IDEA中的Project相当于Eclipse中的WorkSpace,IDEA中的Module相当于Eclipse中的Project,因此在IDEA中新建Project,只是相当于Eclipse中建立WorkSpace而已。

Settings环境配置

IDEA中新建工程,不像Eclipse中那样,在每次新建Project时选择framework,而是在全局设置中先设置好framework工作环境。本项目利用Equinor作为OSGI framework,附赠一个下载地址http://download.eclipse.org/equinox/

下载解压完成后,点击File->Settings,在该界面将framework添加至IDEA中

添加完毕后,在上面的OSGI标签中,便可以选择相应的framework,该界面设置如下图

最后一个import Bnd/Bndtools projects automatically,查了一下Bndtools工具是将普通jar包打包成osgi可用的jar包,由于在建立工程时直接选择OSGI作为开发环境,因此该部分……emmmmmm……..应该是无需勾选吧。

配置Settings完成后,便可以真正开始新建Project了。

开始新建

点击File->New->project,直接选择OSGI作为开发环境,该部分如下图

Libraries选项卡中可以选择已有library作为该Project的library,把你需要用到osgi依赖包导入进来吧,都在Equinor的解压包中的plugins目录里,可以慢慢找。

该部分就比较直观了,相信大家都看得懂。注意底下有个More Settings,想设置的客官可以设置下,不然你的Project名称就变成Module的默认名称了,点击Finish,新建工程完毕。

Project Structure设置

新建工程完毕后,关于添加依赖包,osgi设置等全部都集成在了Project Structure选项卡中。
点击File->Project Structure,进入设置页面。

project选项卡

Modules选项卡

Modules中主要需要设置的是Dependencies选项卡,该部分相当于Eclipse中的classpath路径设置,同时集成了osgi中的import与export。

Libraries选项卡

顾名思义,可以自定义依赖包库,如果在该部分设置的依赖包库,只能用于该Project中,下面还有另一个Global Libraries,在那个里面定义的依赖包库,可用于所有的Project。该部分就看大家自己的取舍去使用了。

Facets

该部分是设置osgi属性的部分,相当于Eclipse中manifast的设置。IDEA中osgi的manifast文件,不像Eclipse在编译阶段便生成,而是在打包后才生成,因此所有的设置内容均只能在该选项卡中设置。

该部分使用如下多图所示。


Additional Contents这个功能,有点类似于Eclipse的osgi中的Build。添加需要一起打包成为最终jar包的jar包。

而在IDEA中,没有了Runtime选项卡,本来Runtime选项卡中的Exported与ClassPath,被拆分。Exported已在前述的Dependencies选项卡中有所介绍。在Eclipse中的ClassPath添加jar包,可自动在manifast文件中生成Bundle-ClassPath。而在IDEA中,必须在Manifest Generration选项卡中的Additional properties中,手动添加,如下图所示。

 

5. Artifacts

该部分用于打包项目,使用osgi开发需要的是osgi能够识别的插件包,会在Build时自动生成,因此该部分在osgi开发中无需使用。

Build工程

全部设置完成后,点击Build->Build Project,便会在相应的目录中输出相应的jar包,将jar包安装至相应地点即可。

总结

Eclipse与IDEA开发OSGI,主要是manifast文件的生成过程存在比较大的差异,例如Exported与ClassPath,以及默认所有的源代码中的类,均会自动归入至Exported中等。还是那句话,决定一个人技术水平的,永远不会是使用的工具。喜欢使用什么工具,还是一个见仁见智的问题,希望能帮助到对此方面有需求的大家。也希望大家多多支持我们。

(0)

相关推荐

  • 使用IDEA配置Maven搭建开发框架ssm教程

    一.配置Maven环境 1.下载Maven 下载链接http://maven.apache.org/download.cgi 2.下载完成解压压缩包并创建本地仓库文件夹 3.打开解压缩文件,配置本地仓库路径 4.配置Maven环境变量 5.在cmd中查看maven是否配置正确 在cmd中输入mvn -v命令查看 二.在IntelliJ IDEA中配置Maven 打开-File-Settings 三.新建maven JAVAWEB项目 1.打开-File-New-Project Next Next

  • Intellij Idea插件开发之创建项目层级的右键菜单

    在使用Android Studio的过程中,发现自带的一些插件无法满足项目的实际需要,便着手自己开发对应的插件.下面是我开发插件过程中的一个记录,会持续和大家分享. 分享一:创建Project右键菜单 1,按照项目向导一步一步创建一个Demo项目,就不再介绍了,可以参照这篇文章http://www.jb51.net/article/135535.htm 2,创建Action,在plugin配置文件中你会看到 <action id="FirstAction" class="

  • IntelliJ IDEA中ajax开发实现分页查询示例

    JavaEE三层架构实现ajax分页查询 开发环境: 系统 window10 IDE:IntelliJ IDEA2017.3.2 数据库:MySQL5.5 数据库连接工具: Navicat 浏览器:chrome 版本号 65.0.3325.181 第一步:代码实现之前期准备 在IDEA中开发前期配置的工作,网上的帖子很多,我 在这里就不再赘述.主要说三点 在服务器的配置中,红色框框的两项要选择update classes and resource ,选择了之后可以实现热部署. 要在此处填写项目的

  • Intellij IDEA插件开发入门详解

    现今的IDE尽管有如"洪水猛兽"般强大,但要知道再强大的IDE也没法提供给使用者想要的一切功能,所以IDE一般都提供有API接口供开发者自行扩展.下面以Intellij IDEA 12下的插件开发为例,来看一下如何进一步增强IDE以适应开发者的需求. 1.创建Plugin工程 如果Module SDK中没有可选的SDK,那么点击New新添加一个SDK,目录就选择Intellij的安装位置即可. 创建出的Plugin项目结构很简单,只是在META-INF下多了一个plugin.xml配置

  • IntelliJ IDEA 安装vue开发插件的方法

    一.导语 最近接触了下idea,虽然我对于各种"代码界的神器"没有多大感冒,一个eclipse或者myeclipse,一个Notepad++ .一个就可以把我征服,但还是蛮喜欢idea这个神器的,虽然,特别坑我的内存. 二.正文 vue在idea中运行,需要配置一定的环境,哦,先讲讲如何破解idea吧. 1.idea的安装 idea最好还是用2015版本的吧,不知道适不适合安卓那些开发,但是对于要开发vue的前端小朋友,还是用2015吧的好,解释不了其他版本哪里不好,但就是运行时各种乱

  • IDEA 开发多项目依赖的方法(图文)

    鉴于最近学习一个分布式项目的开发,讲一下关于使用IntelliJ IDEA基于Maven创建多模块项目的实际开发,可能有不合适的地方,但是项目是可以跑通的,也请有不足之处,都提出来,一起讨论下. 一. 项目工程目录 首先展示一下,最终整个项目的工程目录: 简单介绍一下目录结构: common-parent为所有项目的父项目,主要用来管理所有项目使用的jar包及其版本. common-utils为公共的工具类项目,继承父项目,它会被打成jar包供其它项目使用. taotao-manager为我们自

  • Intellij IDEA + Android SDK + Genymotion Emulator打造最佳Android开发环境

    一直使用Eclipse环境开发Android,也尝鲜使用过Android Studio去开发,各种IDE配合Android SDK及SDK原生的Android Emulator的个中滋味也许大家都有领略,Eclipse的超长启动时间似乎是在与Android Emulator这个超级大腕比看谁更姗姗来迟,Android Studio的大版本号从推出来到两年后的今天仍然一直游走在1之下,不的不说襁褓婴儿不知道什么时候能长大,不得不说大哥我真不敢用你. 本文则介绍Lorinnn在开发Android过程

  • IDEA中osgi的开发应用指南详解

    前言 最近一直在接触osgi的开发任务,了解到本部门都在使用IDEA作为开发工具,而只有本小组还在使用Eclipse.正好赶上版本发布之后的空闲期,因此想要将osgi插件的开发从Eclipse转至IDEA.搜了不少资料,但是均不够详细,经过几天的仔细摸索,终于成功移植了自己的项目,在此也分享给大家在IDEA上开发osgi,对于IDEA的使用操作过程. OSGI简介 OSGI的全称是Open Service Gateway Initiative,直译就是开放服务网关.最新的OSGI定义是The D

  • Go语言Mock使用基本指南详解

    当前的实践中问题 在项目之间依赖的时候我们往往可以通过mock一个接口的实现,以一种比较简洁.独立的方式,来进行测试.但是在mock使用的过程中,因为大家的风格不统一,而且很多使用minimal implement的方式来进行mock,这就导致了通过mock出的实现各个函数的返回值往往是静态的,就无法让caller根据返回值进行的一些复杂逻辑. 首先来举一个例子 package task type Task interface { Do(int) (string, error) } 通过mini

  • Python urllib库的使用指南详解

    目录 urlopen Request User-Agent 添加更多的Header信息 添加一个特定的header 随机添加/修改User-Agent 所谓网页抓取,就是把URL地址中指定的网络资源从网络流中读取出来,保存到本地. 在Python中有很多库可以用来抓取网页,我们先学习urllib. 在 python2 中,urllib 被分为urllib,urllib2等 urlopen 我们先来段代码: # urllib_request.py # 导入urllib.request 库 impo

  • 基于python中的TCP及UDP(详解)

    python中是通过套接字即socket来实现UDP及TCP通信的.有两种套接字面向连接的及无连接的,也就是TCP套接字及UDP套接字. TCP通信模型 创建TCP服务器 伪代码: ss = socket() # 创建服务器套接字 ss.bind() # 套接字与地址绑定 ss.listen() # 监听连接 inf_loop: # 服务器无限循环 cs = ss.accept() # 接受客户端连接 comm_loop: # 通信循环 cs.recv()/cs.send() # 对话(接收/发

  • Oracle中游标Cursor基本用法详解

    查询 SELECT语句用于从数据库中查询数据,当在PL/SQL中使用SELECT语句时,要与INTO子句一起使用,查询的 返回值被赋予INTO子句中的变量,变量的声明是在DELCARE中.SELECT INTO语法如下: SELECT [DISTICT|ALL]{*|column[,column,...]} INTO (variable[,variable,...] |record) FROM {table|(sub-query)}[alias] WHERE............ PL/SQL

  • JDBC中resutset接口操作实例详解

    本文主要向大家展示JDBC接口中resutset接口的用法实例,下面我们看看具体内容. 1. ResultSet细节1 功能:封锁结果集数据 操作:如何获得(取出)结果 package com.sjx.a; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; import org.junit.Test; //1. next方

  • AngularJS中filter的使用实例详解

    AngularJS中filter的使用实例详解 一.格式化数字为货币格式. <div>{{money|currency:"$"}}</div> <div>{{money|currency:"RMB"}}</div> script: app.controller("crl", function($scope, $filter) { $scope.money="4545"; });

  • python中模块的__all__属性详解

    python模块中的__all__属性,可用于模块导入时限制,如: from module import * 此时被导入模块若定义了__all__属性,则只有__all__内指定的属性.方法.类可被导入. 若没定义,则导入模块内的所有公有属性,方法和类 # kk.py class A(): def __init__(self,name,age): self.name=name self.age=age class B(): def __init__(self,name,id): self.nam

  • python编程之requests在网络请求中添加cookies参数方法详解

    哎,好久没有学习爬虫了,现在想要重新拾起来.发现之前学习爬虫有些粗糙,竟然连requests中添加cookies都没有掌握,惭愧.废话不宜多,直接上内容. 我们平时使用requests获取网络内容很简单,几行代码搞定了,例如: import requests res=requests.get("https://cloud.flyme.cn/browser/index.jsp") print res.content 你没有看错,真的只有三行代码.但是简单归简单,问题还是不少的. 首先,这

  • PHP 中魔术常量的实例详解

    PHP 中魔术常量的实例详解 本文介绍下,php编程中的魔术常量,掌握并灵活应用这些方法与常量,对于提高php的编程水平,有很大的帮助.有需要的朋友参考学习下. 魔术常量: namespace ns1; class Test { function __construct() { var_dump(__LINE__); var_dump(__FILE__); var_dump(__DIR__); var_dump(__FUNCTION__); var_dump(__CLASS__); var_du

随机推荐