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

标签 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

假设:

  1. 一个包声明“import-package: a”
  2. 这个bundle中有一个本地类a.X
  3. 在另一个 bundle 中有一个类 a.X

new a.X() 将从另一个包中加载类。

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

最佳答案

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

分享课

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

但是……为什么?

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

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

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

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

关于osgi - 为什么导入的类优先于捆绑类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11103876/

相关文章:

java - OSGI缓存目录

java - 5.0.0 以下版本的 Hibernate Karaf 功能

java - Scala/Java 子目录名称中带有点

java - 加载具有父子关系的类时出现 LinkageError

java - 公开远程接口(interface)或对象模型

java - 在 OSGI 4.2 包中使用 JAX-WS 时出现 NoClassDefFoundError

scala - 在 scala 2.10 中使用 typetag 获取类加载器

java - 在 Tomcat 中找不到 logback.xml(或其他资源)

mysql - 如何使用 OSGI 设置 MySQL 数据库连接?

java - 哪些类由 JVM 加载而不是类加载器?