我读到 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/