当前位置: 首页 > news >正文

全国p2p网站建设自助网站模板平台

全国p2p网站建设,自助网站模板平台,哪个网站可以接程序项目来做,wordpress子目录伪静态利用FatJar彻底解决Jar包冲突 序FatJar的加载与隔离⼀、 FatJar概念⼆、FatJar的加载三、FatJar的隔离四、隔离机制验证五、 FatJar的定位六、 打包注意点 序 今天整理旧电脑里的资料#xff0c;偶然翻到大概10年前实习时写的笔记#xff0c;之前经常遇到Java依赖冲突的问题… 利用FatJar彻底解决Jar包冲突 序FatJar的加载与隔离⼀、 FatJar概念⼆、FatJar的加载三、FatJar的隔离四、隔离机制验证五、 FatJar的定位六、 打包注意点 序 今天整理旧电脑里的资料偶然翻到大概10年前实习时写的笔记之前经常遇到Java依赖冲突的问题想通过这种方式彻底解决Java里的依赖冲突现在回过头来看不知道是不是有点幼稚欢迎交流请轻喷。 FatJar的加载与隔离 ⼀、 FatJar概念 将⼀个jar和他所依赖的jar都打在⼀个包中这个包即为FatJar。 如何打FatJar 使⽤ maven shade 插件 使⽤ maven shade 插件解压依赖的jar并和原⼯程class混在⼀起打包成⼀个jar。 优点打包⽅式简单之后加载也较容易。 缺点⽬录多且乱对于jar包中的配置⽂件不利于定位对于内部依赖冲突这种打包⽅式会⾃动排除冲突覆盖class⽂ 件不利于排查jar包本身内部的冲突如下图。 建议如果能够忍受这么乱的⽬录可以使⽤这种⽅式因为加载class的时候很⽅便。 使⽤ SpringBoot 提供的打包插件 由于SpringBoot打出来的jar可以直接启动这个jar就是FatJar所以可以使⽤ Spring Boot 提供的打包插件将依赖的jar直接 打进FatJar如下图。 优点通⽤spring bootpandora boot都是基于这种⽅式很多问题都有现成的解决⽅案⽐如之后遇到的autoconfig注⼊问题autoconfig 提供了针对fatjar注⼊的插件。⽬录⼲净明了如下图。 缺点由于原⽣jar的加载只⽀持⼀层加载即⽆法加载 jarin jar ⾥的class所以这个问题需要调研但是既然使⽤的是 Spring Boot的打包⽅式Spring Boot本身肯定已经解决了这个问题。 考虑到通⽤性与“美感”下⾯针对这种打包⽅式来解决相应的问题。 ⼆、FatJar的加载 fatjar与普通jar的区别就是它将依赖的jar也打进了jar包⾥的lib⽬录下所以需要加载jarin jar。对于Jar⾥的资源定义 以‘!/ʼ来分割。原始的JarFile URL只⽀持⼀个‘!/ʼ如图。 通过阅读Spring Boot启动加载相关的源码发现Spring Boot扩展了这个协议让它⽀持多个‘!/ʼ从⽽就可以表示jarin jar的 资源了如图。 既然这样我们就可以复⽤Spring Boot 的 加载⽅式即通过继承spring boot的launcher复⽤它的createClassLoader来构造LaunchedURLClassLoader。 三、FatJar的隔离 解决了加载的问题之后就需要研究如何与依赖FatJar的应⽤以下简称为“应⽤”隔离了因为我们最终的⽬标就是针对 应⽤和jar⾥同类名全路径的两个class都能够加载且不冲突。根据java classloader的委托加载机制我们可以确定我们 的FatJarClassLoader所处的位置如下 应⽤的classloader使⽤的是AppClassLoader需要创建⼀个与它同级的ClassLoader即FatJarClassLoader通过设置 LaunchedClassLoader的parent为AppClassLoader的parent即ExtensionClassLoader就可以了这样两个ClassLoader就可以 像上图那样隔离。 四、隔离机制验证 FatJarClassLoader 构造完成之后我们就可以验证⼀下到底能不能解决冲突了。 原理层⾯验证 验证代码如下 输出结果如下 可以看到 FatJarClassLoader 的 parent 为 ExtensionClassLoader所以与AppClassLoader是同级的。String的ClassLoader为 空是由于BootStrapClassLoader是通过C编写的是最“底”层的ClassLoader。实例验证-构造冲突 在⼆⽅包中添加⽇志依赖如下 该版本的Logger是有trace⽅法的我们在⼆⽅包中可以直接调⽤进⾏确认 将⼆⽅包打成普通的jar包在应⽤中依赖该jar包conflict-b同时也依赖⼀个低版本的⽇志包 在应⽤中调⽤⼆⽅包中的某个⽅法该⽅法内部会调⽤Logger的trace⽅法 报错如下 可⻅构造冲突已经成功了实例验证-利⽤FatJar解决冲突 将⼆⽅包打成FatJar之后在应⽤中通过反射调⽤原来会冲突的代码调⽤成功 可⻅⼆⽅包是通过隔离的⽅式加载的加载的是⼆⽅包⾃带的⾼版本的Logger⽽应⽤本身加载的还是⽼版本的 Logger。 五、 FatJar的定位 由于是在运⾏期加载FatJar所以需要⼿动定位FatJar的位置这边普通Java程序和Java Web 定位⽅式不同⽬前只是同时 使⽤这两种⽅式进⾏加载还没有其他更通⽤的解决⽅案。 当依赖⽅是普通 Java 程序时所有依赖的jar包路径可以通过如下代码获得 ⽽当依赖⽅是Java Web 应⽤时根据Tomcat 中应⽤的⽬录结构 得到 jar 包路径的步骤为 1. AppClassLoader.getResource(“/”).getPath() 2. 上溯并进⼊lib⽬录即可 六、 打包注意点 使⽤Spring Boot插件打出的FatJar是包含pom.xml 的如下图 可⻅pom⽂件位置和普通jar包的位置是⼀致的这样的话应⽤maven其实是可以识别到FatJar的pom⽂件的这样会将 FatJar依赖的jar包加⼊到应⽤⾥还是需要⼿动排除冲突这就跟我们的初衷不⼀致了。所以需要将pom⽂件在打包时排 除如下代码
http://www.w-s-a.com/news/602909/

