如何使用单独的类加载器并在同一个 JVM 中运行? (OSGI)

Posted

技术标签:

【中文标题】如何使用单独的类加载器并在同一个 JVM 中运行? (OSGI)【英文标题】:How to use separate class loaders and run in same JVM? (OSGI) 【发布时间】:2011-01-28 05:04:59 【问题描述】:

我读过 OSGI 对每个模块使用单独的类加载器,这允许模块使用不同版本的依赖项。同时在同一个 JVM 中运行所有模块。

这是如何工作的?如果模块 A 使用版本 #1 的依赖,而模块 B 使用版本 #2,如果模块 A 将依赖类的实例作为方法参数传递给模块 B,你会不会遇到麻烦?

如果模块 B 期待依赖类的不同接口,我认为它会阻塞。

【问题讨论】:

【参考方案1】:

你说得对,不一致的依赖关系会导致问题。 OSGi 通过计算这些依赖项的传递闭包并确保在解决时没有任何依赖项来避免这种情况。

这允许您在具有内部/隐藏私有依赖项的同时公开公共依赖项,因此,隐藏您的实现依赖项以避免这种情况。好消息是在 Bundle 解析时检查所有内容,而不是模糊运行时错误。

特别是在您的示例中,如果 A 和 B 使用不兼容的接口,并且 A 依赖于 B,则 A 将无法解析并出现依赖错误。所以它甚至不能开始传递一个不兼容的类型。

【讨论】:

以上是关于如何使用单独的类加载器并在同一个 JVM 中运行? (OSGI)的主要内容,如果未能解决你的问题,请参考以下文章

JVM类加载器

JVM类加载机制

JVM的类加载机制和运行过程

JVM java堆内存

tomcat类加载机制

tomcat类加载机制