`
goowie
  • 浏览: 1206 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

OSGI开发实践--goowie的Modular Java阅读笔记 3-1

阅读更多
OSGI开发方面国内的书籍太贫乏,据说唯一的一本中文书是《OSGI》原理与最佳实践,看了过后的印象是,篇幅只有一半是实践,且停留在比较高的层次,讲得内容很好,但方式方法不是很实用。
最近看到一本英文书ModularJava,印象极佳,读后给组内同事做了一个培训,效果也不错,在此把阅读过程中的笔记分享在这里,希望对国内开发OSGI的朋友有帮助。
转载请引用出处: http://goowie.iteye.com/blog/645569


1.创建项目
pax命令参考 P52
pax-update更新版本
pax-create-project -g com.umpay -a ice -v 1.0.0-SNAPSHOT
pax-provision进行环境准备
修改/pom.xml ch3 P56

2.ch4 p60建立domain bundle
pax-create-bundle -p com.umpay.ice.domain -n com.umpay.ice.domain -g com.umpay -v 1.0.0-SNAPSHOT
pom.xml父子关系
osgi.bnd bnd工具用于自动产生bundle manifests
http://www.aqute.biz/Code/Bnd

3.mvn install产生eclipse project文件及target目录

4.编辑jarFile源码,mvn install编译
给domain的pom增加依赖:compass
<dependency>
<groupId>org.compass-project</groupId>
<artifactId>compass</artifactId>
<version>2.1.1</version>
</dependency>

在根运行pax-add-repository -i compass -u http://repo.compass-project.org
增加仓库
或直接编辑pom
<repository>
<id>compass-project.org</id>
<name>Compass</name>
<url>http://repo.compass-project.org</url>
</repository>

编译通过
根,运行pax-provision
试图启动domain
start 1
bundle 4 无export
第三方jar包的两种使用方式
##########################ice1.rar

1)embed jar方式
domain% pax-embed-jar -g org.compass-project -a compass -v 2.1.1
[ERROR] FATAL ERROR
[INFO] ------------------------------------------------------------------------
[INFO] Project already has a <dependency> which matches, use -Doverwrite or -o t
o replace it
domain% pax-embed-jar -g org.compass-project -a compass -v 2.1.1 -o
embed jar实际上做了两件事:
1. Embed-Dependency entry to osgi.bnd
Embed-Dependency: compass;groupId=org.compass-project;inline=false
2. 增加<dependency>到pom(fatal error的原因)
build的时候才产生

build/provision
遇到间接依赖的问题
Pax Construct instructs BND to generate a manifest that imports every package needed by a bundle (and, in this case, by any
libraries embedded within a bundle). That’s why Equinox couldn’t start the domain bundle—the embedded Compass library was demanding
packages that aren’t being provided by other bundles.

dwmj/domain/osgi-embedded.bnd
Import-Package: *;resolution:=optional
成功

2)embed的问题:
其他bundle也要引用compass,除非domain bundle export compass的package
引起奇怪的依赖
如果更新compass的版本,就需要替换domain
结论:embed compass牺牲了模块化特性的一部分


3)另外一种方法:wrap P75
依赖--embed(compas jar被包含到domain)--再把compass做成bundle
ice% pax-wrap-jar -g org.compass-project -a compass -v 2.1.1
建立新的compass bundle
provision,再次遇到间接依赖问题
compass的osgi.bnd中增加
Import-Package: *;resolution:=optional

5.建立提供service的bundle index
pax-create-bundle -n com.umpay.ice.index -p com.umpay.ice.index -g com.umpay -v 1.0.0-SNAPSHOT
在index bundle项目复制修改代码
增加依赖
index% pax-import-bundle -g com.umpay.ice -a org.compass-project.compass -v 2.1.1-001-SNAPSHOT
index% pax-import-bundle -g com.umpay -a domain -v 1.0.0-SNAPSHOT
domain,index的groupid最好也用com.umpay.ice
增加activator类,然后
修改index/osgi.bnd
Bundle-Activator: dwmj.index.internal.IndexServiceActivator

增加pax logging支持
ice% pax-import-bundle -g org.ops4j.pax.logging -a pax-logging-api -v 1.3.0
ice% pax-import-bundle -g org.ops4j.pax.logging -a pax-logging-service -v 1.3.0
compass% pax-embed-jar -g org.apache.lucene -a lucene-core -v 2.4.0
pax-logging-service一直是install状态,待查

测试osgibundle
pax-exam
mkdir -p bundle-tests/src/test/java
pom里面的groupID和artifactID必须和项目pom声明的一致
测试用例源码里面配置的部分也必须和项目pom声明保持一致
测试用例源码里面查找和添加的部分也必须互相保持一致
p100


3-1 结束
3
1
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics