【问题标题】:Extension bundle meaning in OSGi frameworkOSGi 框架中的扩展包含义
【发布时间】:2017-02-13 13:43:11
【问题描述】:

我正在开发一个基于 OSGi 的应用程序。在记录自己关于 OSGi 框架的特性时,我偶然发现了 extension bundle 的概念。引用 R4 规范 (OSGi R4):

扩展包可以提供框架的可选部分 实现或提供必须驻留在引导上的功能 类路径。这些包不能由正常提供 导入/导出机制。引导类路径扩展是必要的 因为某些包实现假定它们在 引导类路径或需要对所有客户端可用。一个 引导类路径扩展的示例是 java.sql 如 JSR 169

可能只是我很愚蠢,但我在理解这个概念时遇到了困难。我有几个问题:

  1. 据我了解,扩展包似乎在做org.osgi.framework.system.packages.extraorg.osgi.framework.bootdelegation(即com.sun.*sun.*)的相同 工作。我对吗?如果不是,它们之间有什么区别?

  2. 您能给我展示一个扩展包的真实用例场景吗?上面写着:“除非你使用扩展包,否则你做不到!” Here 有人已经尝试为扩展包提供示例,但(至少对我而言)似乎可以通过调整 org.osgi.framework.system.packages.extraorg.osgi.framework.bootdelegation 来获得相同的结果;

我知道已经有this SO answer,但对我来说它并没有完全切中要害。

感谢所有友好的回复!

【问题讨论】:

    标签: java osgi osgi-bundle


    【解决方案1】:

    扩展包可用于覆盖任何类,甚至是 java.lang 类。

    您可能希望在调用 System.gc() 时进行跟踪(例如,将堆栈跟踪写入日志文件)

    【讨论】:

    • 什么?有这么强大吗?你能给我看一个代码示例吗?而且,通过任何类,它是否还包括捆绑私有实现中的类?甚至是单例捆绑包?
    • @Koldar 是的,总是首先选择引导类路径。覆盖引导类路径中已有内容的唯一方法是将其添加为扩展。
    • 哇,它看起来真的很强大!但它不会破坏模块化吗?有人可能认为无法以任何方式访问实现,但通过扩展可以“戳他的鼻子”进入实现细节! (顺便说一句,请在您的回答中添加代码示例,我很乐意接受您的回答)
    • 扩展包不能覆盖java. 类。 ClassLoader.defineClass 在尝试定义 java. 类时无条件抛出,因此无法通过类加载器委托实现覆盖。只有-Xbootclasspath 可以覆盖java. 类。
    • @BrettKail 基本上是正确的。如果 java.* 类位于引导类路径中,扩展包只能替换它们,因此要支持带有 extension:=bootclasspath 的扩展包,框架实现必须找到一种方法将内容放在引导类路径中。它可能会也可能不会这样做,这取决于 Java 实现。请记住,-Xbootclasspath 是 Sun/Oracle JDK 和 OpenJDK 的非标准选项,不一定是其他 Java。
    猜你喜欢
    • 2013-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-11
    相关资源
    最近更新 更多