类加载器行为:java -cp jar与在pom中添加maven依赖关系

时间:2018-08-10 04:55:42

标签: java maven classpath classloader

当我们使用_mm256_shuffle_epi8加载jar并在maven依赖项中添加jar时,类加载器如何确定jar的优先级?

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

我主要担心的是,我是否通过jar -classpath或maven依赖项中的top或maven依赖项中的bottom进行了添加。

1 个答案:

答案 0 :(得分:1)

在类路径中的订单:

由罐子的指定顺序指定。类路径上“较早”的jar优先于指定为“较晚”的jar。假设您在classpath中指定了2个jar:

 -cp jar1 jar2

现在,两个jar可能具有相同的包/类com.abc.Util.java。因此,在运行时,将选择jar1中的类,因为在类路径中的jar2之前指定了jar1。

更多信息in this已发布

在Maven中订购:

通过在低优先级jar上方的pom.xml中指定较高优先级jar,可以在maven中实现与上述相同的行为。我已经在maven 3.x上对此进行了测试,如果您看到“依赖项”标签,则

enter image description here

如果您在pom.xml中更改顺序,您会看到顺序将会更改

enter image description here

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

-cp和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之前的

enter image description here