【问题标题】:Spring config to load resources within bundleSpring 配置以在包中加载资源
【发布时间】:2010-11-25 18:00:30
【问题描述】:

我有一个从旧版 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>

提前致谢。

【问题讨论】:

  • 你解决了吗?我在寻找文件协议的 ResoureceUtils 中遇到同样的错误。

标签: spring resources osgi


【解决方案1】:

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

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

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

有几个选项:

  1. 将 workflow.xml 放入包中,并将其放在 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 类路径中。这有点人为,因为您的捆绑软件不太可能在其他地方工作。

这些都有点(很多)hacky,所以你可能希望看看不同的方式来加载这个文件。不过我不熟悉 OsgiBundleResource。

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

【讨论】:

  • 感谢您的回复。该文件位于捆绑包类路径上的包中。我更新了包类路径以包含包含包的完整路径(最初只有 WEB-INF/classes 和嵌入式 jar 的路径),但无济于事,仍然没有找到。问题似乎出在 ResourceUtils 中的这一行: if (!URL_PROTOCOL_FILE.equals(resourceUrl.getProtocol())) 因为它正在比较文件与 bundleresource 是否相等。随后抛出 FileNotFoundException。
【解决方案2】:

伙计们,我遇到了类似的问题。所以我尝试了这个(更改了类路径 -> 文件)

它起作用了,虽然这似乎不是一个合乎逻辑的原因,因为该文件位于类路径上,而 Equinox 无法使用类路径找到它:但确实使用文件找到了该文件:

在找到任何合乎逻辑的原因之前,我们可以继续使用它,如果它有效的话。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-15
    • 1970-01-01
    • 1970-01-01
    • 2010-10-09
    • 2018-03-26
    • 2015-05-25
    相关资源
    最近更新 更多