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
当我们使用 -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