OSGi起步(3):bundle之间的依赖

【OSGi】Require-Bundle与Import-Package Require-Bundle的作用 Require-Bundle的缺点 1、不知道究竟导入了哪些包 2、导出包的bundle重构后,会影响导入bundle 3、导致导入大量无用的包 为什么引入Require-Bundle? Require-Bundle的作用 Another kind of constraint that can be placed on a bundle i 阅读详情

-----------------------

原文出处:http://www.eclipsezone.com/eclipse/forums/t90544.html

原作者:Neil Bartlett 

----------------------

OSGi起步(3):bundle之间的依赖

 

在之前的教程中,我们知道bundle怎么启动和停止,以及它们如何与框架、以及相互间的生命周期进行交互。但是,bundle到底是什么呢?

 

bundle是模块。它使得我们可以把一个完整的项目分解成便于管理的模块。这些模块可以单独地加载入OSGi运行环境。问题是,不管我们是否愿意,模块间几乎总是存在依赖关系。过去简单的jar文件中,不存在一个可靠的方法来详细指明不同jar之间的依赖。(注意,manifest文件中的Class-Path属性并不是一个可靠的方法)。所以,我们永远无法保证,在运行期,某个jar中的代码是可以正常工作,还是会抛出一个ClassNotFoundException。

 

OSGi很巧妙地解决了这个问题。不过,与其直接告诉你是怎么回事,我们还是做个例子来展示一下吧。好,我们直接进入代码部分。不幸的是,由于我们之前一直在使用默认的package,而这样是没法用于展示的,所以我们将从一个合适的package入手。所以,我们先写一些简单的JavaBean风格的代码。复制以下代码到osgitut/movies/Movie.java:

package  osgitut.movies;
 

public   class  Movie  {

    
private final String title;

    
private final String director;

 

    
public Movie(String title, String director) {

        
this.title = title; this.director = director;

    }


    
public String getTitle() { return title; }

    
public String getDirector() { return director; }

}


 

现在,我们在同一个package中创建一个接口。创建文件 osgitut/movies/MovieFinder.java,复制以下内容:

package  osgitut.movies;

 

public   interface  MovieFinder  {

    Movie[] findAll();

}


 

接下来,我们把这两个文件做成一个bundle。是的,这个bundle出奇的小,并且几乎没有任何用途,不过在本例子中已经足够用了。跟以前一样,我们需要创建一个manifest文件。创建文件MoviesInterface.mf,复制以下内容:

Manifest-Version:  1.0

Bundle-ManifestVersion: 
2

Bundle-Name: Movies Interface

Bundle-SymbolicName: MoviesInterface

Bundle-Version: 
1.0.0

Export-Package: osgitut.movies
; version="1.0.0"

 
这里有一行我们之前没有遇到过的内容:Export-Package。这一行表示这个bundle将导出一个package osgitut.movies。在刚开始的时候,这看起来也许有些怪异,因为在旧的jar包中,所有的内容都是自动导出的。但是,难道你就从来没想要在一个package中放一些只在jar中可见的代码么?当然,你可以写一些private或者protected的类,但是,这样一样,它们对于jar中的其他package也是不可见的了。所以,OSGi引入了一个很有效的代码保护层:如果一个package没有被Export-Package明确导出,那么它们就只能在你的模块中被使用。

 

也许你还注意到了,我们给这个package添加了一个版本号。我们将在后边看到它的重要性。版本号并不是必须的,但是,如果没有,那么,OSGi将自动为你的package添加版本号” 0.0.0 ”。提供明确的版本号是一个比较好的习惯。

 

现在,我们来创建这个bundle:

javac osgitut / movies / Movie . java osgitut / movies / MovieFinder . java

jar -cfm MoviesInterface
. jar MoviesInterface . mf osgitut / movies / * . class

 

我们稍后再安装这个bundle。在这之前,我们再创建一个bundle,它将依赖于之前的bundle。我们将创建一个MovieFinder接口的具体实现。复制以下内容到文件 osgitut/movies/impl/BasicMovieFinderImpl.java:

package  osgitut.movies.impl;
 
import  osgitut.movies. * ;
 
