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

标签 java jvm osgi classloader

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

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

如果模块 B 期望依赖类的不同接口(interface),我认为它会窒息。

最佳答案

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

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

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

关于java - 如何使用单独的类加载器并在同一个 JVM 中运行? (OSGI),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2456214/

相关文章:

Java 堆大小减少

java - 使用 'this' 作为不良编码习惯的显式构造函数调用?

intellij-idea - 在 IntelliJ Idea 中断开与远程 JVM 的连接

java - 如何在 OSGi 上使用 Jersey 解析 jersey.internal.RuntimeDelegateImpl

java - OSGi内存管理

java - 同步块(synchronized block)中的锁

intellij-idea - Intellij“在类中找不到主类”

java - Java 编译器和 JVM 是用哪种语言编写的?

java - BndTools,如何添加非 OSGi JAR?使用普通 JAR 会破坏整个项目。缺少要求的接线包

java - 使用java输入输出