jar包和工程src里面class相同的加载优先级问题
前言
一、java中class的加载顺序
二、适应场景
1.将jar中类copy到src目录下进行改造
前言
先说结论:
jar包中的class文件和工程src路径下编译出来的class相同(包名,类名相同,逻辑不同)。会优先加载src路径下编译出来的class。
多个jar包中有相同的class (包名,类名相同,逻辑不同),手动指定加载顺序。
注意:
有人说改jar包的名字。maven打成的jar包名称是以artifactId决定的,所以修改artifactId首字母就能准确的保证哪个包中的同名class先被加载了。不一定靠谱!!!
因为Java 在装载一个目录下所有jar包时, 它加载的顺序完全取决于操作系统!而Linux的顺序完全取决于INode的顺序,INode的顺序不完全能一致,所以笔者之前就遇到类似的问题,上线20台机器,用同一个镜像,有2台就是起不来的情况。遇到这种情况目前就只能乖乖按以下章节中的手段去解决了。
一、java中class的加载顺序
$java_home/lib 目录下的java核心api
$java_home/lib/ext 目录下的java扩展jar包
java -classpath/-Djava.class.path所指的目录下的类与jar包
$CATALINA_HOME/common目录下按照文件夹的顺序从上往下依次加载
$CATALINA_HOME/server目录下按照文件夹的顺序从上往下依次加载
$CATALINA_BASE/shared目录下按照文件夹的顺序从上往下依次加载
我们的项目路径/WEB-INF/classes下的class文件
我们的项目路径/WEB-INF/lib下的jar文件
同一个ClassLoader实例加载的类不能重复(不同的class文件,同样的类名也是重复)。
java -classpath(-cp)加载配置jar包(classes)时,会按照书写定义顺序加载class,之后重复加载的class会被忽略,只有第一个生效。
Idea中可以通过在Project Settings -> Modules -> Dependencies中通过上下箭头调整jar加载顺序,其实也就是调整-classpath(-cp)后的jar包书写顺序。
二、适应场景
1.将jar中类copy到src目录下进行改造
例如:当我们利用dubbo做微服务时,dubbo的过滤器传送参数到另一个进程时,如果出现没有数据传过去,可能就考虑将从dubbo的jar包中copy相关的类到IDEA的src目录下进行改造
之所以可以这样做是根据类的加载机制,加载类路径下的class文件后,再加载jar包
-----------------------------------
java 相同类 jar 两个jar包有相同的类
https://blog.51cto.com/u_16099192/6974356
本文来自博客园,作者:茄子_2008,转载请注明原文链接:https://www.cnblogs.com/xd502djj/p/18247614