public   class  BasicMovieFinderImpl  implements  MovieFinder  {

  
private static final Movie[] MOVIES = new Movie[] {

    
new Movie("The Godfather", "Francis Ford Coppola"),

    
new Movie("Spirited Away", "Hayao Miyazaki")

  }
; 

  
public Movie[] findAll() { return MOVIES; }

}


 
然后创建一个manifest文件 BasicMovieFinder.mf:

 

Manifest-Version:  1.0

Bundle-ManifestVersion: 
2

Bundle-Name: Basic Movie Finder

Bundle-SymbolicName: BasicMovieFinder

Bundle-Version: 
1.0.0

Import-Package: osgitut.movies
; version="[1.0.0,2.0.0)"

 

注意,我们导入了被另一个bundle导出的package osgitut.movies。同时我们在导入的时候添加了一个版本范围。框架将在运行时使用这个版本范围,检查导入的和被导出的package是否相匹配。OSGi对版本范围所使用的语法对于数学爱好者来说应该是很熟悉的:方括号表示包括,而圆括号表示不包括。这样,我们能很有效地表示出版本”1.x”。

 
同样的,为导入的package添加版本号也不是必须的,但是,这是一个很好的习惯。

 
好,我们编译并创建第二个bundle:
 

javac -classpath MoviesInterface . jar osgitut / movies / impl / BasicMovieFinderImpl . java

jar -cfm BasicMovieFinder
. jar BasicMovieFinder . mf osgitut / movies / impl / * . class 

现在,我们终于可以在Equinox上测试这些bundle了。这一次,我们不再详细给出所有的指令了,你应该可以自己处理:)

首先,安装BasicMovieFinder,输入ss,应该能看到这个bundle处于INSTALLED状态;

 

id      State       Bundle

0        ACTIVE      org . eclipse . osgi_3 . 3.0 . v20070208

4        INSTALLED   BasicMovieFinder_1 . 0.0

 
(作者注:你的bundle列表看起来可能会和我的不一样。一般来说,bundle的ID取决于你上一次安装和卸载了多少次HelloWorld J 你需要自己手动将文中的ID转换成你的ID)

 
INSTALLED
表示框架已经得到这个bundle了,但是还没有处理它的依赖性。强制Enquinox处理这些bundle的一个方法是调用refresh命令。所以,输入refresh 4后,你将看到:

 


id      State       Bundle

0        ACTIVE      org . eclipse . osgi_3 . 3.0 . v20070208

4        INSTALLED   BasicMovieFinder_1 . 0.0  

这个bundle还是不是RESOLVED。这是理所当然的,我们需要安装包含了Movie类和MovieFinder接口的“接口”bundle。为了确定这就是问题所在,输入diag 4来查看诊断信息:

 

file :BasicMovieFinder . jar [ 4 ]

  Missing imported package osgitut
. movies_[ 1.0 . 0 , 2.0 . 0 ).
 

看,这正是问题所在:我们无法导入package osgitut.movies,因为现在没有一个bundle导出这个package。现在,安装MovieInterface.jar bundle,并执行ss。新的列表应该是这样子:

id      State       Bundle

0        ACTIVE      org . eclipse . osgi_3 . 3.0 . v20070208

4        INSTALLED   BasicMovieFinder_1 . 0.0

5        INSTALLED   MoviesInterface_1 . 0.0  

最后的步骤是让Equinox再次处理BasicMovieFinder。输入refresh 4,将看到:

id      State       Bundle

0        ACTIVE      org . eclipse . osgi_3 . 3.0 . v20070208

4        RESOLVED    BasicMovieFinder_1 . 0.0

5        RESOLVED    MoviesInterface_1 . 0.0
 

好了,现在BasicMovieFinder是RESOLVED状态了。这是一个很重要的步骤,因为只有当一个bundle是RESOLVED状态,他才可以被启动,或者为其它bundle提供依赖。
 
注意,通常并不需要象这样手动处理。一般的,bundle会在需要时自动被处理。例如,本例中,尽管我们没有明确要求refresh,MovieInterface已经是RESOLVED状态了。

