Eclipse Virgo OSGI Bundle开发环境搭建

2013年1月8日 1 条评论

  这几天在搞基于virgo的插件开发,也在整合一些基础包以及把以前自己写的代码转换成Bundle.网上对这方面的开发环境的搭建也有比较多的介绍,但根据实际使用情况来看不是很好用,这里把开发环境需要的工具,以及在开发过程中遇到的问题做一些说明介绍,所谓工欲善其事必先利其器,要有一个好的开发效率当然需要一个好用的开发环境。

   准备工具:
1.Eclipse Virgo Server
下载地址:http://www.eclipse.org/virgo/download/ 
下载最新版的就可以了.这里我选择的基于tomcat的版本..当然有需要的话可以选择其他版本。

2.Spring Tool Suite
不一定非要选择这个IDE,但是选择有要求,主要是Virgo Tool Eclipse开发插件的原因,具体要求看:http://wiki.eclipse.org/Virgo/Tooling
另外Spring Tool Suite按要求选择2.9.x别选高了,高版本的3.1用起是各种不爽,非常蛋疼。
另外根据开发插件的文档说明直接安装update site:http://download.eclipse.org/virgo/release/tooling
直接通过ide来安装就可以了,具体的可以看插件wiki.
安装之后添加一个Virgo的Server出来环境就差不多ok了。
创建项目:new project->other->virgo->bundle project.

3.问题
目前遇到的问题主要有一下几个:
1)  在virgo的repository/usr目录下加入的bundle项目中需要依赖他们,但还是找不到加入的包,这时可以尝试在server中刷新。server-config

2)通过上一步之后还是找不到bundle里的包,这个时候可以不管ide直接把jar引入到项目中让项目编译成功。
3)开发过程中发布到server中的bundle的版本号为0.0.0这个是由于编译出错导致的,原因是某个包没有加入到classpath.
4)在工作空间中的项目之间有依赖关系,而通过manifest.mf文件中import package还是找不到的情况,建议直接在Build Path中引用项目,总之首先保证项目能编译,然后再去考虑依赖关系.

通过这两天的开发感觉Bundle的开发有点烦,最主要一点就是依赖的问题,随时找不到依赖bundle或者package,以及开发工具有时候也会出现一些问题.另外就是怎么弄都有一堆红叉叉在项目上各种不爽,不过现在对bundle的开发也习惯自动屏蔽这些红色的叉叉了…..

分类: 高级民工 标签: ,

Eclipse Virgo加载OSGI Fragment的方法..

2013年1月7日 没有评论

  首先在OSGI中Fragment是没有自己的ClassLoader的,加载Fragment是需要其Fragment-Host申明的Bundle的ClassLoader去加载。而加载的机制是在Bundle加载之前Fragment已经被安装了,但是通过virgo的deploy大多数时候是没有办法保证fragment被加载了。这样的话只需要把fragment放到virgo的repository\usr目录下就可以了,具体关于这个目录的说明可以参考virgo的文档。Watched Repositories

分类: 高级民工 标签: ,

位掩码

2013年1月3日 没有评论

位掩码的作用主要是想通过与或运算快速的判断是否选择了某个选项,常见的如在J2SE的弹窗中常用到给窗口加按钮,某个参数里有类似于BTN_OK|BTN_CANCEL|BTN_NO这样的代码,这个就是使用了位掩码。
位掩码的原理比较简单按8bit的一个例子。
0 0 0 0  0 0 0 1   –>1
0 0 0 0  0 0 1 0   –>2
0 0 0 0  0 1 0 0   –>4
0 0 0 0  1 0 0 0   –>8

位掩码总是2的n次方,如果上面的值分别对应a1,a2,a3,a4.
那么a1|a2 –>0 0 0 0  0 0 1 1
这个参数被传入方法中后一个判断可能是这样

if( state&(a1|a2) ==1)  {//state&a1
//当state为a1或a2时。。to do something
//假设state=1则,00000001&00000011=1

}

 

通过与运算如果是0则未设置,如果是1则设置

