【问题标题】:Spring OSGi classpath resource issueSpring OSGi 类路径资源问题
【发布时间】:2011-06-12 21:26:31
【问题描述】:

我正在尝试在 osgi (fuse esb) 中部署一个基于 spring 的包。在 spring 上下文中,我指的是资源文件夹内的一个 db4o 文件。根据我的理解,一个 Maven 项目将确保资源文件夹下的任何可用文件都将在项目类路径中可用。我将文件保存在 resources/META-INF/spring/repo/test.db4o 下。

这是 spring 上下文中的条目。


<bean id="objectContainer" class="org.springmodules.db4o.ObjectContainerFactoryBean">
    <property name="databaseFile" value="classpath:META-INF/spring/repo/test.db4o" />
</bean>

一旦我安装并尝试启动应用程序,我就会收到以下异常。


java.io.FileNotFoundException: OSGi resource[classpath:META-INF/spring/repo/test.db4o|bnd.id=258|bnd.sym=taxonomydaoimplbundle] cannot be resolved to absolute file path because it does not reside in the file system: bundle://258.0:1/META-INF/spring/repo/test.db4o

我尝试了不同的组合,但 OSGi 似乎无法识别此文件。任何指针将不胜感激。

-谢谢

【问题讨论】:

  • test.db4o 文件在哪个捆绑包中?您必须将它们放在同一个包中。
  • 它在同一个包中。
  • 你试过classpath:/META-INF/spring/repo/test.db4o(以斜杠开头的路径)
  • @Claszen ...我尝试了所有可能的组合。由于某种原因,它似乎没有起色。我什至在 pom.xml 中明确提到了 Include-Resource 下的文件。 {maven-resources}, {maven-dependencies}, repo/taxonomy.db4o=target/classes/repo/taxonomy.db4o
  • 你是把文件放到 src/**test**/resources (不会是打包的工件的一部分)还是 src/**main**/resources (将是打包的一部分神器)

标签: osgi fuseesb jbossfuse


【解决方案1】:

我终于找到了问题所在。 ObjectContainerFactoryBean 依靠 OSGiResourceBundle 将资源作为文件对象加载。尽管 OSGiResourceBundle 公开了一个名为 getFile() 的方法,但它在 OSGi 环境中无法按预期工作。它总是需要一个文件协议,而作为 URI 返回的资源有一个协议“包”。因此,抛出异常。解决方法是使用输入流或 getUrl。由于我没有 ObjectContainerFactoryBean 的源代码,我不得不扩展这个类以提供我自己的实现,将文件作为输入流加载。

【讨论】:

    猜你喜欢
    • 2021-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-08
    • 2011-12-15
    • 2011-04-22
    • 2015-11-09
    • 2016-06-15
    相关资源
    最近更新 更多