【问题标题】:Order of loading jars装罐顺序
【发布时间】:2016-03-12 01:50:37
【问题描述】:

假设一个类路径上有两个不同库版本的 jar,例如

java -cp A-2.1.jar:A-2.2.jar ...

第一个和第二个jar中的包名和类名相同,但类实现不同。是否指定 root jvm 类加载器是否会在 A-2.2 之前尝试在 A-2.1 中查找类?

问题在于 AWS EMR 将 hadoop jar 添加到类路径中,并且它的一些依赖项属于旧版本。但是,我们的应用程序需要使用相同库的新版本,那么在类路径之前添加新版本的库就足够了,或者在这种情况下是否推荐使用阴影? http://docs.aws.amazon.com/ElasticMapReduce/latest/DeveloperGuide/emr-hadoop-config_hadoop-user-env.sh.html

【问题讨论】:

    标签: java hadoop classpath classloader emr


    【解决方案1】:

    来自Setting the Class Path 文档:

    您指定多个类路径条目的顺序是 重要的。 Java 解释器将在 目录按照它们在类路径变量中出现的顺序排列。

    也就是说,重写另一个库的依赖 JAR 总是有风险的,因为库提供者可能没有测试过这种组合,所以你要么需要他们保证,自己做测试,要么遮蔽/重新打包按照你的建议上课。

    【讨论】:

    • 另外,查看正在加载哪些类的一种方法是使用-version:class 选项到java
    • 这篇文章 (programcreek.com/2013/01/…) 展示了一个例子
    • @Brett Kail 提到的文档说“目录”,它是否也暗示直接文件路径?
    • 是的,任何文件路径都是一样的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-24
    • 1970-01-01
    • 2011-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-19
    相关资源
    最近更新 更多