我希望可以在 myModuleA 中使用 Guava-19 和在 myModuleB 中使用 guava-20,因为拼图模块有自己的类路径。
假设 myModuleA 使用 Iterators.emptyIterator(); - 在 guava-20 中被移除,myModuleB 使用新的静态方法 FluentIterable.of(); - 这在 guava-19 中不可用。不幸的是,我的测试是阴性的。在编译时,它看起来很好。与运行时相比,结果是 NoSuchMethodError。这意味着,类加载器上的第一个类决定了哪个类失败。
与底层耦合的封装?我为自己找到了一个理由。它不能被支持,因为传递依赖会和以前有同样的问题。如果在 ModuleA 和 ModuleB 的签名中发生了版本冲突的番石榴类依赖于它。应该使用哪个类?
但是为什么在整个互联网上我们都可以阅读“拼图 - 模块系统停止类路径地狱”?我们现在有多个具有相同问题的较小的“类路径相似”。这更像是一个不确定性而不是一个问题。