上面的代码如果不用位掩码可能的代码会是这样

if( state==a1||state==a2 ){

}

位掩码的好处是在一定程度上减少代码量,并可以使得一个变量可以表示多种状态,只需通过与运算即可知道是否带有某个状态。

分类: 高级民工 标签:

插件式开发OSGI

2013年1月2日 1 条评论

  元旦这几天一直在思考以前的一个想法,想做一个整合了Spring+hibernate+struts+quartz等常用框架的可实现模块化插件式加载的系统,如果是针对某一单一功能而不考虑通用性扩展的话做出一个满足自己需求的框架还是相对简单的。
  为了减少配置,倾向于更多的采用注解,主要是在Spring这块,目前已经实现的可以看之前的两篇关于Spring和Hibernate动态加载的文章,不过在后续的实践中发现这些方法并不是很好。首先在Spring动态加载获取Bean的时候如果需要手动去获取某个Bean那么会存在线程安全问题,因为需要改变Spring的当前ClassLoader这肯定是会导致冲突的。Hibernate这块由于其本身类加载器以及SessionFactory不能动态加入类映射关系,所以考虑为每一个需要用到hibernate的模块单独创建一个SessionFactory,不过有两个问题,第一为每个模块都创建SessionFactory感觉比较浪费资源用同一个呢又没有好的方法;第二,一个模块中的Dao操作是没有问题的,但是存在跨模块的调用时Dao的操作将出问题,体现在事务方面,因为不同模块的SessionFactory不一样,所以会导致Session也不一样。
  OSGI这个目前应该说还是比较潮的技术,而且基于OSGI开发的成功软件也比较多,Eclipse是一个典型,Andorid底层也用到了OSGI的一些标准,现在比较流行的OSGI框架有Eclipse的Equinox和Apache的Felix,这两个属于OSGI标准的实现,但要自己去整合Spring和hibernate基于这些框架似乎也不是那么容易,另外Spring有个SpringDM的玩意儿这个东西整合了Spring使用了一下感觉还行但不是很完善,主要是配置麻烦文档偏少,另外SpringDM被捐给Eclipse之后有个新的版本叫Gemini Blueprint的东西,主体还是SpringDM,下载其提供的Server后即Virgo这个基于Equinox的OSGI实现并且整合了Spring的容器后感觉这个就是我想要的东西。

  最近的业余目标就是改造Virgo满足我的要求整合Hibernate和Quartz.并尽量减少无用的配置。

分类: 生活, 高级民工 标签:

在动态加载的JAR中使用Spring

2012年12月28日 没有评论

  目的是在动态加载的JAR中使用Spring的功能,即动态把JAR中的Class加载到Spring中管理,目前设计为使用Annation来管理配置Spring,动态加入的代码如下:

//加载jar
JARClassLoader loader = new JARClassLoader();
loader.loadJar("c:/x3.jar");
 
//设置当前线程的classLoader
Thread.currentThread().setContextClassLoader(loader);
 
//注册bean
ApplicationContext context = SystemCore.getApplicationContext();
ClassPathBeanDefinitionScanner scanner = new ClassPathBeanDefinitionScanner((DefaultListableBeanFactory)
context.getAutowireCapableBeanFactory());//使用Spring的注解自动扫描
//扫描jar中的包路径,使用通配符,另外在导出jar时必须选择add directory entries(即把目录也加入到jar中)
//否则spring扫描时将无法找到class
scanner.scan("com.test.moduleA.*");
 
//手动拿jar包里的bean的实例时因为存在ClassLoader的隔离虽然在开始设置了ContextClassLoader
//但是Spring默认getBean的时候并没有每次都去拿最新的ContextClassLoader使用,所以需要手动设置Bean的ClassLoader
//因为是手动设置的这里存在线程安全的问题...不知道有没有其他方法.
DefaultListableBeanFactory factory = (DefaultListableBeanFactory)context.getAutowireCapableBeanFactory();
		factory.setBeanClassLoader(loader);
 
System.out.println(context.getBean("questionDaoImpl"));
分类: 高级民工 标签: ,