JVM 将加载哪个 jar?
Which of the jar will be loaded in the JVM?
所以假设我在 ext
文件夹中有一个不同版本的 jar,另一个版本在 classpath
中。将加载哪个版本的 jar?根据我的研究,由于 extension classloader
在 classpath
之前运行,因此将加载扩展中的库。或者它会被 classpath
覆盖。如果版本相同会怎样?
它将使用它可以在 ClassLoader
的层次结构中找到的第一个 class。
因此它将尝试从下一个 ClassLoader
序列中获取 class:
- 由Bootstrap
ClassLoader
组成Bootstrapclasses (rt.jar
和 jre/lib
中的其他几个重要 jar
文件。
- 扩展
ClassLoader
由扩展classes组成(jar
文件在扩展文件夹 jre/lib/ext
).
- 系统
ClassLoader
由用户classes组成(classes位于定义的class路径中。
因此,由于您的 class 未在 #1 中定义,而是在 #2 和 #3 中定义,因此它可以找到的第一个 class 将在 #2 中,因此它将获得版本的扩展文件夹,只需忽略稍后在 classpath.
中定义的那个
它将是 class 级别而不是 Jar 级别。如果 class(完全限定的 class 名称)已经加载到 vm,那么 ext 中的新 class 或 class 路径库 class 将是忽略。
所以假设我在 ext
文件夹中有一个不同版本的 jar,另一个版本在 classpath
中。将加载哪个版本的 jar?根据我的研究,由于 extension classloader
在 classpath
之前运行,因此将加载扩展中的库。或者它会被 classpath
覆盖。如果版本相同会怎样?
它将使用它可以在 ClassLoader
的层次结构中找到的第一个 class。
因此它将尝试从下一个 ClassLoader
序列中获取 class:
- 由Bootstrap
ClassLoader
组成Bootstrapclasses (rt.jar
和jre/lib
中的其他几个重要jar
文件。 - 扩展
ClassLoader
由扩展classes组成(jar
文件在扩展文件夹jre/lib/ext
). - 系统
ClassLoader
由用户classes组成(classes位于定义的class路径中。
因此,由于您的 class 未在 #1 中定义,而是在 #2 和 #3 中定义,因此它可以找到的第一个 class 将在 #2 中,因此它将获得版本的扩展文件夹,只需忽略稍后在 classpath.
中定义的那个它将是 class 级别而不是 Jar 级别。如果 class(完全限定的 class 名称)已经加载到 vm,那么 ext 中的新 class 或 class 路径库 class 将是忽略。