【发布时间】:2012-09-27 15:59:39
【问题描述】:
我定义了一个带有声明式服务 (DS) 组件定义的 OSGi 包 (cluster_implementation),指定了一个导出的服务、一个激活方法和一个停用方法。
在 Activate 方法的主体中,我需要访问文件系统中不存在但捆绑在 OSGi 包本身中的一个文件。
在激活方法期间,使用java.lang.ClassLoader:getResourceAsStream 检索文件内容为InputStream。
这主要是可行的,但有一种情况是行不通的。在我的应用程序中,cluster_implementation 导出的服务可以通过服务注册表或声明式服务或 spring-dm 被其他包引用。该组件的激活策略是delayed,因此它会在第一次引用该服务时被激活。
现在,如果激活是因为来自声明性服务组件的引用,则文件内容可以正常读取,如果激活是因为服务需要 spring-dm 组件,那么资源的 InputStream是NULL!
现在我已经通过在组件属性中设置immediate="true" 使组件立即激活来解决问题,但是我的要求是:
- 是否允许在 DS 组件激活期间以 Stream 的形式获取资源的内容?
- 如果这是合法的,为什么通过 spring-dm 激活会导致资源作为 Stream 不可访问?顺便说一句,资源就在那里 - 如果我做
Bundle.findEntries我可以看到它!
我使用的 OSGi 框架是 Equinox 3.6。
【问题讨论】: