我读过OSGI每个模块使用单独的类加载器,允许模块使用不同版本的依赖项。同时在同一个JVM中运行所有模块。
这是如何工作的?如果模块A使用依赖关系的版本#1而模块B使用版本#2,如果模块A将依赖关系类的实例作为方法参数传递给模块B,则不会遇到麻烦吗?
如果期望与依赖类有不同的接口,我认为模块B会窒息。
答案 0 :(得分:5)
你是对的,不一致的依赖会导致问题。 OSGi通过计算这些依赖关系的传递闭包并确保在解析时没有关闭来避免这种情况。
这允许您在具有内部/隐藏私有依赖项时公开公共依赖项,因此,隐藏您的实现依赖项以避免这种情况。因此,好处是在Bundle解决时间检查而不是模糊的运行时错误。
特别是在您的示例中,如果A和B使用不兼容的接口,并且A依赖于B,则A将无法解决,并且出现依赖性错误。因此它甚至无法开始将其传递给不兼容的类型。