为什么导入的类优先于bundle类?

Ily*_*nko 3 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)
• Imported packages
• Required  bundles
• The bundle's class path (private packages)
• Attached fragments
Run Code Online (Sandbox Code Playgroud)

我们假设:

  1. 一个bundle声明"import-package:a"
  2. 此捆绑包中有一个本地类aX
  3. 另一个包中有一个类aX

new aX()将从另一个bundle加载该类.

导入的类优先于bundle类的原因是什么?它只是java层次类加载策略的后续延续吗?

Ang*_*jpt 5

这实际上是OSGi的核心方面.

分享课程

整个导入/导出机制旨在让不同的bundle 在通信时使用相同的类.在这种情况下,同样意味着不仅二进制相等,而且由相同的类加载器加载(回想一下,每个bundle都有自己的类加载器).如果捆绑包自己的类比导入的类更受青睐,则捆绑包将无法"同意"使用哪个类的副本.

但为什么?

为什么你会有一个类的副本,你也打算导入?考虑一种你想要做一些日志记录的情况,所以你导入org.osgi.service.log,但它不是一个重要的方面,你可以愉快地运行没有LogService礼物.现在,

  • 如果你只导入包,你的包将无法解决,因此无法启动,并且
  • 如果您只包含该类,则永远不会使用其他bundle的LogService类,因此您无法使用该服务(这是同意的部分).

在这种情况下,您既可以导入又包含该类,因此您可以在任何一种情况下运行,在没有其他人拥有时使用您自己的副本,并在其他人的情况下共享副本.您甚至可以选择导出副本,然后让框架决定.

作为旁注,这正是您(几乎)总是导入导出内容的原因.