我接管了一系列年龄的系统。计划编写重建和作为一系列文章所遇到的问题。老行派遣新的分支机构,重新审视一些实用技术,并与所有人分享。[重建01],告诉您有关JAR包裹的冲突和原则。
目前,市场上的项目管理要么基于Maven,要么基于Gradle。最近,最近连接了一组添加JAR软件包的项目。
这已经是为纯手册添加Jar包项目的一种方法,并且已经工作了三到五年的技术人员可能没有经历过它。到LIB目录,并在IDE中手动添加Jar包。
这样,添加JAR软件包依赖项不仅很麻烦,而且很容易引起JAR软件包冲突。同时,对冲突方法的分析只能基于经验。
最近,我遇到了这样的情况:可以在开发人员A的环境中正常启动一个项目,并且不能在B中启动,也没有异常信息。
有些具有一定发展经验的人可以立即得出结论,可以确定JAR包的冲突。LLES查看如何解决和扩展知识点。
由于该项目很长一段时间都没有暂时构建,因此我不敢替换JAR软件包和升级。它只能用临时手段来解决。
这是不时准备的几个步骤,这通常是解决JAR依赖问题的技巧。
首先:找到在IDE中找不到的类。例如,IDEA MAC操作系统,我使用的快捷键是命令 + Shift +N。
以断言类为例,您可以看到许多软件包都包括断言,但是启动程序找不到此类的某种方法。问题基本上是在JAR软件包冲突上。
其次,将JAR软件包冲突定位后,找到系统应使用的JAR软件包。
例如,您需要在此处使用的弹簧核心中的类不是弹簧中的类。
知识点:在同一目录中的JAR软件包中,JVM按JAR软件包的顺序加载。一旦加载了具有相同整个路径名的类,背面就不会加载。
因此,临时解决方案是调整JVM编译(负载)JAR软件包的顺序。这在Eclipse和Idea中都支持,可以手动调整。
Eclipse中的调整方法:
想法调整方法:
调整需要首先加载的JAR软件包,以便首先加载它,并最终暂时解决JAR软件包冲突的问题。
以上仅受项目状态的临时解决方案的限制。最后,必须对其进行转换和升级。JAR软件包管理基于Maven或Gradle。
在此临时解决方案中,它涉及JVM的关键知识点:JVM -Class加载器的隔离问题和两个期待分配机制。没有JVM类加载机制的相关知识,您甚至可能都不认为该知识上面的临时解决方案。
每种类型的加载程序都有自己的命名空间来保存已加载的类。当类加载器加载一类时,它会搜索保存在名称空间中的全局有限名称(),以检测该类是否已加载。
该类的唯一标识为 + +,因此可能存在一个运行程序中的两个类和类。如果这两个类未由一个类加载,则不可能将一个类的实例强加于另一个类。这是孤立。
为了解决隔离器隔离器的问题,引入了两个父母的任命机制。
两个 - 父母的任命机制中有两个核心:首先,检查课程是否已从底部加载;其次,尝试从顶部加载课程。
通常有四种类型的类加载程序:启动类加载程序,扩展类加载程序,应用程序类加载程序和自定义类加载程序。
目前,请勿考虑自定义类加载程序,JDK self -Class加载程序的特定执行过程如下:
首先:加载一个时,将将类加载请求分配给父级加载程序以完成;
第二:加载一个时,将分配课程以完成索赔;
第三:如果加载失败(例如,如果在其中找到),则将使用它来尝试加载;
第四:如果负载失败,将用于加载。如果负载失败,它将报告异常。
通过该方法,实施了父母的佣金机制来进行动态载荷。
该方法的源代码如下:
LoadClass方法本身是调用的递归过程。可以从上面代码中的parent.loadclass的调用中看到它。
在执行其他操作之前,首先开始检查指定的类是否已从底层加载程序通过底层加载程序加载。如果已加载,请确定是否根据Resolve参数执行连接过程并返回对象。
Jar软件包冲突经常在这里发生。当加载同名的第一类时,它将在检查此步骤时直接返回,并且不会再加载。或找不到类方法。
一旦上面看到了一个类,就可能无法加载具有相同总名称的类。罐装软件包的顺序直接确定类负载的顺序是直接确定的。
通常有以下因素决定JAR包装加载顺序:
我遇到的问题属于第二个因素的分支,也就是说,同一目录中不同JAR软件包的加载顺序是不同的。因此,通过调整JAR软件包的加载顺序来暂时解决该问题。
JAR软件包冲突通常是一件非常奇怪的事情,很难进行调查,但也会有一些共同的表现。
最后,在梳理Tomcat的启动时,JAR软件包和类的负载顺序包含上面提到的不同类型的类加载程序,默认情况下加载的目录:
在上面的目录中,将同一文件夹下方的JAR软件包从上到下加载。如果将类文件加载到JVM,则不会加载相同的类文件。
Jar Pack冲突是我们日常发展中非常普遍的问题。如果我们能够理解原因和基本机制,它可以大大提高解决问题和团队影响力的能力。因此,在许多访谈中都提到了此类问题。
在本文中,我们重点介绍导致JAR软件包冲突的原因和解决方案。在解决此问题时,经常设计Maven管理Jar包冲突的某些策略,例如依靠传输原则,最短的路径优先原则和第一个陈述原则。让我们在下一篇文章中详细讨论它。
博客作者简介:“ Springboot Technology Inner Book”技术书籍作者,喜欢学习技术,撰写技术干货文章。
公共帐户:博客作者的公共帐户“计划的新愿景”,欢迎关注?