当两个相同的jar包含在类路径中时,JVM如何工作

Xia*_*Yao 15 java

这是我的同事的一个错误:有一个名为test.jar的jar,他修复了一个bug.然后他重新编译代码并构建了一个名为testnew.jar的新jar.问题是他将这两个jar放入classpath中的一个文件夹中.因此,当程序运行时,行为是一种混乱.我不知道发生了什么事,但在删除test.jar之后,everthing又恢复了.

所以我想知道JVM的行为是什么.它是否在它遇到的第一个jar中使用类文件?或者是其他东西?

谢谢.

mih*_*ihn 6

是的,默认情况下它使用第一个jar的类.这就是为什么你必须检查库目录中的重复项.对我和我的同事们来说,这么多次.

  • 我很确定这是在"未定义的行为"标题下.请记住,并非所有人都使用SUN JVM,即使他们不能依赖每个版本都是相同的!我相信官方唯一的事情是,一旦它找到了一个类(或没有找到它),即使你在运行时添加了jar文件,它也不会再次检查. (2认同)

T.J*_*der 6

据我所知,它没有定义.

Java有一个可插入的类加载器系统,因此知道将要发生什么的唯一方法是查看ClassLoader的文档,可能特别是ClassLoader#findClass方法,它没有为此定义行为,并查看相关的部分在的JLSJVM规范均未,似乎在这方面来指定的类加载器的约束.因此,除非您的Web容器使用的类加载器记录了该行为,否则您无法确定将加载哪个类.

赔率是第一个发现匹配类的二进制名称将是一个加载的,但有一个很大的行为,我们假设是这种情况,那就是规定和/或记录的行为之间的区别.