最近在使用virgo进行开发基本osgi的项目,在环境搭建过程中报得最多的就是异常就是以"An Import-Package could not be resolved"开头的,以自己的理解和实际遇到的问题来看,引起些类异常的原因有二:
第一:环境中引入了不同bundle,名称不一样但是在多个bundle组件中的MANIFEST.MF中的Bundle-SymbolicName的名称一样,当然这种异常会容易找到;
第二:多数为这种情况,就是bundle之间相互引用的包的版本不一样造成.
A.好的情况下能下载到相互兼容的包
B.根据找不到兼容的包.重点来说下这个,项目中报异常为:
An Import-Package could not be resolved. Caused by missing constraint in bundle <EAP_Framework_1.0.0>
constraint: <Import-Package: org.hibernate.loader.collection; version="0.0.0">
constrained to bundle <com.springsource.org.hibernate> constrained bundle version range "[3.3.1.GA,3.3.1.GA]"
An Import-Package could not be resolved. Caused by missing constraint in bundle <com.springsource.org.hibernate_3.3.1.GA>
constraint: <Import-Package: org.slf4j; version="[1.5.2,1.6.0)">
以上为两个相同类型的异常,导致的结果是:
组件<EAP_Framework_1.0.0>和组件<com.springsource.org.hibernate>都不能被加载
原因1:组件<EAP_Framework_1.0.0>不能加载是由于此组件中依赖的组件 org.hibernate.loader.collection包找不到,而这个包是由组件 <com.springsource.org.hibernate>来提供的,也就是说依赖的组件 <com.springsource.org.hibernate>肯定有问题
原因2:组件 <com.springsource.org.hibernate_3.3.1.GA>不能加载(启动)是由于在此组件所导入的包org.slf4j没有成功找到,而且在本组件中所要求的org.slf4j包的版在1.5.2至1.6.0之间才可以.
由上面两个原因可知,异常2是导致异常1的原因,也就是说解决了异常2,所就解决了异常1.组件1没有加载成功就是由于组件2没有加载成功,而组件2没有加载成功是由于找不到合适版本的org.slf4j包,
所以<com.springsource.org.hibernate_3.3.1.GA>组件的要求应该找到版在1.5.2至1.6.0之间的org.slf4j的组件或包,回头来看看
你的virgo-tomcat-server服务器目录\repository\的ext和usr两个目录中有没有合适的包包含org.slf4j的组件(找不到或版不在1.5.2至1.6.0之间),我的这两个目录中都有,但版本都不对为:
com.springsource.slf4j.api-1.5.0.jar和com.springsource.slf4j.api-1.6.1.jar,(一般会以下图方式来下载)
我下载到的两个版本都不符合[1.5.2-1.6.0]的要求,因为一个为1.5.0,一个为1.6.1的,所以老是报错,因为当时也没有找到合适slf4j的bundle版本 ,这个异常折腾了我一个下午及晚上4个小时的时间,后来在同事的帮助下,以解决的!我觉得他是聪明如下:
思路如下:错误的最基本原因是com.springsource.org.hibernate-3.3.1.GA.jar这个bundle中的MANIFEST.MF引用的org.slf4j的包要求的版本为[1.5.2-1.6.0]之间,而virgo-tomcat-server-3.0.3.RELEASE\repository\目录中的ext和usr目录中的关于slf4j的组件包的版本都不在这个范围之内,所以不符合要求才报的异常.
解决方法:修改com.springsource.org.hibernate-3.3.1.GA.jar这个bundle中的MANIFEST.MF中关于org.slf4j的要求范围如下图所示:
应该是会解决这个问题的,帖子有点儿啰嗦,但总起看不懂的好点吧,些贴为原创,转载请注明出处!