首页
学习
活动
专区
圈层
工具
发布

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

SLF4J: Found binding in [jar:file:/home/admin/xxx/WEB-INF/lib/slf4j-log4j12-1.6.1.jar!...jvm 加载包名和类名相同的类时,先加载classpath中jar路径放在前面的,包名类名都相同,那jvm没法区分了,如果使用ide一般情况下是会提示发生冲突而报错,若不报错,只有第一个包被引入(在classpath...logback 包中 StaticLoggerBinder 在 WEB-INF/lib 下比较 inode 大小(正常解压和启动 logback < slf4j) ll -i logback-classic...在 WEB-INF/lib 路径下,先将这两个包删掉,尝试有不同的上传顺序,模拟 tomcat 解压 war 包 [admin@uat-96-0-248 lib]$ rm logback-classic...Exclude 工具检测:解决Maven依赖冲突的好帮手,这款IDEA插件了解一下?

3.2K10

深入解析Tomcat类加载隔离与热加载实现原理

当收到类加载请求时,它会优先检查本地缓存(findLoadedClass()),接着尝试从WEB-INF/classes目录和WEB-INF/lib下的jar包中加载(findClass()),最后才会委托给父加载器...则会加载其WEB-INF/lib下的commons-lang-3.12.0.jar 两个版本的类在JVM中被视为完全不同的类,即使包名和类名相同 隔离的关键在于每个WebAppClassLoader实例都维护着自己的类缓存...当启用热加载功能时(通过Context配置中的reloadable="true"参数),Tomcat会启动一个后台线程,持续扫描WEB-INF/classes和WEB-INF/lib目录下的文件变更。...传统JVM的双亲委派机制会导致先加载的版本覆盖后加载的版本,而Tomcat的WebAppClassLoader通过以下方式实现隔离: 类加载路径隔离:每个Web应用的/WEB-INF/lib和/WEB-INF.../data/app1/WEB-INF/lib/fastjson-1.2.70.jar 应用B加载路径:/data/app2/WEB-INF/lib/fastjson-2.0.1.jar 解决方案: 通过

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

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

    作为一个Web容器,Tomcat要解决什么问题 , Tomcat 如果使用默认的双亲委派类加载机制能不能行?...部署在同一个web容器中相同的类库相同的版本可以共享, 比如jdk的核心jar包,否则,如果服务器有n个应用程序,那么要有n份相同的类库加载进虚拟机。...jsp 文件其实也就是class文件,那么如果修改了,但类名还是一样,类加载器会直接取方法区中已经存在的,修改后的jsp是不会重新加载的。那么怎么办呢?...该类加载器会加载位于 WEB-INF/lib下的jar文件中的class 和 WEB-INF/classes下的class文件。...包) 3 使用WebAppClassLoader 加载 WEB-INF/classes (应用自定义的class) 4 使用WebAppClassLoader 加载在WEB-INF/lib (应用的依赖包

    1.2K30

    maven依赖中scope=compile和provided区别

    比如说,假定我们自己的项目ProjectABC 中有一个类叫C1,而这个C1中会import这个portal-impl的artifact中的类B1,那么在编译阶段,我们肯定需要这个B1,否则C1通不过编译...那么最后我们要吧ProjectABC部署到Liferay服务器上了,这时候,我们到$liferay-tomcat-home\webapps\ROOT\WEB-INF\lib下发现,里面已经有了一个portal-impl.jar...了,换句话说,容器已经提供了这个artifact对应的jar,所以,我们在运行阶段,这个C1类直接可以用容器提供的portal-impl.jar中的B1类,而不会出任何问题。...做一个实验就可以很容易发现,当我们用maven install生成最终的构件包ProjectABC.war后,在其下的WEB-INF/lib中,会包含我们被标注为scope=compile的构件的jar...:tomcat中也有servlet-api包,这样,发生了冲突 解决方法:添加provided,因为provided表明该包只在编译和测试的时候用,所以,当启动tomcat的时候,就不会冲突了,完整依赖如下

    3.4K20

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

    SLF4J: Found binding in [jar:file:/home/admin/xxx/WEB-INF/lib/slf4j-log4j12-1.6.1.jar!...---- 解决方法 ① 通过 POM 文件排查包冲突 ② 安装 IDEA 的插件 Maven Helper ③ 定位到编译 WAR 包的 POM 文件(我们框架定义的在 Deploy 模块中) ?...jvm 加载包名和类名相同的类时,先加载classpath中jar路径放在前面的,包名类名都相同,那jvm没法区分了,如果使用ide一般情况下是会提示发生冲突而报错,若不报错,只有第一个包被引入(在classpath...,如果有两个同名的包但是不同版本,例如 xxx-1.1和 xxx-1.2包同时存在,先加载了 1.1 版本的类,但是 1.2 版本中才提供了新方法,导致提示找不到特定方法 java.lang.NoClassDefFoundError...,java.lang.LinkageError 排查思路 1、查看 catalina.sh 堆栈信息,找到有问题的类 2、通过 IDEA ,在打包的 POM 文件中,使用 Maven Helper 插件找出冲突的依赖

    1.9K20

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

    对于纯手动添加jar包的项目已经是多年前的方式了,现在工作三五年的技术人员可能都没有经历过。就是把项目中所需的jar包挨个找出来,添加到一个lib目录中,在IDE中再将jar包依赖手动添加上。...抛出java.lang.NoSuchMethodError:找不到特定的方法。Jar包冲突,导致选择了错误的依赖版本,该依赖版本中的类对不存在该方法,或该方法已经被升级。...Tomcat启动时Jar包和类的加载顺序 最后,梳理一下Tomcat启动时,对Jar包和类的加载顺序,其中包含上面提到的不同种类的类加载器默认加载的目录: $java_home/lib 目录下的java...; 项目路径/WEB-INF/classes下的class文件; 项目路径/WEB-INF/lib下的jar文件; 上述目录中,同一文件夹下的Jar包,按照顺序从上到下一次加载。...如果一个class文件已经被加载到JVM中,后面相同的class文件就不会被加载了。

    2.7K30

    IntelliJ IDEA 中的 Maven 项目初体验及搭建 Spring MVC 框架

    在「详述 IntelliJ IDEA 创建 Maven 项目及设置 java 源目录的方法」一文中,我们已经将 IntelliJ IDEA 中的 Maven 项目的框架搭建完成。...,用于测试 Spring MVC 框架;在WEB-INF目录下,新建了一个pages目录,用于存放jsp页面,并新建了一个名为springmvc-servlet.xml的文件,用于书写 Spring MVC...pom.xml中添加了该jar的依赖,好吧,冲突种子就在这里种下啦!...实际上,在 Tomcat 的lib目录中,已经包含上述两个jar包: [jar] 解决方法:如果是 Maven 项目,就删除pom.xml文件中对servlet-api.jar和jsp-api.jar的依赖...如果还解决不了问题的话,呃,再检查检查 IntelliJ IDEA 的 Java 编译器的版本吧,囧!

    2.6K110

    pinpoint插件开发之一:牛刀小试,调整gson插件

    ; pinpoint对Gson类的监控 在之前的《Docker下,极速体验pinpoint1.6.3》一文中,我们在tomcat上部署了一个web应用,里面有这么一段代码: public String.../apache-tomcat-8.0.36/webapps/ROOT/WEB-INF/lib/ rm -f /usr/local/work/tomcat-web/apache-tomcat-8.0.36...-1.6.3-SNAPSHOT.jar /usr/local/work/tomcat-web/apache-tomcat-8.0.36/webapps/ROOT/WEB-INF/lib/ 以上命令将pinpoint-collector...在当前电脑的命令行执行docker restart tomcat001重启容器; 验证新的插件 验证前,请确保web应用已经按照《Docker下,极速体验pinpoint1.6.3》中的方式部署到了tomcat001...重启agent上的业务的web server; 以上只是修改了原有插件,接下来的实战中,我们一起创建一个全新的插件,实现我们需要的功能;

    1.3K50

    Tomcat - 模拟Tomcat的webappClassLoader加载自己war包应用内不同版本类实现相互共存与隔离

    作为一个Web容器,Tomcat要解决什么问题 , Tomcat 如果使用默认的双亲委派类加载机制能不能行?...部署在同一个web容器中相同的类库相同的版本可以共享, 比如jdk的核心jar包,否则,如果服务器有n个应用程序,那么要有n份相同的类库加载进虚拟机。...第一个问题,如果使用默认的类加载器机制,肯定是无法加载两个相同类库的不同版本的,如果使用双亲委派,让父加载器去加载 ,不管你是什么版本的,只要你的全限定类名一样,那肯定只有一份,APP 隔离 无法满足...jsp 文件其实也就是class文件,那么如果修改了,但类名还是一样,类加载器会直接取方法区中已经存在的,修改后的jsp是不会重新加载的。那么怎么办呢?...该类加载器会加载位于 WEB-INF/lib下的jar文件中的class 和 WEB-INF/classes下的class文件。 4.

    1.2K20

    Java学习笔记(九)——记录一次关于slf4j的线上问题排查

    那么问题来了,加载的顺序又是根据什么规则呢,于是又google一下发现加载顺序如下: 1. $java_home/lib 目录下的java核心api 2....$java_home/lib/ext 目录下的java扩展jar包 3. java -classpath/-Djava.class.path所指的目录下的类与jar包 4....$CATALINA_BASE/shared目录下按照文件夹的顺序从上往下依次加载 7. 我们的项目路径/WEB-INF/classes下的class文件 8....我们的项目路径/WEB-INF/lib下的jar文件 在同一个文件夹下,jar包是按顺序从上到下依次加载 根据这个规则,slf4j的两个包都是在/WEB-INF/lib下的,我特意去看了下lib下的jar...总结 由于时间有限,这个问题没有再去深入理解,好在问题得到了解决,项目也顺利上线稳定运行了。 但是这个困惑还是希望能解决的,如果有知道的小伙伴可以说明下,近期有时间的话我也会再次研究下的。

    65020

    活久见!64 张图带你 Maven 实战通关

    Maven 概述 看完本篇文章后相信你对 Maven 的理解能更进一步 常规项目开发存在的问题 通常 Web 项目 开发只会创建一个工程,然后所有的 jar 包都会存放到 WEB-INF/lib 目录下...如果项目比较庞大,那么利用包名 package 来划分模块,显然容易造成混淆而且不利于分工合作; 项目中需要的 jar 包必须手动复制,粘贴到 WEB-INF/lib 目录下。...依赖的冲突 在 maven 中存在两种冲突方式:一种是跨 pom 文件的冲突,一致是同一个 pom 文件中的冲突。 「跨 pom 文件,路径最短者优先」。...tomcat 插件,首先我们要知道如何创建 Maven Web 工程。...那么如何管理各个工程中对于某个 jar 包的版本呢? 「解决办法:」 将那个 jar 包版本统一提取到 父 工程中,在子工程中声明依赖时不指定版本,以父工程中统一设定的为准,同时也便于修改。

    86931

    Spring boot 项目打出来的包启动过程

    war 结构的 fat jar 下面的WEB-INF下多出来一个 lib-provided 目录用来防 embed tomcat 的 jar Spring-Boot-Classpath-Index 的作用...=true 不分层的时候就是一个fat jar 放到容器中,如果是分层后,就会将fat jar 中的文件根据此 layers.idx 中 定义,提取各层的文件,然后从底层到高层分四次加入到 Image...如果想要查看类加载时,的细节可以调试 java.net.URLClassLoader#findClass 通过遍历loaders,也就是遍历每一个jar中是否存在 对应的 .class 文件,如果找到了返回...2、筛选出Archive中的 Archive(BOOT-INF/classes目录和 BOOT-INF/lib下的每个jar ,如果是war包,则是WEB-INF/classes目录和WEB-INF/...lib和WEB-INF/lib-provided下的每个jar): image.png 3、创建LaunchedURLClassLoader: image.png 4、设置当前线程的类加载器为上面的LaunchedURLClassLoader

    2K30

    java war包是什么_jar包和war包区别是什么?

    在 JAR 中包含特殊的文件,如 manifests 和部署描述符,用来指示工具如何处理特定的 JAR。 简单来说,jar包就是别人已经写好的一些类,然后对这些类进行打包。...可以将这些jar包引入到你的项目中,可以直接使用这些jar包中的类和属性,这些jar包一般放在lib目录下。...通常在WEB-INF目录下含有一个web.xml文件和一个classes目录, web.xml是这个应用的配置文件, 而classes目录下则包含编译好的servlet类和jsp,或者servlet所依赖的其他类...通常这些所依赖的类也可以打包成jar包放在WEB-INF下的lib目录下。...如果一个Web应用程序的目录和文件非常多,那么将这个Web应用程序部署到另一台机器上,就不是很方便了, 这时可以将Web应用程序打包成Web 归档(WAR)文件,这个过程和把Java类文件打包成JAR文件的过程类似

    2.1K10

    maven入门基础学习

    * 统一管理项目所用到的依赖包 * 自动解决第三方组件和maven共同用到jar冲突重复问题 ( 例如 tomcat里自带 jsp,servlet 包 ) * 方便第三方插件的及集成 (不知 * 实现不同项目的兼容性管理...:如果是普通的 java 项目,那么就没有webapp 目录 三 、 maven的Archetype原型 1.Archetype是什么?...* 一个包含junit依赖声明的pom.xml * src/main/java主代码目录及一个名为App的类 * src/test/java测试代码目录及一个名为AppTest...* src/main/webapp/WEB-INF/web.xml文件 四 、 maven工作原理 1.maven项目如何找到依赖包呢?...jsp-api这些包(编译、测试 有效, 运行时无效, 防止和 tomcat 下 jar 冲突tomcat的servlet jsp包,如果默认complie编译器编译的时候包重复的错误)

    94720

    Tomcat 工作原理、使用方法和错误汇总

    可能存在的问题 数据库账号密码错误 有多个数据库配置源 jar包问题,把连接jdbc的jar包,拷贝到tomcate的lib目录下就可以了,如:ojdbc14.jar 服务器内存冲突,重启系统 Tomcat...中注册自己的监听器,问题解决。...2.3 lib1.so: lib2.so: 无法打开共享对象文件: 没有那个文件或目录 (1)如果共享库文件安装到了/lib或/usr/lib目录下, 那么需执行一下ldconfig命令 (2)...# ldconfig (3) export LD_LIBRARY_PATH=…/webapps/项目名称/WEB-INF/classes 参考链接:https://www.cnblogs.com...改进:1.把jsp中的业务逻辑写入单独的类,在jsp中通过调用这个类的静态方法来执行;2.将jsp页面中的js提取出来放到单独的js文件内。

    1.3K50

    「Jenkins+Git+Maven+Shell+Tomcat持续集成」经典教程

    亮点 1.采用shell自定义脚本,控制集成部署环境更加方便灵活 2.精简war包中的lib包,常驻tomcat里,减少war包传输时间 3.Jenkins 用户权限管理,不让淘气鬼乱动 4.构建失败发邮件通知相关人员解决...构建,不过插件所占内存比较大,需要增大tomcat虚拟机内存配置,不然会内存溢出,个人觉得如果一个团队人很多的话,选择poll更适合并且时间间隔设置长一些,避免频繁构建,gitlab-hook 适合人很少甚至一个人的情况...分享我的Shell mv ~/.jenkins/jobs/server/workspace/server/target/server/WEB-INF/lib/common-0.1-SNAPSHOT.jar.../server,${catalina.home}/lib/server/*.jar 此时Tomcat运行前会加载server下的lib包,如果是多个项目公用一个tomcat的时候,就需要这里放公共的lib.../加入git版本库里即可,该目录下包含Jenkins所有信息,包括每次构建历史信息和历史jar包 进行全备份然后覆盖掉该文件夹的时候,重新构建JOB会出现文件夹已经存在等exception,只需要手动删掉这些目录即可

    76510
    领券