Class 加载程序行为:java -cp jars 与在 pom 中添加 maven 依赖项

Class loader behavior : java -cp jars vs adding maven dependency in pom

当我们使用 -classpath 加载 jar 并在 maven 依赖项中添加 jar 时,class 加载器如何优先处理 jar?

maven如何加载jar?它是否遵循基于 pom.xml 中添加的依赖顺序的任何顺序?因为很少有罐子根据添加罐子的顺序(顶部或底部)表现不同。

我主要担心的是,如果我添加了 jar -class路径或 maven 依赖项中的顶部或 maven 依赖项中的底部,它的行为会有所不同。

类路径中的顺序:

是按照指定jar的顺序来指定的。 class 路径上的罐子 'earlier' 将优先于“稍后”指定的罐子。假设您在 classpath 中指定了 2 个罐子:

 -cp jar1 jar2

现在两个罐子可能具有相同的 package/class com.abc.Util.java。因此在运行时,jar1 中的 class 将被选中,因为 jar1 在 classpath 中的 jar2 之前指定。

更多信息 in this 所以 post

maven 中的顺序:

通过在 pom.xml 优先级较低的 jar 之上指定较高优先级的 jar,可以在 maven 中实现与上述相同的行为。我已经在 maven 3.x 上测试过了,如果你看到依赖选项卡,

您可以看到,如果您在 pom.xml

中更改顺序,顺序将会更改

总结:-classpath 选项和 Maven 中,首先指定的 jar 获胜。所以你的观察是正确的。

ORDER in case of -cp and maven: 如果你使用两者的组合,那么 -cp 选项将赢得第一优先.

还有一点关于 maven。因为,当您在 pom.xml 中指定依赖项时,它会自动带来它自己的依赖项(传递依赖项)。

假设您在 pom 中指定了依赖项 A,它带来了依赖项 X 版本 1.1。之后你在 pom 中定义依赖 B,它也需要依赖 X 但版本为 1.2。现在您认为哪个版本的 X 会出现?

即将到来的版本将取决于您首先指定的依赖项。如果先指定jarA,则X1.1,如果先指定jarB,则X1.2。

您可以在依赖层次选项卡中检查此行为,您会看到一些传递依赖项将被省略。例如:下面是一些其他 jar 在

之前会带来 commons-io 2.6