classpath中存在多个jar存在同限定名的class classloader会如何加载

简介: 总之,合理组织类路径和使用现代化的构建工具,可有效避免类加载冲突,保证应用的稳定运行。

在Java开发中,Classpath是JVM或Java编译器用来查找类(.class文件)的目录或JAR文件的集合。因此,当一个Java应用启动时,classpath的内容将决定Java虚拟机(JVM)查找类定义的位置。理解Java的类加载机制对解决类冲突和解析问题至关重要。

类加载机制简介

Java虚拟机(JVM)使用类加载器(class loader)按需加载类文件。类加载器主要分为三种:

  1. 引导(Bootstrap)类加载器:加载Java的核心类库,如 rt.jar和其他核心库。它不是Java类,而是由JVM实现。
  2. 扩展(Extension)类加载器:加载 jre/lib/ext目录或Java属性中定义的其他路径里的类。
  3. 系统(System)类加载器:也称为应用类加载器,它加载class环境变量、java命令的-classpath选项或任何直接/间接传递给 ClassLoader.getSystemClassLoader()的类路径。

解决类路径冲突问题

当classpath中存在多个JAR文件含有同限定名(完全相同的包名和类名)的class时,类加载器将依据JVM搜索类的顺序规则来加载类。具体行为如下:

  1. 遵循“父类优先”(Parent-First)加载模型:系统类加载器首先会委托给其父加载器(扩展类加载器),扩展类加载器再委托给引导类加载器。如果父加载器无法完成加载任务,该任务会回传给子加载器。这意味着,如果相同的类在Java的核心类库和classpath中都存在,将永远由引导类加载器加载的核心类库中的那个版本。
  2. 按照classpath的声明顺序加载:如果类无法由引导类加载器和扩展类加载器加载,系统类加载器将按照classpath的声明顺序来加载类。一旦在classpath的某个元素中找到了对应的类定义,就停止搜索并加载该类。这意味着,若classpath中的A.jar和B.jar包含相同的类名和包结构,而A.jar在B.jar之前被声明,系统类加载器只会加载A.jar中的类。

为了避免或解决类路径中的冲突,建议:

  • 尽量避免创建与Java核心库中相同限定名的类。
  • 在实际开发过程中,合理组织包名和类名,遵循唯一性原则,避免命名冲突。
  • 仔细管理项目依赖,避免引入包含相同类的不同版本的JAR文件。
  • 使用专业的构建工具(如Maven、Gradle)管理依赖,它们提供了解决依赖冲突的策略。

总之,合理组织类路径和使用现代化的构建工具,可有效避免类加载冲突,保证应用的稳定运行。

目录
相关文章
|
9月前
|
Java Android开发
|
6月前
|
Java Linux Maven
java依赖冲突解决问题之容器加载依赖jar包如何解决
java依赖冲突解决问题之容器加载依赖jar包如何解决
|
5月前
|
IDE Java Linux
classpath和jar3-15
classpath和jar3-15
|
7月前
|
Java 应用服务中间件
tomcat7 与 tomcat8 加载 jar包的顺序
tomcat7 与 tomcat8 加载 jar包的顺序
239 0
|
7月前
|
Java 应用服务中间件 API
java 启动查看jar包加载顺序并设置classpath
java 启动查看jar包加载顺序并设置classpath
468 0
|
7月前
|
缓存 Java Maven
IntelliJ IDEA中无法加载jar包导致出现“cannot resolve symbol...”问题的解决
IntelliJ IDEA中无法加载jar包导致出现“cannot resolve symbol...”问题的解决
294 0
|
8月前
|
Java Maven
Maven项目打包成jar项目后运行报错误: 找不到或无法加载主类 Main.Main 和 jar中没有主清单属性解决方案
Maven项目打包成jar项目后运行报错误: 找不到或无法加载主类 Main.Main 和 jar中没有主清单属性解决方案
1303 0
|
Java Spring
SpringBoot 项目打成 jar 后,如何加载外部的配置文件?
SpringBoot 项目打成 jar 后,如何加载外部的配置文件?
987 0
|
9月前
|
Java
Java【付诸实践 04】Jar包class文件反编译、修改、重新编译打包方法(含反编译工具jd-gui-windows-1.6.6.zip百度云资源)
Java【付诸实践 04】Jar包class文件反编译、修改、重新编译打包方法(含反编译工具jd-gui-windows-1.6.6.zip百度云资源)
979 0
|
Java 计算机视觉 Windows
jar 手动 打包文件 so, class ,jar
jar 手动 打包文件 so, class ,jar
206 0