首先看看我前几天的一篇blog

spring 与 osgi的第一个障碍

eclipse3.1, spring2.0.1,将spring.jar放到一个插件中,在另一个插件中去使用。 最简单的例子,在context.getBean的时候就报了一个异常:

Caused by: org.xml.sax.SAXParseException: cvc - elt. 1 : Cannot find the declaration of element  ' beans ' .

先是搜了一遍,没有发现很有帮助的内容。然后跟了一下,发现还是因为xsd的映射找不到。而造成这个问题的原因, 是在 spring.jar当中的META-INF/spring.schemas 这个找不到。

而这个找不到的最根本原因,是因为在eclipse当中,META-INF目录是不能够被其他插件找到的。也就是说,META-INF 目录是拥有spring.jar的那个插件所独占的,而其他插件就算依赖于这个插件,也是无法找到META-INF目录下的文件, 从而抛出这个异常。

解决问题的办法有几个,最简单的莫过于拷贝spring.schemas文件到需要的插件中,另一个办法是把spring的context 装载就放在spring.jar所在的插件中,或者改eclipse的代码。 :(

这个问题解决之后,紧接着第二个问题就是

Unable to locate NamespaceHandler  for  namespace http: // www.springframework.org/schema/aop

造成这个的原因和第一个类似,将spring.handlers拷贝到META-INF目录下就ok了。

上面是我以前的一个经验,今天仔细研究了一下,发现自己掉进了 经验主义的圈套。

这个经验是这样积累起来的:在刚开始尝试使用eclipse的时候,用的是3.0和3.1Mx系列,当时 不知道osgi是个什么东西 :$ 创建的几个插件,都没有创建osgi bundle manifest。也就是说, 只有plugin.xml,而没有META-INF/MANIFEST.MF文件的。但是在运行期,eclipse会自动的 从plugin.xml当中读取信息,生成临时的MANIFEST.MF文件,放在 runtime的 configuration/org.eclipse.osgi/manifests 目录下。而生成这个MANIFEST.MF文件,是 通过 PluginConverterImpl 这个类来实现的,在它的 isValidPackageName 方法中,所有的 META-INF或者以META-INF开头的目录,都不会被自动的export出去,从而在临时生成的MANIFEST.MF 文件中,永远不会有META-INF目录的export。

当时刚开始接触eclipse和osgi,根本不知道自己当时最佳的解决方案就是创建一个 bundle manifest, 然后在其中将META-INF目录export出来。而是通过盲目的修改代码来绕过这个弯。后来这个弯绕过去了, 留给我的经验就是:META-INF这个目录,是插件独享的,别的插件不允许访问的。

于是,在前几天,当spring.jar当中的几个META-INF目录下的文件访问不了时,我也认为这个经验有用, 差点就去改eclipse的代码了。幸好尝试了一下,把spring.jar所在的插件中,将META-INF目录共享出来, 居然就好了。仔细查了一下,发现屏蔽META-INF的代码只出现在PluginConverterImpl这个类当中。 回头想了想,终于明白自己这次是掉在经验主义的坑里面了。

经验主义害死人啊。唉。

主站: http://blogsite.3322.org/

posted on 2006-12-28 10:37 SimonLei 阅读(3345) 评论(2)  编辑  收藏
评论
  • # re: 经验主义害死人啊(spring与osgi结合当中遇到的问题)
    Alexis
    Posted @ 2011-12-27 18:39
    "把spring.jar所在的插件中,将META-INF目录共享出来, 居然就好了。" 这句我没明白,请问如何将META-INF目录共享出来?Export-Package不能导出META-INF目录啊。  回复  更多评论   
  • # re: 经验主义害死人啊(spring与osgi结合当中遇到的问题)
    SimonLei
    Posted @ 2011-12-28 13:31
    已经记不太清楚了,似乎是直接修改 MANIFEST.MF 或者 plugin.xml 文件  回复  更多评论   

只有注册用户登录后才能发表评论。


网站导航:
 

统计