使用脚本批量执行GOGO命令
2015-08-10 14:47
253 查看
FELIX框架自带了GOGO shell,提供命令行,用于OSGI框架和插件的操作。
可以使用source filename.tsl的命令,来批量执行编写在filename.tsl文件中的多个命令,方便了多个命令的重复执行。
尝试写了一个install.tsl,目的是在启动felix后,把我们自己开发的插件安装好,内容如下:
echo refresh local obr
repos refresh file:/C:/Users/MaxwellYu/.m2/repository/repository.xml
echo Deploying bundles: logtool/log4j
bundlelevel -i 2
frameworklevel 2
deploy -s com.ailk.common.log4j
deploy -s com.ailk.common.logtool
但是发现一个问题,脚本最后两行连续部署了两个插件,如果这样执行,只有第一个插件安装成功,执行到安装第二个插件时程序会报错IllegalStateException(framework state has changed,must resolve again)。
如果一次只deploy一个bundle,然后手动部署第二个或者执行另外一个tsl文件中的部署命令,则可以成功。
初步研究认为是因为这两个bundle都使用ipojo,在bundle启动使用ipojo实现依赖注入的时候,ipojo插件需要时间对使用依赖注入的类进行一些涉及状态变化的操作,这就导致了第一个bundle启动完成,但是并未完成IPOJO的依赖注入,而第二bundle就开始部署并启动,这样就产生状态错误。
实验了一下用tsl脚本连续部署启动一个ipojo插件和一个不带ipojo的插件,可以成功部署启动。
不知道有没有办法在gogo中延迟执行第二个命令。
把上面的脚本最后两行改写一下,解决了上面的问题:
deploy com.ailk.common.log4j
deploy com.ailk.common.logtool
echo start bundles: logtool/log4j
start 22 23
这个做法是仅仅是连续部署而不启动,然后再使用start命令启动,就没有上面的问题了。但是这个方法很不完美,因为这里启动的bundleid(22 23)是我预先知道的,在不同初始插件环境下,这个id是会变。也就是说,每次我们都需要根据具体环境,修改这个脚本后才能正常执行。
仔细看了一下相关命令的help信息,发现deploy也是可以同时对多个bundle执行的,如果deploy -s多个bundle,会不会ipojo启动问题呢,试一下,把上面的脚本改成:
deploy -s com.ailk.common.log4j com.ailk.common.logtool
清空缓存并执行,成功了!
看日志输出,用一条命令执行,具体的顺序是deploy A,deploy B,start A,Start B,这样就和上面的过程实际上是完全一样了,而且不需要预先知道bundleid,这样就完美解决了这个问题。
可以使用source filename.tsl的命令,来批量执行编写在filename.tsl文件中的多个命令,方便了多个命令的重复执行。
尝试写了一个install.tsl,目的是在启动felix后,把我们自己开发的插件安装好,内容如下:
echo refresh local obr
repos refresh file:/C:/Users/MaxwellYu/.m2/repository/repository.xml
echo Deploying bundles: logtool/log4j
bundlelevel -i 2
frameworklevel 2
deploy -s com.ailk.common.log4j
deploy -s com.ailk.common.logtool
但是发现一个问题,脚本最后两行连续部署了两个插件,如果这样执行,只有第一个插件安装成功,执行到安装第二个插件时程序会报错IllegalStateException(framework state has changed,must resolve again)。
如果一次只deploy一个bundle,然后手动部署第二个或者执行另外一个tsl文件中的部署命令,则可以成功。
初步研究认为是因为这两个bundle都使用ipojo,在bundle启动使用ipojo实现依赖注入的时候,ipojo插件需要时间对使用依赖注入的类进行一些涉及状态变化的操作,这就导致了第一个bundle启动完成,但是并未完成IPOJO的依赖注入,而第二bundle就开始部署并启动,这样就产生状态错误。
实验了一下用tsl脚本连续部署启动一个ipojo插件和一个不带ipojo的插件,可以成功部署启动。
不知道有没有办法在gogo中延迟执行第二个命令。
把上面的脚本最后两行改写一下,解决了上面的问题:
deploy com.ailk.common.log4j
deploy com.ailk.common.logtool
echo start bundles: logtool/log4j
start 22 23
这个做法是仅仅是连续部署而不启动,然后再使用start命令启动,就没有上面的问题了。但是这个方法很不完美,因为这里启动的bundleid(22 23)是我预先知道的,在不同初始插件环境下,这个id是会变。也就是说,每次我们都需要根据具体环境,修改这个脚本后才能正常执行。
仔细看了一下相关命令的help信息,发现deploy也是可以同时对多个bundle执行的,如果deploy -s多个bundle,会不会ipojo启动问题呢,试一下,把上面的脚本改成:
deploy -s com.ailk.common.log4j com.ailk.common.logtool
清空缓存并执行,成功了!
看日志输出,用一条命令执行,具体的顺序是deploy A,deploy B,start A,Start B,这样就和上面的过程实际上是完全一样了,而且不需要预先知道bundleid,这样就完美解决了这个问题。
相关文章推荐
- hdu 4722 Good Numbers( 数位dp入门)
- Google Gson 使用简介
- Go-下载网上图片
- Django访问量和页面点击数统计
- [学习笔记]Lingo超经典案例大全
- Django访问量和页面点击数统计
- Codeforces 567 B. Berland National Library
- good article
- HDU - 1824 Let's go home(2-SAT)
- 揭秘:Google到底是怎么赚钱的
- 设计师必看|我是怎么混进Google的
- gogs+jenkins的部署与开发
- Google高级搜索技巧
- Uva 11383 Golden Tiger Claw(KM算法原理应用)
- Google开源库-Volley的使用
- Django进阶
- UVA 11292 Dragon of Loowater
- Hexagon处理器的条件执行机制
- How to write a good tech blog
- OC学习 -- Category(类目)