浅谈两个jar包中包含完全相同的包名和类名的加载问题

发布时间 - 2026-01-11 03:06:10    点击率:

首先从表现层介绍,后续后深入原理。

1、先简单介绍maven如何生成jar文件方便测试

<plugin>
    <artifactId>maven-assembly-plugin</artifactId>
    <version>2.4</version>
    <configuration>
     <descriptorRefs>
      <descriptorRef>jar-with-dependencies</descriptorRef>
     </descriptorRefs>
     <archive>
      <manifest>
       <mainClass>Main.Main</mainClass>
      </manifest>
     </archive>
    </configuration>
    <executions>
     <execution>
      <id>make-assembly</id>
      <phase>package</phase>
      <goals>
       <goal>single</goal>
      </goals>
     </execution>
    </executions>
   </plugin>
配置了一个manifest标签来配置Main函数的入口。然后通过如下指令来实现打包。
 
mvn assembly:assembly

2、自定义两个jar包,其中包含相同包名和类名

与export的导入顺序有关。只会加载第一个,并且运行正常。

3、自定义jar和jdk包, 其中包含相同的包名和类名

与export的导入顺序有关。同样是只会加载第一个,但是如果加载自定义的jar运行会报错。加载 jdk正常。

protected Class<?> loadClass(String name, boolean resolve)
  throws ClassNotFoundException
 {
  synchronized (getClassLoadingLock(name)) {
   // First, check if the class has already been loaded
   Class<?> c = findLoadedClass(name);
   if (c == null) {
    long t0 = System.nanoTime();
    try {
     if (parent != null) {
      c = parent.loadClass(name, false);
     } else {
      c = findBootstrapClassOrNull(name);
     }
    } catch (ClassNotFoundException e) {
     // ClassNotFoundException thrown if class not found
     // from the non-null parent class loader
    }
 
    if (c == null) {
     // If still not found, then invoke findClass in order
     // to find the class.
     long t1 = System.nanoTime();
     c = findClass(name);
 
     // this is the defining class loader; record the stats
     sun.misc.PerfCounter.getParentDelegationTime().addTime(t1 - t0);
     sun.misc.PerfCounter.getFindClassTime().addElapsedTimeFrom(t1);
     sun.misc.PerfCounter.getFindClasses().increment();
    }
   }
   if (resolve) {
    resolveClass(c);
   }
   return c;
  }
 }

4、mvn jar包冲突常用命令

mvn dependency:analyze,mvn dependency:tree

以上这篇浅谈两个jar包中包含完全相同的包名和类名的加载问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。


# 两个jar包有相同的类  # Java中tomcat memecached session 共享同步问题的解决办法  # TOMCAT内存溢出及大小调整的实现方法  # Tomcat实现session共享(session 会话复制)  # tomcat8改了jar加载顺序的踩坑记录  # 使用tomcat设定shared lib共享同样的jar  # 加载  # 自定义  # 第一个  # 只会  # 给大家  # 其中包含  # 希望能  # 这篇  # 报错  # 浅谈  # 来实现  # 小编  # 大家多多  # 完全相同  # 包中  # execution  # id  # phase  # mainClass  # manifest 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: INTERNET浏览器怎样恢复关闭标签页_INTERNET浏览器标签恢复快捷键与方法【指南】  HTML透明颜色代码在Angular里怎么设置_Angular透明颜色使用指南【详解】  标准网站视频模板制作软件,现在有哪个网站的视频编辑素材最齐全的,背景音乐、音效等?  google浏览器怎么清理缓存_谷歌浏览器清除缓存加速详细步骤  lovemo网页版地址 lovemo官网手机登录  Python结构化数据采集_字段抽取解析【教程】  Swift中switch语句区间和元组模式匹配  Laravel如何使用查询构建器?(Query Builder高级用法)  谷歌浏览器下载文件时中断怎么办 Google Chrome下载管理修复  Laravel的Blade指令怎么自定义_创建你自己的Laravel Blade Directives  如何快速登录WAP自助建站平台?  Laravel如何构建RESTful API_Laravel标准化API接口开发指南  php嵌入式断网后怎么恢复_php检测网络重连并恢复硬件控制【操作】  简历在线制作网站免费版,如何创建个人简历?  如何快速搭建个人网站并优化SEO?  javascript中闭包概念与用法深入理解  Laravel如何连接多个数据库_Laravel多数据库连接配置与切换教程  网站制作价目表怎么做,珍爱网婚介费用多少?  网易LOFTER官网链接 老福特网页版登录地址  Laravel 419 page expired怎么解决_Laravel CSRF令牌过期处理  网站建设要注意的标准 促进网站用户好感度!  EditPlus中的正则表达式实战(5)  Laravel如何实现用户密码重置功能?(完整流程代码)  Java Adapter 适配器模式(类适配器,对象适配器)优缺点对比  大学网站设计制作软件有哪些,如何将网站制作成自己app?  Laravel怎么实现软删除SoftDeletes_Laravel模型回收站功能与数据恢复【步骤】  Win11怎么设置虚拟桌面 Win11新建多桌面切换操作【技巧】  javascript如何操作浏览器历史记录_怎样实现无刷新导航  利用python获取某年中每个月的第一天和最后一天  高防服务器:AI智能防御DDoS攻击与数据安全保障  html5audio标签播放结束怎么触发事件_onended回调方法【教程】  哪家制作企业网站好,开办像阿里巴巴那样的网络公司和网站要怎么做?  百度输入法ai组件怎么删除 百度输入法ai组件移除工具  1688铺货到淘宝怎么操作 1688一键铺货到自己店铺详细步骤  Laravel如何使用Eloquent ORM进行数据库操作?(CRUD示例)  Laravel如何发送系统通知_Laravel Notifications实现多渠道消息通知  Laravel Livewire是什么_使用Laravel Livewire构建动态前端界面  Android滚轮选择时间控件使用详解  laravel服务容器和依赖注入怎么理解_laravel服务容器与依赖注入解析  如何用AI一键生成爆款短视频文案?小红书AI文案写作指令【教程】  如何在云服务器上快速搭建个人网站?  如何在HTML表单中获取用户输入并结合JavaScript动态控制复利计算循环  如何制作新型网站程序文件,新型止水鱼鳞网要拆除吗?  canvas 画布在主流浏览器中的尺寸限制详细介绍  大型企业网站制作流程,做网站需要注册公司吗?  大连企业网站制作公司,大连2025企业社保缴费网上缴费流程?  jQuery validate插件功能与用法详解  Laravel如何安装Breeze扩展包_Laravel用户注册登录功能快速实现【流程】  桂林网站制作公司有哪些,桂林马拉松怎么报名?  C++时间戳转换成日期时间的步骤和示例代码