Spring配置在bundle中加载资源

时间:2010-11-25 18:00:31

标签: spring resources osgi

我有一个我从遗留的Web应用程序创建的war osgi包。我遇到的问题是,在spring配置中有对类路径上的文件的引用(见下文),这些文件在将遗留战争部署到tomcat时很好,因为它们可以在thr文件系统上找到。但是,由于osgi没有文件系统的概念,因此无法找到这些文件,并且我得到一个未找到文件的异常。任何人都可以打电话给我,如果我可以继续以这种或类似的方式加载classpth资源。或者我必须使用org.springframework.osgi.io.OsgiBundleResource以编程方式加载它们。

<bean id="manager" class="com.xyz.abc.Manager" depends-on="workflowCache">
    <property name="configuration" value="classpath:com/xyz/abc/resource/workflow.xml"/>
</bean>

提前致谢。

2 个答案:

答案 0 :(得分:1)

这里的问题几乎肯定不是OSGi没有文件系统的概念,而是文件不再在类路径上了。

我假设当war在正常的tomcat中运行时,您引用的workflow.xml位于文件系统上,可通过tomcat类路径访问。 WAR的类加载器委托给父类加载器,后者能够访问workflow.xml文件。

在OSGi中,您的类路径由Bundle-Classpath和任何包导入或包要求定义。显然,无法通过任何这些机制访问此workflow.xml文件。

有几个选择:

  1. 将workflow.xml放入bundle中并将其放在Bundle-Classpath上。如果您希望在不重建WAB的情况下编辑文件,那就不太好了。
  2. 启动OSGi框架时,将workflow.xml文件添加到类路径中。然后作为框架启动选项将org.osgi.framework.bootdelegation设置为com.xyz.abc.resource。请注意,如果您这样做,您将无法再从OSGi框架中加载com.xyz.abc.resource,它将始终从框架父类加载器加载它们
  3. 如果您使用的是equinox,则可以通过在Bundle-Classpath中的文件路径前面添加external来将外部文件放在bundle类路径中。虽然你的捆绑不太可能在其他地方工作,但这有点人为。
  4. 这些都是一些(很多)hacky,所以你可能希望看一下加载这个文件的不同方式。我不熟悉OsgiBundleResource。

    如果您在OSGi中运行,您可能希望查看基于Spring DM的Blueprint Container规范。我知道有两个实现,Apache Aries和Eclipse Gemini。

答案 1 :(得分:1)

伙计们,我遇到了类似的问题。所以我尝试了这个(更改了classpath - &gt;文件)

    

虽然它似乎不是一个合乎逻辑的原因,但它有效,因为该文件位于类路径上,而且equinox无法使用classpath找到它:但确实使用file找到了该文件:

直到找到任何合理的理由,如果有效,我们可以继续使用它。