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

做网站域名备案需要多久广东的seo产品推广服务公司

做网站域名备案需要多久,广东的seo产品推广服务公司,网站设计制作公司排名,wordpress文字替换利用FatJar彻底解决Jar包冲突 序FatJar的加载与隔离⼀、 FatJar概念⼆、FatJar的加载三、FatJar的隔离四、隔离机制验证五、 FatJar的定位六、 打包注意点 序 今天整理旧电脑里的资料,偶然翻到大概10年前实习时写的笔记,之前经常遇到Java依赖冲突的问题…

利用FatJar彻底解决Jar包冲突

  • FatJar的加载与隔离
    • ⼀、 FatJar概念
    • ⼆、FatJar的加载
    • 三、FatJar的隔离
    • 四、隔离机制验证
    • 五、 FatJar的定位
    • 六、 打包注意点

今天整理旧电脑里的资料,偶然翻到大概10年前实习时写的笔记,之前经常遇到Java依赖冲突的问题,想通过这种方式彻底解决Java里的依赖冲突,现在回过头来看,不知道是不是有点幼稚,欢迎交流,请轻喷。

FatJar的加载与隔离

⼀、 FatJar概念

将⼀个jar和他所依赖的jar都打在⼀个包中,这个包即为FatJar。

如何打FatJar

  1. 使⽤ maven shade 插件
    使⽤ maven shade 插件解压依赖的jar并和原⼯程class混在⼀起打包成⼀个jar。 优点:打包⽅式简单,之后加载也较容易。 缺点:⽬录多且乱,对于jar包中的配置⽂件不利于定位;对于内部依赖冲突这种打包⽅式会⾃动排除冲突,覆盖class⽂ 件,不利于排查jar包本身内部的冲突,如下图。
    建议:如果能够忍受这么乱的⽬录可以使⽤这种⽅式,因为加载class的时候很⽅便。
    使用maven shade 插件

  2. 使⽤ SpringBoot 提供的打包插件
    由于SpringBoot打出来的jar可以直接启动,这个jar就是FatJar,所以可以使⽤ Spring Boot 提供的打包插件将依赖的jar直接 打进FatJar,如下图。
    优点:通⽤,spring boot,pandora 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 构造完成之后,我们就可以验证⼀下到底能不能解决冲突了。

  1. 原理层⾯验证
    验证代码如下:
    在这里插入图片描述
    输出结果如下:
    在这里插入图片描述
    可以看到 FatJarClassLoader 的 parent 为 ExtensionClassLoader,所以与AppClassLoader是同级的。String的ClassLoader为 空是由于BootStrapClassLoader是通过C++编写的,是最“底”层的ClassLoader。
  2. 实例验证-构造冲突
    在⼆⽅包中添加⽇志依赖如下:
    在这里插入图片描述
    该版本的Logger是有trace⽅法的,我们在⼆⽅包中可以直接调⽤进⾏确认:
    在这里插入图片描述
    将⼆⽅包打成普通的jar包,在应⽤中依赖该jar包(conflict-b),同时也依赖⼀个低版本的⽇志包:
    在这里插入图片描述
    在应⽤中调⽤⼆⽅包中的某个⽅法,该⽅法内部会调⽤Logger的trace⽅法:
    在这里插入图片描述
    报错如下:
    在这里插入图片描述
    可⻅构造冲突已经成功了!
  3. 实例验证-利⽤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.hkea.cn/news/939183/

相关文章:

  • 做网站如何适应分辨率网站分析培训班
  • 现在币圈有那些私募网站做的好百度推广账号登陆入口
  • 旅游网站图片营销公司排名
  • 做服务器的网站都有哪些搜狗关键词排名此会zjkwlgs
  • php动态网站开发 唐四薪 答案b站引流推广网站
  • 长沙3天2晚自由行攻略论述搜索引擎优化的具体措施
  • 外汇局网站做结汇申报被逆冬seo课程欺骗了
  • 网站运营配置免费网站在线观看人数在哪直播
  • 什么网站做一手房好系统优化的例子
  • wordpress 插入wordseo排名点击工具
  • 网站推广易网宣seo的主要分析工具
  • 安徽网站定制最大免费广告发布平台
  • 怎么查网站有没有做404公司宣传网页怎么做
  • 靠谱营销网站开发选哪家seo的优点和缺点
  • 企业网站建设论文文献综述百度推广的广告真实可信吗
  • 企业网站优化方式广州最新消息今天
  • 旅游网站开发的意义seo优化方案案例
  • 山东做网站的公司seo数据分析哪些方面
  • 做网站用哪几个端口 比较好百度贴吧官网网页
  • 弹幕网站是怎么做的百度在线翻译
  • 独立网站域名代发关键词包收录
  • 如何建立门户网站百度可以发布广告吗
  • 网站开发毕设文献郑州网站优化顾问
  • 青海建设银行的官方网站自己制作网页的网站
  • 网站建设的图片叠加步骤过程2021年搜索引擎排名
  • 网站链接到邮箱怎么做搜索引擎推广试题
  • 十堰城市建设网站制作自己的网站
  • 传媒网站建设公司深圳百度seo优化
  • 公司需要网站 该怎么做公司推广咨询
  • 高中男女做那个视频网站seo做的好的网站