以上就是今天的内容。你可以去看看这篇文章“Chris Aniszczyk's excellent article on IBM developerWorks”(http://www-128.ibm.com/developerworks/opensource/library/os-ecl-osgiconsole/),看看通过Equinox控制台可以做哪些好玩的事情:)
 

下一次,我们将介绍OSGi 服务。
 

------------------- 重要的回帖 ----------------------

从Eclipse中启动OSGi平台的方法是,菜单”Run”->”Run…”,创建一个新的运行选项,在左边的列表中选择”OSGi Framework”。

这样,当你运行这个配置的时候,你将在Eclipse界面的控制台窗口中看到OSGi的控制台。

(译者:我的尝试出错了-___-!)

【OSGi】OSGi类加载流程 OSGi每个模块都有自己独立的classpath。如何实现这一点呢?是因为OSGi采取了不同的类加载机制: OSGi为每个bundle提供一个类加载器,该加载器能够看到bundle Jar文件内部的类和资源; 为了让bundle能互相协作,可以基于依赖关系,从一个bundle类加载器委托到另一个bundle类加载器。 阅读详情

相关推荐

浅析OSGI的bundle依赖

NULL 博文链接:https://salever.iteye.com/blog/1474694

OSGi 探秘系列 (4)- OSGi Bundle之依赖关系

在之前一篇我写的文章OSGi 探秘系列 (1)- 概述什么是OSGi框架 中,OSGi对Java平台的类加载机制的一个重要改进就是支持包级别的类导入和导出,而不仅仅在jar级别。本文将详细介绍OSGi这一改进机制,并介绍在OSGi中如何定义和解析Bundle之间的依赖关系。   在Java以及很多其它面向对象编程语言中,类之间的依赖关系都是在code中隐含的,当依赖关系不满足的时候,在

liubag的专栏 3066

Profinet从站开发初体验:用p-net开源库和树莓派快速搭建一个IO设备模拟器

本文详细介绍了如何使用p-net开源库和树莓派快速搭建Profinet从站IO设备模拟器。从开发环境准备、p-net源码编译到设备模拟器功能实现,提供了全流程实战指南,帮助开发者快速掌握工业通信协议开发技巧,适用于工业自动化领域的设备互联测试与验证。

weixin_30384217的博客 383

OSGi bundle之间通过反射调用方法

两个bundle之间不通过pom文件引入jar包方式调用另一个方法,通过反射的方式调用。 前提:被调用的方法的bundle需要配置  <Export-Package> 要提供的被引用的包</Export-Package> 调用方需要配置 <Import-Package>引入的包名,多个可通过,隔开</Import-Package> 如此便可以通...

卖辣椒也用券 1063

Qi标准下的充电协议及其记忆技巧

记忆无线充电协议中的。

m0_73991989的博客 1319

Spring Boot 构建war 部署到tomcat下无法在Nacos中注册服务

因此,当使用外部容器时,如此处的 Tomcat 来部署项目,AbstractAutoServiceRegistration 就不能监听到容器启动事件了,也就不会尝试向服务注册中心注册当前这个微服务,那么注册就失败了,并且也就没有异常信息了。自定义获取获取外部容器端口的方法, 然后监听应用启动事件,当应用被启动时,获取外部容器启动的端口号,然后将这个 port 设置到 NacosAutoServiceReigistration 中。在启动类同级目录,复制下面代码即可(不需要修改,直接构建war即可)

ttyy1112的专栏 2519

OSGi跨bundle调用,jaxb-impl异常

项目中使用osgi架构,在处理xml解析的实现中使用了jdk自带的Javax.xml.bind包。在单模块结构工程中都没有问题,但是引到插件化模式工程结构中,会提示找不到JaxbContext的工厂类而报错。

有一只柴犬的专栏 828

机器学习 -- 信用卡评分模型 -- 互联网金融风控

互联网金融主要分为资金类和资产类。资金类主要是理财产品,吸储,主要指标是用户转化、留存和复投,重在客户运营。资产类主要是贷款,包括消费金融和现金贷,小额贷款属于此类,主要目的是用户转化,还款和风险控制,信用卡评分模型就属于风险控制。 信用评分作用是对贷款申请人(信用卡申请人)做风险评估分值的方法。 信用卡评分是以大量数据的统计结果为基础,根据客户提供的资料和历史数据对客户的信用进行评估,评分卡模型...

