Osgi 为什么导入的类优先于捆绑类?

Osgi 为什么导入的类优先于捆绑类?,osgi,classloader,Osgi,Classloader,我知道规范对其进行了准确定义,但无法了解其原因: A class space is then all classes reachable from a given bundle’s class loader. Thus, a class space for a given bundle can contain classes from: • The parent class loader (normally java.* packages from the boot class path) •

我知道规范对其进行了准确定义,但无法了解其原因:

A class space is then all classes reachable from a given bundle’s class loader. 
Thus, a class space for a given bundle can contain classes from:
• The parent class loader (normally java.* packages from the boot class path)
• Imported packages
• Required  bundles
• The bundle's class path (private packages)
• Attached fragments
让我们假设:

  • 捆绑包声明“导入包:A”
  • 这个包中有一个本地类a.X
  • 在另一个包中有一个类a.X
  • 新的a.X()将从另一个bundle加载该类


    导入类优先于捆绑类的原因是什么?这只是java分层类加载策略的后续延续吗?

    这实际上是OSGi的一个核心方面

    分享课程 整个导入/导出机制旨在让不同的bundle在通信时使用相同的类。在本例中,“相同”不仅意味着二进制相等,而且意味着由相同的类装入器装入(回想一下,每个包都有自己的类装入器)。如果bundle自己的类比导入的类更受欢迎,那么bundle将无法“商定”使用类的哪个副本

    但是为什么? 为什么您会有一个类的副本,您也打算导入它? 考虑一个你想做一些日志记录的情况,这样你就可以导入<代码> org。OSGI.Service。log < /COD>,但这不是一个重要的方面,你可以愉快地运行,而不用<代码>日志服务< /代码>。现在,

    • 如果只导入包,包将无法解析,因此无法启动,并且
    • 如果只包含该类,则永远不会使用另一个bundle的
      LogService
      类,因此无法使用该服务(这是约定部分)
    在这种情况下,您可以导入并包含该类,这样您就可以在任何一种情况下运行,在没有其他人的情况下使用您自己的副本,如果其他人有,则共享一个副本。您甚至可以选择导出副本,并由框架决定


    作为旁注,这正是您应该(几乎)始终导入导出内容的原因。

    这允许可选导入修改您的行为。正确。包也被视为一个单元,不能在类装入器之间拆分。因此,要么包装是进口的,完全由出口商提供,要么包装是捆绑包内部的。Require Bundle是不同的,它支持在异常情况下拆分包,在这种情况下,您没有选择。是的,我故意跳过了拆分包,因为问题并没有指向这个方向。但你是对的,这是一个特殊的考虑。