Java类名冲突本质是全限定名重复或加载错配,解决关键在于包隔离、显式引用和类加载器控制:不同包下同名类(如com.example.user.User与com.example.api.User)天然独立;import仅为语法糖,需严格匹配目录结构;同名类共存时须用全限定名或Java 10+的import as别名;多版本共存依赖自定义ClassLoader隔离。
Java 类名冲突不是“名字撞了”那么简单,而是全限定名(包名+类名)在类加载阶段被重复或错配导致的运行时问题。解决的关键不在改类名,而在控制“谁先被加载”和“由谁来加载”。
包本质是命名空间,让 com.example.user.User 和 com.example.api.User 成为两个完全不同的类型。只要包路径严格匹配文件系统目录(如 src/main/java/com/example/user/User.java),JVM 就能区分它们。import 只是语法糖,真正起作用的是编译后生成的全限定名。
org.mycompany.service),降低全局重名概率当必须在同一个类里使用多个同名类时,不能只靠 import,得靠“显式路径”或“别名”。
new com.example.admin.User() 和 new com.example.dto.User()
import com.example.admin.User as AdminUser;,之后用 AdminUser 实例化JVM 加载类是按 classpath 中 jar 的排列顺序“先到先得”,一旦某个类被 ApplicationClassLoader 加载,后续同名类就被忽略。冲突常发生在多版本 jar 共存时。
立即学习“Java免费学习笔记(深入)”;
-verbose:class 查看实际加载了哪个 jar 里的类<exclusions> 排除传递依赖中的冲突版本,或用 maven-enforcer-plugin 锁定版本当项目必须同时用旧版 POI 和新版 POI(比如老模块依赖 3.x,新功能要用 5.x 的公式函数),靠改包名或排除依赖都不够,就得靠类加载器隔离。