"版权声明:可以任意转载,转载时请标明文章[链接] 网上的 osgi 的资料相对比较少,且复制性很差,照着执行了几个博客都不可以。但是我这里的可复制性为 100%!大部分都是算原创的。 osgi 是 java 的动态模块化运行技术,目前开源的 osgi 实现有很多,这里我们采用 apache 的 felix 来进行实现。 .."

初探 osgi

本贴最后更新于 254 天前,其中的信息可能已经事过境迁

版权声明:可以任意转载,转载时请标明文章原始出处 -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" 

模块说明

运行过程

linux 与 windows 的反斜杠方向不一样自行调整

打包 bundle

# 在工程的根目录下:

# 打包模块 1
cd hello-world
mvn package
# 打包模块 2
cd ..
cd hello-world-use-other-jar
mvn package 

启动 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, 我们输入help可以看到所有的命令

MANIFEST.MF 说明

解决 jar 冲突的示例代码

见分支

https://github.com/xjtushilei/osgi-demo/tree/communication

  • OSGi
    2 引用 • 2 回帖
  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    2147 引用 • 7240 回帖 • 1059 关注
  • Maven

    Maven 是基于项目对象模型(POM)、通过一小段描述信息来管理项目的构建、报告和文档的软件项目管理工具。

    135 引用 • 291 回帖 • 777 关注
感谢    关注    收藏    赞同    反对    举报    分享
2 回帖    
请输入回帖内容...
  • xjtushilei      

    好久没贴链接,突然发现帖子实现了 github 工程自动识别呀 ~ 看起来不错 @Vanessa

    感谢    赞同    反对    举报    分享       回复
  • Vanessa      

    我和 D 都喜欢叫你周杰伦了。。。。

    感谢    赞同    反对    举报    分享       回复