Java类路径存在多个同包同名类时导入优先级规则咨询
Java CLASSPATH下同名同包类的加载优先级问题
场景说明
存在两个目录下的同包同名类,目录结构如下:
dir1 |___com |___example |___mypackage |___myclass.class dir2 |___com |___example |___mypackage |___myclass.class
两个类的全限定名均为com.example.mypackage.myclass,且dir1、dir2都被加入了CLASSPATH。
加载规则结论
默认情况下会优先加载CLASSPATH配置中顺序更靠前的路径下的对应类:
- 若CLASSPATH配置顺序为
dir1;dir2(Windows系统用分号;分隔路径,Linux/macOS用冒号:分隔),则优先加载dir1下的myclass.class - 若CLASSPATH配置顺序为
dir2;dir1,则优先加载dir2下的myclass.class
原理说明
Java默认的应用类加载器(AppClassLoader)加载类时,会严格按照CLASSPATH的配置顺序逐个扫描路径,只要在某个路径下找到匹配全限定名的class文件,就会直接加载该类,终止后续路径的扫描。
注意事项
- 这种同包同名类同时出现在CLASSPATH的场景属于类冲突,是开发阶段要尽量避免的,我们常见的Jar包依赖冲突(同一依赖的多个版本同时被引入)本质就是这个问题,很容易触发
NoSuchMethodError、ClassNotFoundException等运行时异常。 - 如果你自定义了类加载器,类的加载顺序由你自己实现的类加载逻辑决定,不受上述默认规则限制。
内容的提问来源于stack exchange,提问作者Ricky
相关产品推荐
相关产品推荐

