当前位置: 首页 > 面试题库 >

在分离的Java平台模块中使用依赖关系的不同版本

林弘壮
2023-03-14
问题内容

我希望有可能在myModuleA中使用Guava-19,在myModuleB中使用guava-20, 因为拼图模块具有自己的类路径。

假设myModuleA使用Iterators.emptyIterator();
-已在guava-20中删除,而myModuleB使用新的静态方法FluentIterable.of();
-番石榴19中没有。不幸的是,我的测试是否定的。在编译时,看起来不错。与运行时相比,结果是NoSuchMethodError。意味着,类加载器上的第一个类决定哪个失败。

与底层耦合的封装?我找到了自己的理由。由于传递依赖项将具有与以前相同的问题,因此无法支持。如果模块A和模块B中的签名中发生了具有版本冲突的番石榴类,则取决于它。应该使用哪个类?

但是,为什么为什么在整个互联网上我们都能读到“拼图-模块系统停止了类路径”?现在,我们有多个较小的“相似类路径”具有相同的问题。它比问题更不确定。


问题答案:

首先进行更正:您说模块具有自己的类路径,这是不正确的。应用程序的类路径保持不变。与此并行的引入了模块路径,但实际上它的工作方式相同。特别是,所有应用程序类均由同一类加载器加载(至少默认情况下)。

所有应用程序类都只有一个类加载器,这也解释了为什么同一类不能有两个版本:整个类加载基础结构是基于一个完全限定的类名足以识别带有类加载器。

这也为多种版本的解决方案打开了道路。就像之前,您可以通过使用不同的类加载器来实现。模块系统执行此操作的本机方法是创建其他层(每个层都有自己的加载器)。

模块地狱?

那么模块系统是否将类路径hell替换为module hell?好吧,如果不创建新的类加载器,仍然不可能使用同一库的多个版本,因此,这个基本问题仍然存在。

另一方面,由于包拆分,现在至少在编译或启动时会出错。这样可以防止程序巧妙地执行错误操作,这也不是那么糟糕。



 类似资料:
  • 应用程序 SlidingMenu(源文件) SlidingMenu-Maps-Support(源文件) 这里有一个链接,看看我的意思。 这就是我得到的错误。 谢谢! 编辑1:不要紧!我又回到月食了!Android Studio还没有为真正的项目开发做好准备。

  • 问题内容: 我有一个简单的节点应用程序,它对github上另一个应用程序具有单一依赖性。使用可以很好地安装依赖项,但是当我尝试在其中安装某些东西时,它说不可用。例如,github应用程序将Mongoose安装为依赖项。我认为该父应用程序可以访问该模块,因为它位于子模块中: 结构看起来像这样: 我是否只需要在父级应用程序中同时包含猫鼬作为依赖项,还是可以通过子级方式访问该模块? 问题答案: 我是否只

  • 我无法使用ArchUnit制定以下测试: 我想确保某个包中的所有类只访问应用程序基包之外或某个子包内的类(“或”而不是“xor”)。 我得到的是: 问题是,或条件应该在onlyAccessClassesthat()中。如果一个类同时具有两种类型的访问权限,上述公式将失败,我希望这两种类型都有效。 我怎样才能实现我想要的?谢谢你在这方面的任何帮助...

  • 我有一个由maven管理依赖关系的多模块项目。 我在子模块“插件”中有多个插件。我想在不同的场景中添加不同的插件,但在每个场景中都需要一些插件。 “插件”模块中的pom.xml。 无论我运行“mvn包”还是“mvn包-P内部”,它只包含第二个模块作为依赖项。有人知道原因吗? 我的maven版本是3.3.9

  • 使用IntelliJ 2016.2. 使用Gradle 2.14.1 我尝试为Intellij中的添加一个模块依赖项到。没有骰子。我试着添加一个jar引用,没有骰子。 我认为我需要在build.gradle文件中添加一个依赖项,但不知道如何添加。我尝试了等。

  • 当运行命令(如 或 Maven无法解决我的一个模块对另一个模块的依赖关系。 [错误]无法在项目分析器上执行目标-app:无法解析项目的依赖项project_group:a:jar:0.1-snapshot:找不到项目project_group:b:jar:0.1-snapshot 项目结构如下: