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
让我们假设:
导入类优先于捆绑类的原因是什么?这只是java分层类加载策略的后续延续吗?这实际上是OSGi的一个核心方面 分享课程 整个导入/导出机制旨在让不同的bundle在通信时使用相同的类。在本例中,“相同”不仅意味着二进制相等,而且意味着由相同的类装入器装入(回想一下,每个包都有自己的类装入器)。如果bundle自己的类比导入的类更受欢迎,那么bundle将无法“商定”使用类的哪个副本 但是为什么? 为什么您会有一个类的副本,您也打算导入它? 考虑一个你想做一些日志记录的情况,这样你就可以导入<代码> org。OSGI.Service。log < /COD>,但这不是一个重要的方面,你可以愉快地运行,而不用<代码>日志服务< /代码>。现在,
- 如果只导入包,包将无法解析,因此无法启动,并且
- 如果只包含该类,则永远不会使用另一个bundle的
类,因此无法使用该服务(这是约定部分)LogService
作为旁注,这正是您应该(几乎)始终导入导出内容的原因。这允许可选导入修改您的行为。正确。包也被视为一个单元,不能在类装入器之间拆分。因此,要么包装是进口的,完全由出口商提供,要么包装是捆绑包内部的。Require Bundle是不同的,它支持在异常情况下拆分包,在这种情况下,您没有选择。是的,我故意跳过了拆分包,因为问题并没有指向这个方向。但你是对的,这是一个特殊的考虑。