您的位置:首页 > 编程语言 > Go语言

使用脚本批量执行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,这样就完美解决了这个问题。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: