【发布时间】:2021-02-13 19:35:01
【问题描述】:
我的应用程序中确实存在一些随机问题。而且我怀疑问题可能来自外部依赖项。让我详细说明。
我的应用程序正在使用带有请求类的外部 jar。在我的一个项目中,我添加了这个库的最新版本。但正如您可能怀疑的那样,我有更多的依赖项而不仅仅是一个。不幸的是,其中一个依赖项具有我已经添加的相同库,但版本较旧。所以此刻,当我触发mvn dependecy:tree 时,简化后的结果是这样的:
+-my_project
+-request_lib.jar:1.5.0
+-required_lib.jar:1.0.0
+-random.jar:1.0.0
+-request_lib.jar:1.2.0
//more libs
//more libs
如您所见,我需要的是最新版本的request_lib.jar:1.5.0,而此时没有人可以更新required_lib.jar:1.0.0,并在其中更改版本或请求。
Java 如何处理这种情况?假设在这个项目内部,我正在使用请求GetPlayerDataRequest,并且在最新版本中,有人为此添加了一个名为String playerTitle 的新字段。 Java 会一直使用最新版本的类吗?还是会混在一起?
因为据我所见,有时用户会出现致命错误,在日志中我们可以发现 setPlayerData 方法不存在。我知道我可以排除 pom 中的旧罐子。但是我想知道Java是如何处理的。
【问题讨论】:
-
您询问的是 Maven 和 Java,但这是两个不同的问题。 Java 本身很乐意允许(假设您不使用 Java 模块系统)具有相同包和类的多个库。它将简单地从在类路径中遇到的第一个库中加载类,并且该顺序将取决于类路径的指定和组合方式。另一方面,Maven 将解析为库的单个版本(假设它们都具有相同的 groupId 和 artifactId 并且版本不同),甚至在它开始发挥作用之前。你真正感兴趣的部分是什么?