【问题标题】:Modifying a Bundle Manifest at run time在运行时修改 Bundle Manifest
【发布时间】:2011-09-11 17:04:24
【问题描述】:

是否可以(如果可以,安全)在包的生命周期中随时修改 MANIFEST(即可能仅在 INSTALLED 和 RESOLVED 之间)。

我想问这个问题的另一种方式是,

在 INSTALLED 之后,但在 RESOLVED 之前,MANIFEST 是否已经被完全评估(即,进一步的更改将被忽略),现在更改为时已晚?

如果以上所有内容看起来都很荒谬.. 那么我的下一个问题是,有没有人认为有可能(没有讨厌的框架黑客)包装 MANIFEST 分辨率(即获取 META-INF/MANIFEST. MF from a bundle) 带有自定义实现。

背景:考虑一个不基于 OSGi 的现有模块化框架,我想通过提供部署现有“插件”的能力来简化向 OSGi 的迁移无需修改,并在运行时执行分析(“插件”定义良好,因此映射不应该是硬的),将它们转换为真正的 OSGi 包,使用 BND 运行时操作生成将用于代替可能不存在或非 osgi-bundle 清单。

希望这是有道理的(@njbartlett!)

【问题讨论】:

    标签: java runtime osgi bundles


    【解决方案1】:

    为什么不在安装/更新过程中定义一个改变清单的 URL 方案?当框架通过您的 URLConnection 访问包时,您可以返回一个带有变异清单的变异包。这基本上就是 web bundle 支持所做的事情,它也应该适合你。

    【讨论】:

    • 感谢 BJ 和 njb!这就是我的想法,在我回顾了一些处女座正在做的事情之后,我怀疑这可能是要走的路,但我想听听专业人士的意见。我讨厌深入到一个 impl 中,后来又听到“当你可以做到这一点时,你做了什么……”。您能否指出这个想法的最简洁的实现,以便我可以学习一些最佳实践?
    • 看看Pax url wrap,它用于在运行时将非OSGi maven jar 转换成bundle(即带有manifest.mf)。 github.com/ops4j/org.ops4j.pax.url/commits/master/pax-url-wrap
    【解决方案2】:

    不,你不能这样做。整个 JAR 文件(以及因此 MANIFEST.MF)在安装操作期间被读取。要更改该 JAR 中的任何内容,您必须更新捆绑包或卸载并重新安装。

    关于你真正想做的事情,为什么不能在将JAR作为一个bundle安装之前通过bnd进行分析和转换?

    【讨论】:

    • 能够在 OSGi 框架内部作为 (Framework|Bundle)Listener 实现这一点的灵活性很有吸引力。我知道我们以前可以做到。所以这将是必须的!
    • 其实,我并不是要换罐子……而是要试着把罐子的某些部分包起来,让它看起来不一样。
    • 虽然老实说,gemini-web/virgo 在打包 web 包时会做这样的事情。
    • 雷,看看BJ的回答。我忘记了这种可能性,这对我来说听起来很优雅。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多