【问题标题】:Class loader behavior : java -cp jars vs adding maven dependency in pom类加载器行为:java -cp jars 与在 pom 中添加 maven 依赖项
【发布时间】:2018-08-10 14:25:51
【问题描述】:

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

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

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

【问题讨论】:

    标签: java maven classpath classloader


    【解决方案1】:

    类路径中的顺序:

    它由指定jar的顺序指定。类路径上“较早”的 jar 将优先于“稍后”指定的 jar。假设您在类路径中指定 2 个 jar:

     -cp jar1 jar2
    

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

    更多信息in thisSO 发布

    在 maven 中排序:

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

    你可以看到,如果你在 pom.xml 中改变顺序,顺序就会改变

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

    -cp 和 maven 组合时的 ORDER:如果您使用两者的组合,则 -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

    【讨论】:

    • 我认为通过“java -cp”添加将优先于添加pom,是否正确?
    • 如果您将两者结合起来,那么可以。感谢您提出这个问题,我更新了我的答案
    • 哪个是好的做法,将其添加到 pom 顶部或通过“java -cp”同时结合两者。
    • 在 pom 中定义应该是第一要务,因为当你分享 pom 时,其他开发者也可以得到相同的行为,否则你需要特别告诉大家记住通过@放入 jar 987654333@。使用 pom,您只需指定一次订单即可完成。
    • 我正在研究 java 迁移部分,还没有尝试过。完成后,我会检查并接受您的回答!
    猜你喜欢
    • 1970-01-01
    • 2011-06-25
    • 2013-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多