版权声明:可以任意转载,转载时请标明文章原始出处-ScriptShi
网上的 osgi 的资料相对比较少,且复制性很差,照着执行了几个博客都不可以。但是我这里的可复制性为 100%!大部分都是算原创的。
osgi 是 java 的动态模块化运行技术,目前开源的 osgi 实现有很多,这里我们采用 apache 的 felix 来进行实现。
主要完成了直接使用 maven 来开发 osgi,而不是 idea,idea 写出来的 bundle 在运维部署的可行性太差了,所以我们把 maven 做 osgi 的坑走一遍。
代码
https://github.com/xjtushilei/osgi-demo
需要注意的地方,我在代码文件(主要是配置文件)的 TODO
有说明
实验环境
Apache Maven 3.5.2 (138edd61fd100ec658bfa2d307c43b76940a5d7d; 2017-10-18T15:58:13+08:00)
Maven home: C:\Users\script\apache-maven-3.5.2\bin\..
Java version: 1.8.0_144, vendor: Oracle Corporation
Java home: C:\Program Files (x86)\Java\jdk1.8.0_144\jre
Default locale: zh_CN, platform encoding: GBK
OS name: "windows 10", version: "10.0", arch: "x86", family: "windows"
模块说明
felix-framework-6.0.0
Apache Felix 是 Apache 软件基金会赞助的一个 OSGI 容器,这里下载的是官方的 felixhelloworld
是纯粹的一个 boudle,没使用第三方包helloworlduseotherjar
使用了第三方包 lang3
运行过程
linux 与 windows 的反斜杠方向不一样自行调整
打包 bundle
启动 osgi 容器
# 在工程的根目录下:
cd felix
# 一定要在felix目录下才能执行成功,不知道felix这个包什么目的!
java -jar \bin\felix.jar
结果如下:
____________________________
Welcome to Apache Felix Gogo
g!
安装 与 运行 bundle
install ../hello-world/target/hello-world-1.0.jar
install ../hello-world-use-other-jar/target/hello-world-use-other-jar-1.0.jar
# 显示目前有哪些boudle
lb
lb 结果如下:
START LEVEL 1
ID|State |Level|Name
0|Active | 0|System Bundle (6.0.0)|6.0.0
1|Active | 1|jansi (1.17.1)|1.17.1
2|Active | 1|JLine Bundle (3.7.0)|3.7.0
3|Active | 1|Apache Felix Bundle Repository (2.0.10)|2.0.10
4|Active | 1|Apache Felix Gogo Command (1.0.2)|1.0.2
5|Active | 1|Apache Felix Gogo JLine Shell (1.1.0)|1.1.0
6|Active | 1|Apache Felix Gogo Runtime (1.1.0)|1.1.0
10|Installed | 1|hello-world (1.0.0)|1.0.0
11|Installed | 1|hello-world-use-other-jar (1.0.0)|1.0.0
可以看到我们安装了两个 bundle,接下来启动我们的 bundle
start 10
# Hello World Bundle started!
start 11
# Hello World (UseOtherJar) Bundle started!
# 106
停止运行我们的 bundle
stop 10
# Hello World Bundle stop!
stop 11
# Hello World锛堜娇鐢ㄧ涓夋柟鍖咃級 Bundle stop!
# 1.600441E38
可能是 windows 的 cmd 里是 gbk 编码,汉语在 console 里发生了乱码。无关紧要。
其他命令
现有的名字空间有三种:
- felix - 关于 felix 框架的核心命令,比如列出所有 bundle,安装/卸载 bundle 等等
- gogo - 包含 grep,cat,echo 这类的指令,并且 gogo 是个 Felix 的子项目,他是参照 RFC 147 来实现的,这个标准定义了 OSGi 环境的 shell 应该是怎么样的。
- obr - 关于 OSGi Bundle Repository 功能的指令
命令有三个大类,目前我们暂时只使用了其中一种 felix
,我们输入 help
可以看到所有的命令
help
查看有哪些命令
uninstall
取消安装 bundle
exit 1
退出 osgi 容器
lb
显示目前有哪些 bundle
ss
显示已安装的 bundles 的状态信息,信息包括 bundle ID,短名,状态等等。
start
启动一个 bundle
stop
关闭一个 bundle
update
载入一个新的 JAR 文件更新一个 bundle
install
安装一个新的 bundle 到容器中
uninstall
卸载一个已在容器中的 bundle
MANIFEST.MF 说明
Bundle-Name
给 bundle 定义一个短名,方便人员阅读
Bundle-SymbolicName
给 bundle 定义一个唯一的非局部名。方便分辨。
Bundle-Activator
声明在 start 和 stop 事件发生时会被通知的监听类的名字。
Import-Package
定义 bundle 的导入包。
解决 jar 冲突的示例代码
见分支
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于