首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

从Jar包冲突搞到类加载机制,就是这么霸气

这种方式来添加jar包依赖,不仅费事,而且很容易出现jar包冲突,同时分析冲突手段,只能凭借经验。...双亲委派机制 双亲委派机制的核心有两点:第一,自底向上检查类是否已加载;其二,自顶向下尝试加载类。 类加载器通常有四类:启动类加载器、拓展类加载器、应用程序类加载器和自定义类加载器。...而Jar包冲突往往发生在这里,当第一个同名的类被加载之后,在这一步检查时就会直接返回,不会再加载真正需要的类。那么,程序用到该类时就会抛出找不到类,或找不到类方法的异常。...因Tomcat、Resin等容器的ClassLoader获取加载路径下的文件列表时是不排序的,这就依赖于底层文件系统返回的顺序,当不同环境之间的文件系统不一致时,就会出现有的环境没问题,有的环境出现冲突...Tomcat启动时Jar包和类的加载顺序 最后,梳理一下Tomcat启动时,对Jar包和类的加载顺序,其中包含上面提到的不同种类的类加载器默认加载的目录: $java_home/lib 目录下的java

1.8K30
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Java 类加载器解析及常见类加载问题

    当我们实例化类加载器时,我们可以将父类加载器指定为构造函数参数。如果未显式指定父类加载器,则会将虚拟机的系统类加载器指定为默认父类。...引导类加载器(bootstrap classloader)作为父类,负责从 java.ext.dirs 路径中保存的所有 .jar 文件加载类。...在 Java EE 中,查找的顺序通常是相反的:类加载器可能在转到父类之前尝试在本地查找类。...因此,对于我们的特定示例,可能是这样的情况:Util 类应该打包到 demo-lib.jar 中,但是我们没有重新启动构建过程,并且该类没有包含在以前存在的包中,因此出现了错误。...解决方案是通过完全限定名和类加载器的组合来标识类!这意味着从类加载器 A 加载的 Util 类和从类加载器 B 加载的 Util 类在 JVM 中是不同的类,不能将一个类转换为另一个类!

    1K30

    Tomcat - 都说Tomcat违背了双亲委派机制,到底对不对?

    它可以从不同的文件目录加载,也可以从不同的 jar 文件中加载,也可以从网络上不同的静态文件服务器来下载字节码再加载。 ---- JVM 双亲委派机制 ? Java1.2之后引入双亲委派模式 。...当tomcat启动时,会创建几种类加载器: Bootstrap 引导类加载器 : 加载JVM启动所需的类,以及标准扩展类(位于jre/lib/ext下) System 系统类加载器 : 加载tomcat...---- 常见错误 NoClassDefFoundError NoClassDefFoundError : 由于JVM或者类加载器实例尝试加载类型的定义,但是该定义却没有找到,影响了执行路径。...检查该类中是否真的有对应的方法 ---- ClassCastException ClassCastException,在一个类加载器的情况下,一般出现这种错误都会是在转型操作时,比如:A a = (A)...method();,很容易判断出来method()方法返回的类型不是类型A,但是在 JavaEE 多个类加载器的环境下可能会出现一些不好去定位的情况。

    97530

    Jar 包依赖冲突很烦人,总结一波排查思路和解决方法

    起因 应用从 jdk7 升级到 jdk8,终于可以用上新特性的语法进行代码编写,通过几轮开发、测试和验证后,在上预发环境时,应用突然无法启动,查看 tomcat 报错原因,发现是 类转换失败 ClassCastException...如果它们都没有加载到这个类时,则抛出ClassNotFoundException异常。...从代码中了解到,如果某个名字的类被加载后,类加载器是不会再重新加载,所以我们的问题根本原因可以是出现在: 先加载了 org.slf4j 包的 org.slf4j.impl.StaticLoggerBinder...jvm 加载包名和类名相同的类时,先加载classpath中jar路径放在前面的,包名类名都相同,那jvm没法区分了,如果使用ide一般情况下是会提示发生冲突而报错,若不报错,只有第一个包被引入(在classpath...路径下排在前面的包),第二个包会在classloader加载类时判断重复而忽略。

    2.4K10

    Tomcat 应用中并行流带来的类加载问题

    但是,作者发现在 Tomcat 容器中使用并行流会出现动态加载类失败的情况,通过对比 Tomcat 多个版本的源码,结合并行流和 JVM 类加载机制的原理,成功定位到问题来源。...通过对线程堆栈和WARN日志定位到出现问题的类为com.alibaba.com.caucho.hessian.io.SerializerFactory,由于 _loader 为 null 所以无法对类进行加载...它的工作过程是:如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把整个请求委派给父类加载器去完成,每一个层次的类加载器都是如此,因此所有的加载请求最终都应该传送到顶层的启动类加载器中...,只有当父加载器反馈自己无法完成这个加载请求时,子加载器才会尝试自己去加载,流程如下图。...然而双亲委派的模型并不能保证应用程序加载类的过程,一个典型的例子就是JNDI服务,这些接口定义在rt.jar并由第三方提供实现,Bootstrap ClassLoader显然不认识这些代码。

    1.5K01

    Jar 包依赖冲突排查思路和解决方法

    ---- 起因 应用从 jdk7 升级到 jdk8,终于可以用上新特性的语法进行代码编写,通过几轮开发、测试和验证后,在上预发环境时,应用突然无法启动,查看 tomcat 报错原因,发现是 类转换失败...如果它们都没有加载到这个类时,则抛出ClassNotFoundException异常。...从代码中了解到,如果某个名字的类被加载后,类加载器是不会再重新加载,所以我们的问题根本原因可以是出现在: 先加载了 org.slf4j 包的 org.slf4j.impl.StaticLoggerBinder...jvm 加载包名和类名相同的类时,先加载classpath中jar路径放在前面的,包名类名都相同,那jvm没法区分了,如果使用ide一般情况下是会提示发生冲突而报错,若不报错,只有第一个包被引入(在classpath...路径下排在前面的包),第二个包会在classloader加载类时判断重复而忽略。

    1.6K20

    常见加载类错误分析

    这个异常通常发生在显式加载类的时候,例如用如下方式调用加载一个类时就报这个错了。...,就是当JVM要加载指定文件的字节码到内存时,并没由找到这个类对应的字节码,也就是说这个字节码.class文件不存在。...,如下面这种情况 java -cp example.jar Examper 在这个jar包里面只有一个类,这个类时net.xx.Exmple ,可能让你感到郁闷的是,命名这个jar包里面有这个类为啥会报这个错呢...这是因为你在命令行中没有加类的包名,正确的写法是这样的 java cp example.jar net.xx.Example 在JVM的规范中描述了出现NoClassDefFoundError可能的情况就是使用...new关键字、属性引用某个类、继承了某个接口或者类,以及方法的某个参数中引用了某个类,这个是出发JVM隐式加载这些类时发现这些类不存在的异常。

    1.1K20

    ClassCastException深入分「建议收藏」

    例如: Fruit f; Apple a = (Apple)f; 当出现下列情况时,就会引发ClassCastException异常: 1.Fruit和Apple类不兼容。...当应用程序代码尝试将某一对象转换为某一子类时,如果该对象并非该子类的实例,JVM就会抛出ClassCastException异常。...2.Fruit和Apple类兼容,但加载时使用了不同的ClassLoader。这是这种异常发生最常见的原因。在这里,需要了解一下什么是ClassLoader?...在理解类加载的时候,需要注意以下几点: 1.永远无法在同一ClassLoader中重新加载类。“热重新部署”需要使用新的ClassLoader。...4.由不同ClassLoader加载的同一类文件也会被视为不同的类,即便每个字节都完全相同。这是ClassCastException的一个典型原因。

    47930

    记一次类加载器的简单应用

    的parent:尝试从parent加载 如果parent为空:尝试从BootClassLoader加载 如果还是没有找到:通过当前classloader加载 类加载的代码可以在java.lang.ClassLoader.loadClass...加载扩展类,jre目录下的lib/ext/*.jar; AppClassLoader加载应用程序需要的类库,通过-cp传入,或在启动目录下 "."...,将jar及其全部依赖打包成一个文件,然后通过不同的文件偏移量来load,一个文件数据段代表一个class; 从指定目录加载指定jar,不同版本的Es交互代码放在不同的工程模块,打包时将不同的模块打包到不同的文件夹...Es核心包,因为classloader不会向下请求,因此会报运行时异常,解决方法就是在传入Client的初始化参数时设置加载核心包的类加载器: Settings settings = ImmutableSettings.builder...或者ClassCastException,因为不同的classloader加载类在jvm看来并不是同一个,即使内部的代码实现甚至class文件都是同一个。

    40510

    解决java.lang.NoClassDefFoundError错误

    我们往往花费时间去不断尝试一些其他的方法去解决这个问题,而没有真正去理解这个错误的原因。...,所以如果你的程序依赖原生的类库和需要的dll不存在时,有可能出现java.lang.NoClassDefFoundError。...,如果你的程序运行在像linux这样多用户的操作系统种,你需要把你应用相关的资源文件,如Jar文件,类库文件,配置文件的权限单独分配给程序所属用户组,如果你使用了多个用户不同程序共享的jar包时,很容易出现权限问题...当EJB-JAR中代码引用这个User类时,加载EJB-JAR所有class的Classloader找不到这个类,因为这个类已经被EJB-JAR classloader的子加载器WAR classloader...这会导致的结果就是对User类出现NoClassDefFoundError异常,而如果在两个JAR包中这个User类都存在,如果你使用equals方法比较两个类的对象时,会出现ClassCastException

    42810

    JAVA非受检异常和受检异常的区别等

    如果希望调用者能够从异常中进行合理恢复,需要设置为受检异常类型,如果调用者无法采用任何措施使得程序无法重异常中恢复,需要把该异常设置为非受检异常。 四....可能出现的错误情况如下: 对应的Class在java的classpath中不可用 你可能用jar命令运行你的程序,但类并没有在jar文件的manifest文件中的classpath属性中定义 可能程序的启动脚本覆盖了原来的...,它是程序运行期间的异常,比如当我们尝试在运行时使用反射加载类时,ClassNotFoundException 就会出现。...,通常是由于缺少 JAR 文件而引起的,但是如果 JVM 认为应用运行时找不到相应的引用,就会抛出 NoClassDefFoundError 错误;当你在代码中显示的加载类比如 Class.forName...在程序中,存在一些需要用户在编译期间就去检查的问题,比如FileNotFoundException、IOException,这些异常涉及资源处理,调用者需要捕获,其实它可以提醒开发者,如果被调用的方法出现这类异常时

    2.6K20

    classcastingexception_class session

    ClassCastException是JVM在检测到两个类型间转换不兼容时引发的运行时异常。此类错误通常会终止用户请求。...例如: Fruit f; Apple a = (Apple)f; 当出现下列情况时,就会引发ClassCastException异常: 1. Fruit和Apple类不兼容。...当应用程序代码尝试将某一对象转换为某一子类时,如果该对象并非该子类的实例,JVM就会抛出ClassCastException异常。 2....Fruit和Apple类兼容,但加载时使用了不同的ClassLoader。这是这种异常发生最常见的原因。在这里,需要了解一下什么是ClassLoader?...由不同ClassLoader加载的同一类文件也会被视为不同的类,即便每个字节都完全相同。这是ClassCastException的一个典型原因。 5.

    29920

    spring-boot-devtools cannot be cast to类型转换异常java.lang.ClassCastException

    在使用 DevTools 时,通用Mapper经常会出现 class x.x.A cannot be cast to x.x.A。...同一个类如果使用了不同的类加载器,就会产生这样的错误,所以解决方案就是让通用Mapper和实体类使用相同的类加载器即可。...DevTools 默认会对 IDE 中引入的所有项目使用 restart 类加载器,对于引入的 jar 包使用 base 类加载器,因此只要保证通用Mapper的jar包使用 restart 类加载器即可...基本原因是因为classLoader不同造成的,如果使用了spring-dev-tools之后,就会使用spring自己的RestartClassLoader 来装载类 错误堆栈: java.lang.ClassCastException...+jar 如果在项目中用到了不是resource的类就需要把jar包含进来。 重新启动项目,然后在修改类,自动重启成功,调用不报错。成功!

    3.9K10

    spring-boot-devtools导致com.alibaba.fastjson.JSONException: write javaBean error, fastjson ver

    为什么会出现这个问题呢,首先这个跟java类加载的双亲委派机制有关系,双亲机制还有一个作用就是隔离,不同类加载器加载的类之间是不能进行转换的,FastJSON也不例外,看下面两张图:...其实不只涉及到json序列化问题,强制类型转换也会因RestartClassLoader出现下面的问题: java.lang.ClassCastException: jtl3d.dto.UserDetailsDto...cannot be cast to jtl3d.dto.UserDetailsDto 这种报错看到时会一脸懵逼(看似同样的类为什么不能强制转换),其实是因为两个类不是一个类加载器加载导致的 解决方案:...里面类加载器加载--不推荐,有这个功夫不如直接去掉spring-boot-devtools PS: 1、序列化失败原因可能有多种,但今天这种情况笔者是第一次见,在spring官网找到了下面的一段话:简单说就是不变的类一般都要...appclassloader加载,开发应用中的类由spring-boot-devtools里的restart 类加载器加载,而Fastjson也是第三方jar包,故而也使用appclassloader加载

    2.4K10

    从源码角度学习JVM类加载器及自定义类加载器

    B站搜索“乐哥聊编程“有本篇文章配套视频‍ https://www.bilibili.com/video/BV1cP4y117Qt 类加载器分类 引导类加载器(「Bootstrap ClassLoader...」) 负责加载支撑JVM运行的位于JRE的lib目录下的核心类库,这个加载器是由C++写的,所以我们在java源码里面是找不到它的实现,如果尝试对它进行打印,输出将为空值。...扩展类加载器(「Extension ClassLoader」) 负责加载支撑JVM运行的位于JRE的lib目录下的ext扩展目录中的JAR 类包,也可以使用java.ext.dirs来指定路径,一般保持默认就好...应用程序类加载器(「Application ClassLoader」) 负责加载类路径下的jar包和class文件,我们自己写的代码都是通过这个类加载加载的 自定义类加载器 我们自己去实现的类加载器,其父类加载器为应用程序类加载器...类加载器之间的关系 验证类加载器加载的路径 package com.lglbc.day1; import sun.misc.Launcher; import java.net.URL; /**

    38620

    Java魔法堂:类加载器入了个门

    在JVM启动时将通过Bootstrap ClassLoader加载rt.jar,并初始化sun.misc.Launcher从而创建Extension ClassLoader和System ClassLoader...然后加载器根据请求尝试搜索和加载类,若搜索失败则向子类加载器反馈信息(抛出ClassNotFoundException),然后子类加载器才尝试自己去加载。...另外由于不允许同一个类加载器重复加载同一个类,因此当对同一个类重复进行加载操作时,则通过findLoadedClass方法来返回已有的Class实例。  ...那么我们自定义类加载器时只需重写findClass就可以加载不同路径下的类库了! 六、手动加载类吧,骚年!                      手动加载类的形式是多样的,具体如下:   1....只有当加载该类型的类加载器实例( 非类加载器类型) 为unreachable 状态时,当前被加载的类型才被卸载.

    79450
    领券