什么是osgi ?osgi 是java模块化规范,翻译过来开放服务网关协议(Open Service Gateway Initiative) OSGI不是一个应用层面的框架,而是软件设计层面的规范
它能为我们带来什么?
1 可重用的组件积累和复用,功能解耦。(复用、内聚、藕合都能在osgi中很好地体现)
2 运行在特定的osgi容器中,启动速度快,。
3 OSGI 也能让你动态的增减服务,或者说动态的加载卸载类等资源(热插拔效果)。
osgi框架选择 我们使用felix创建一个demo
创建之前先了解几个概念
Bundle:其实就是一个带描述的jar文件。 osgi一个组件就是一个Bundle
来看一下Bundle的声明周期:
bundle需要install到osgi framework上,这个install只是让framework用一个classloader来装载bundle里的类和资源。
接着就是resolve,检查bundle需要“引用”的package是否可用,这个后续再详细介绍。
然后,bundle就要start,也就是运行activator里的start方法,方法运行完毕,即进入"ACTIVE"的状态,这时bundle就算正式可用了。
构建一个osgi的helloword
首先创建一个maven工程
在maven的pom文件中添加Maven Bundle Plugin
<plugins> <plugin> <groupId>org.apache.felix</groupId> <artifactId>maven-bundle-plugin</artifactId> <extensions>true</extensions> <configuration> <instructions> <Export-Package>org.foo.myproject.api</Export-Package> <Private-Package>org.foo.myproject.*</Private-Package> <Bundle-Activator>org.foo.myproject.impl1.Activator</Bundle-Activator> </instructions> </configuration> </plugin> </plugins>这段插件在felix官网可以找到。 此插件是必须的创建Bundle依赖他 还有就是需要添加一个osgi——core包的依赖 <dependency> <groupId>org.osgi</groupId> <artifactId>org.osgi.core</artifactId> <version>4.2.0</version> <scope>provided</scope> </dependency> 整理后的pom文件<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>cn.bean.demo</groupId> <artifactId>osgi</artifactId> <version>0.0.1-SNAPSHOT</version> <name>cn :: bean :: sun :: osgi_demo</name> <packaging>bundle</packaging> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <!-- osgi --> <dependency> <groupId>org.osgi</groupId> <artifactId>org.osgi.core</artifactId> <version>4.2.0</version></dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.felix</groupId> <artifactId>maven-bundle-plugin</artifactId> <extensions>true</extensions> <configuration> <instructions> <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName> <Bundle-Description>${project.description}</Bundle-Description> <Import-Package>org.osgi.framework</Import-Package> <Export-Package></Export-Package> <Embed-Transitive>true</Embed-Transitive> <Embed-Directory>dependency</Embed-Directory> <Bundle-Activator>cn.gzydt.sun.Activator</Bundle-Activator> </instructions> </configuration> </plugin> </plugins> </build></project> 现在还需实现编写一个BundleActivator接口的java类 可以实现当一个bundle启动或停止。import org.osgi.framework.BundleActivator;import org.osgi.framework.BundleContext; public class Activator implements BundleActivator { public void start(BundleContext context) throws Exception { System.out.println("cn.bean.demo 组件--> start...."); } public void stop(BundleContext context) throws Exception { System.out.println("cn.bean.demo 组件--> stop...."); } }当osgi容器加载这个组件的时候就会触发start方法,当组件被卸载或者更新的时候就会stop,在进行start(前提是在pom文件的maven-bundle插件中添加这个激活
<Bundle-Activator>cn.gzydt.sun.Activator</Bundle-Activator>
) 然后用maven命令 mvn compile :编译源代码 mvn package 生成一个bundle文件(pom文件中的package类型为bundle)然后把bundle丢在osgi运行环境的容器我这里用的apache-servicemix-6.0.3 官网最新的版本已经Apache ServiceMix 7.0.0.M1 我试了一下 感觉不是很好用,启动容器
时间: 2024-11-05 18:29:59