JVM 将加载哪个 jar?

Which of the jar will be loaded in the JVM?

所以假设我在 ext 文件夹中有一个不同版本的 jar,另一个版本在 classpath 中。将加载哪个版本的 jar?根据我的研究,由于 extension classloaderclasspath 之前运行,因此将加载扩展中的库。或者它会被 classpath 覆盖。如果版本相同会怎样?

它将使用它可以在 ClassLoader 的层次结构中找到的第一个 class。

因此它将尝试从下一个 ClassLoader 序列中获取 class:

  1. BootstrapClassLoader组成Bootstrapclassesrt.jarjre/lib 中的其他几个重要 jar 文件。
  2. 扩展ClassLoader扩展classes组成(jar文件在扩展文件夹 jre/lib/ext).
  3. 系统ClassLoader用户classes组成(classes位于定义的class路径中。

因此,由于您的 class 未在 #1 中定义,而是在 #2 和 #3 中定义,因此它可以找到的第一个 class 将在 #2 中,因此它将获得版本的扩展文件夹,只需忽略稍后在 classpath.

中定义的那个

另见 How Classes are Found

它将是 class 级别而不是 Jar 级别。如果 class(完全限定的 class 名称)已经加载到 vm,那么 ext 中的新 class 或 class 路径库 class 将是忽略。