【问题标题】:Get InputStream of bundle already installed in OSGi runtime?获取已安装在 OSGi 运行时中的捆绑包的 InputStream?
【发布时间】:2014-12-05 17:27:45
【问题描述】:

我正在尝试创建安装在运行时的捆绑包的备份文件,以便我可以将其卸载,然后如果需要,可以从备份中重新安装。有谁知道如何处理已经安装在运行时的捆绑文件的位置?我想以一种无论 OSGi 容器如何都可以工作的方式来执行此操作(具体来说,我希望它可以在 Equinox 和 Felix 中工作)。理想情况下,这将是从Bundle 对象获得的信息(或从从Bundle 对象获得的对象的信息)。

编辑:简而言之,我正在安装每个包 (bundleContext.getBundles) 并尝试确定包的文件路径。

【问题讨论】:

    标签: java osgi apache-felix equinox


    【解决方案1】:

    你不能这样做。 OSGi 规范没有提供任何方法来获取已安装包的输入流。这主要是因为 OSGi 不要求包以 JAR 的形式出现,也不要求它们以任何存档格式存储。例如,OSGi 框架可以将包的条目存储在数据库中,然后从该数据库中查找请求的类和资源。因此,您会看到安装后无法保证捆绑包以 JAR 形式存在。

    【讨论】:

    • 我不喜欢这个答案,但这似乎是不幸的事实。
    【解决方案2】:

    使用 bundle.getLocation()。它将返回安装包的位置(如果可用)。无法保证您可以从那里加载捆绑包 jar,但这取决于您最初安装捆绑包的方式。

    【讨论】:

    • 看起来这适用于Equinox(至少在通过Eclipse运行我的容器时,我不确定从tycho-surefire插件运行它时行为是否相同,例如),但这对 Felix 不起作用,因为 Felix 将捆绑包安装在不同的位置。
    • 当然,捆绑包可能来自不同的位置,但您仍然可以从给定位置备份它们。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-10
    • 2018-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多