XiaoMaEr66的博客 2417

OSGi起步(1):第一个Bundle

最近决定尝试翻译一些简单的文章。---------------------------------原文出处:http://www.eclipsezone.com/eclipse/forums/t90365.html原作者:Neil BartlettBlog http://neilbartlett.name/blog/osgi-articles/-----------------

瓶子的窝 1778

Seafile搭建以及onlyoffice在线办公

部署seafile docker-compose.yml 如下: 参考此篇文章 version: '2.0' services: db: image: mariadb:10.1 container_name: seafile-mysql environment: - MYSQL_ROOT_PASSWORD=db_dev # mysql root的密码,同时修改 seafile的DB_ROOT_PASSWD与这个一致 - MYSQL_LOG_CONSOLE

dwdcth的专栏 4656

HITECH海泰克触摸屏如何使用串口进行程序的下载和上传(拨码设置)以及离散量报警相关设定?

HITECH海泰克触摸屏如何使用串口进行程序的下载和上传(拨码设置)以及离散量报警相关设定? 首先,我们进行触摸屏一侧的设置,如下图所示: 触摸屏背后有拨码开关,当我们需要上传或下载程序时,需要将7#开关拨到上面; 左侧是DC24V电源接口; 下方是COM1、COM2和COM3通信端口,选择我们需要的端口后,插上通信电缆,拔掉24V电源,然后重新上电; 然后,屏幕会进入如下图所示界面,此时显示当前选择的端口为COM2,我们点击F2“config”,进入设置界面, 可以看到COM2端口是“Enabled”

Robot_PLC_HMI_Automation 3万+

OSGi Bundle Convert插件原理

本文首发于Infoq中文站(4.2):http://www.infoq.com/cn/articles/osgi-bundle-convert-plugin-principle   1.引言 普通的web应用要转换为OSGi应用,经常会遇到应用中依赖的Jar是非标准的情况,这些Jar可能只遵守了部分OSGi规范,甚至Manifest信息是空的。这种情况在OSGi 应用中根本无法使

不才的专栏 5512

量化交易 米筐 案例:市值因子选股策略

案例:市值因子的选股策略 1.结果 获得超额收益 年化 49% 2. 从股票中选择市值小的股票 选定财务数据筛选 进行每日调仓(多因子选股调仓 周期频率会小一些) 3. 代码 估值有关指标 # 在沪深300股票中,选出市值比较小的10只股票 # 在这个方法中编写任何的初始化逻辑。context对象将会在你的算法策略的任何方法之间做传递。 def init(context): # 沪深300组合 stocks = index_components('000300.XSHG') # 沪深3

廷益_飞鸟的博客 2311

【OSGi】2. bundle与模块化

模块层是OSGi框架的最基础层次,是OSGi其他部分的基础。 1、模块 定义: 一个从逻辑上封装实现类的集合,一个基于实现类子集的可选公共API,一个对外部代码依赖关系的集合。 package是Java提供的一种内建的模块化方式,但它有一些限制:http://blog.youkuaiyun.com/vking_wang/article/details/9735395 以上讨论的都是“

Alpha's 学习笔记 9005

Openclaw错误分析与解决方案之:Agent couldn’t generate a response.

Openclaw错误分析与解决方案之:Agent couldn't generate a response. Note: some tool actions may have already been executed — please verify before retrying.

多媒体编程、网络编程、系统编程、网络安全编程、驱动编程 1315

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

OSGi依赖性管理:Bundle访问域

OSGi依赖性管理:Bundle访问域 OSGi依赖性管理 OSGi允许您把您的应用程序分成多个模块,并能管理这些模块之间的依赖性。为了达到这个目的,它引入了Bundle访问域的概念。Bundle中类的缺省访问范围只对本Bundle内部可见,但对其它任何Bundle都是不可见的;在Bundle内部,类的可访问性遵循Java语言的一般规范。那么,您如果想要从一个Bundle中

eddle的专栏 901

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

OSGI BUNDLE

<br />开发一个简单的Hello World的OSGi Bundle(OSGi绑定包)<br />在OSGi中,软件是以Bundle的形式发布的。一个Bundle由Java类和其它资源构成,它可为其它的Bundle提供服务,也可以导入其 它Bundle中的Java包;同时,OSGi的Bundle也可以为其所在的设备提供一些功能。Eclipse为开发OSGiBundle提供了优秀的 支持,它不仅提供了向导来创建OSGi Bundle,而且还提供了内嵌的Equinox容器,您可以使用该容器执行和调试

码龙008 1113

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

OSGI框架下,bundle的两种启动方式

什么是Bundle? 如果有人问你,什么是osgi?其最大特点是什么?你只要回到"模块化开发体系",足矣。要是你能说出来java9的模块化开发体系并与之对比,那就说明你是专业的。 既然是模块化开发体系。那么osgi中的模块就是bundle,bundle是osgi中的最基本单位。 osgi中的bundle是jar文件格式规范基础上扩展出来的,一个符合osgi规范的bundle首先必须是一个符合

huakai_sun的博客 8214

(续)浅析OSGI的bundle依赖

From: (续)浅析OSGI的bundle依赖 上一篇文章,我们谈到了基础的bundle依赖关系,以及当依赖的bundle出现问题的时候的情况。 这里看一个更常见的情况,当依赖的多个插件同时Export了相同的package的时候,bundle如何处理呢? 先预测一下: 据依赖中的顺序来的,优先使用顺序靠前的bundle中的package 还是简单的搭建一个场景测试一下。 测试环

Seven's Rainbow Paradise 754

[整理] OSGI与Eclipse3

本文摘自: http://blog.oicp.net/?play=reply&id=79        OSGi,我真正关注到这个词汇是在上周的Bea User Group交流会上,一个台湾人做了相关演讲,实际上OSGi只是一个商业规范,没想到被Eclipse应用。         Eclipse3.0平台与Eclipse2.1平台的一个重要的区别就是,Eclipse3.0平台建立在一个Java框

掌门日记 6872

java 启动 osgi_OSGi开发起步

OSGi开发起步(Getting Started with OSGi)-1第一个OSGi模块原文出自:http://neilbartlett.name/blog/osgi-articles/- Getting Started with OSGihttp://hi.baidu.com/tinawhisper/home本文系翻译文章,但并未严格按照原文翻译。1. 第一个OSGi模块本文期望展示OS...

weixin_42334285的博客 928

在Eclipse中开发OSGi Bundle

Eclipse为开发OSGI Bundle提供了良好的支持,它不仅提供向导来创建OSGi Bundle,而且还提供了内嵌的OSGi框架实现(即Equinox容器),可以使用该容器执行和调试Bundle。从本质上说,每一个Eclipse插件都是一个OSGi Bundle,只不过这个OSGi Bundle增加了一些Eclipse专用的代码而已。下面通过具体的例子来介绍如何用Eclipse来开发OSGi...

程序员的天堂 742

将普通jar文件打包成osgi bundle的方法

  最近更新列表 1.IBM的aix中安装jdk(7月21更新)2.Linux(CentOS)中安装jdk (7月21更新)3.Linux(CentOS)安装weblogic (7月22更新)4.Aix系统中安装webLogic (7月22更新)5.IBM实体机aix中创建weblogic域 (7月23更新)6.linux中通过VNC创建weblogic域 (7月23更新)7.在RedHa...

zl19861225的专栏 1147

利用 Eclipse 开发基于 OSGi 的 Bundle 应用[摘]

开放服务网关协议 (Open Services Gateway Initiative),简称 OSGi,为网络服务定义了一个标准的、面向服务的计算环境,为用户提供了开放的、面向服务组件的、易于部署的编程模型,这个编程模型允许用户将定义好的接口规范绑定到 OSGi 运行环境中的特定Service,在构件 SOA 面向服务为中心的企业应用的过程中,OSGi 技术正发挥越来越重要的作用。在本文中,将介绍

SQ 1033
上一篇: packages exported from a fragment are not visible at build time
下一篇: OSGi 起步(4): 注册服务
devonzzb
博客等级 码龄25年 7粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值