相关文章:

  • 南宁企业网站建设制作芜湖网站建设推广
  • 泉州市建设局网站公示深圳建站公司好坏
  • 如何搭建网站教程一个人制作网站
  • 网站开发专业都有哪些课程广州安全教育平台账号找回
  • 网站调整方案适合平面设计师的网站
  • 免费服务器建立网站用html5做的旅游网站代码
  • 学校英语网站栏目名称WordPress禁用邮件注册
  • 手机qq网页版网站沧州手机网站开发
  • 深圳罗湖网站设计公司建设的网站属于无形资产吗
  • 网站开发python西安网站建站品牌
  • 网站开发商标属于哪一类做网站还有钱赚吗
  • 做设计的搜素材上什么网站好设计公司画册设计哪家好
  • 视频网站开发需要什么语言做ui设计一年后年薪多少
  • 网站服务器维护费用统一企业官方网站
  • 网站如何调用手机淘宝做淘宝客呼和浩特网站运营公司
  • 做推广可以上那些网站网页游戏排行榜2014前十名
  • 国外网站备案流程企业网站 流程
  • 重庆网站建设letide童程童美少儿收费价目表
  • 苏州建站仿站东莞排名推广
  • 大中小网站的区分wordpress个人主页主题
  • 商务网站建设的可行性分析包括小程序源码网免费
  • 永州网站建设收费标准重庆网站建设公司夹夹虫专业
  • python做网站多少钱wordpress 2.8
  • 深圳网站平台网站开发工作程序怎么写
  • 自己可以接单做网站吗wordpress 添加自定义按钮
  • 网站首页权重宣传页制作
  • 智能网站建设软件有哪些方面网页的建设
  • 石铜路网站建设生鲜电商网站开发
  • 怎么提高网站加载速度慢网站的轮播怎么做的
  • 网络网站推广优化建筑工程教育网官方网站