java - OSGi 包从另一个包访问 Spring 上下文文件

标签 java spring osgi apache-karaf apache-servicemix

我有一个作为多个 Spring 项目存在的现有应用程序。项目 A 的 Spring 上下文 XML 文件使用

导入 B 的 Spring 上下文 XML 文件
<import resource="classpath*:/META-INF/spring/BContext.xml" />

但是,我得到一个 FileNotFoundException。我假设这是由于项目 B 的 bundle 未公开资源这一事实造成的。我可以访问类,但不能访问文件。

在研究这个问题时,常见的评论是使用 OSGi 服务并注入(inject)服务,而不是尝试直接注入(inject) bean。但是,由于这是一个现有的应用程序,我想避免重新连接整个应用程序。

有没有办法告诉 OSGi 导出资源?我在 Karaf 上运行 ServiceMix。

最佳答案

它只是一个类路径资源,所以我假设添加一个适当的 Export-Package指令就可以了。不过,这绝对不是正确的做法。该上下文文件的路径表明,也许包含 BContext.xml 的项目已经设置为使用 Spring 动态模块。如果是这样,那么当您启动该包时,Spring ApplicationContext 将作为服务导出。在您的 OSGi 控制台中查找它。

编辑:回应评论中的讨论:

我自己从未尝试过,但理论上应该可以使用 Spring DM 的 osgi namespace制作bean reference to the OSGi service这是项目 B 的 ApplicationContext。然后,拥有一个作为 ApplicationContext 的 bean,您可以使用 normal Spring configuration使用 one 从中提取 bean of the getBean()方法。请注意,您可以使用 <constructor-arg ... />在 Spring 配置中为工厂方法指定参数,如图所示 toward the bottom of this examples section .

关于java - OSGi 包从另一个包访问 Spring 上下文文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6749334/

相关文章:

tomcat - ApacheFOP Tomcat/OSGI 错误 : java. lang.IllegalArgumentException:未知函数:gatherContextInfo - 使用图像创建 PDF 时

java - 如何使用 Java 获取 GWAN 服务器中的客户端 IP 地址?

java - 静态快捷方式android不出现

java - 如何使用 ByteBuddy 向现有实例添加字段?

java - 使用 maven 和 eclipse 与 OSGi 合并 2 个项目

java - 我可以在其他包发布的蓝图服务前面注入(inject)代理吗?

java - 当多个线程正在访问它时,在非静态方法中使用静态对象是否安全?

java - 在JAVA中的特定位置写入JSON文件

java - 如何在 Spring 3 中强制禁用 JSR-303 支持?

java - 如何从 Spring 中的 bean 中获取 bean 的 id?