SpringBoot解决jar包冲突的问题,简单有效

目录
  • SpringBoot解决jar包冲突
    • 今天SpringBoot项目打包发现一直在报错
    • 我查到的一个解决方案,可使用所有jar包冲突问题
  • spring boot jar冲突问题集锦
    • 1、日志jar包冲突
    • 2、本地ok,测试环境失败之mainstay
    • 3、本地ok,测试环境失败之servlet
    • 4、本地ok,测试环境失败之tomcat
    • 5、本地ok,测试环境失败之spring asm
    • 6、万恶的测试环境字节码验证失败
    • 7、日志不能正常输出问题
    • 8、本地打包正常

SpringBoot解决jar包冲突

今天SpringBoot项目打包发现一直在报错

包jar包冲突,找了好久才找到结果,期间遇到一片博客很讨人厌,我这里想评论一下他(原因:我没有博客园不能直接评论,所以这里写一篇博客记录一下,并提供正确的解决方案)

上图:

说一下:首先,你给的方法很泛(不是烦没打错字)只是市面上大多数可以解决的套路,

再者,你给的解决方案并没有真正的解决问题。所以我留下一句话:不喜勿喷。

SpringBoot事实上是很好的,jar包冲突的时候,它是有提醒你了的,启动第一行就说了有多个类路径jar包存在:Class path contains multiple SLF4J bindings.

SpringBoot适合于小团队及个人开发。是比较方便的。

为什么我要写这篇博客呢,因为我看到jar冲突的真正原因后,很生气,因为原因并不一定在SpringBoot 我这里查出的是腾讯云的cos-api也引入的了日志jar,所以导致冲突,这里是SpringBoot引入cos-api,你就说SpringBoot,如果SpringBoot是被被人引入的,你是不是也要说其他的工具不好呢???再者不好你为什么要用,要记录???这只不过是想比较而言,技术没有老旧,没有好坏,只有喜欢,不喜欢,很多时候有些公司用的还是一二十年前的技术,可能是有些原因不能更换,但是我相信,它能存在在这个世上并风靡一时,说明它一定有它的独特之处。

接下来就是,

我查到的一个解决方案,可使用所有jar包冲突问题

以eclipse为例:

这样的开发工具都会有一个功能:就是查询jar包直接引入/jar包间接引入的功能

如果你不知道你使用的工具怎么找到这个查找页面:百度搜索:eclipse 看引入jar 包的联系(idea同理)

说实话idea的更清晰一些,它是图形化界面

找到冲突的jar包,去除冲突的包即可

代码如下:

<dependency>
	      <groupId>com.qcloud</groupId>
	      <artifactId>cos_api</artifactId>
	      <version>5.5.3</version>
	      <exclusions>
	            <!-- <exclusion>
	                <groupId>ch.qos.logback</groupId>
	                <artifactId>logback-classic</artifactId>
	            </exclusion> -->
	            <exclusion>
	                <groupId>org.slf4j</groupId>
	                <artifactId>slf4j-log4j12</artifactId>
	            </exclusion>
	        </exclusions>
		</dependency>

声明:我只是对SpirngBoot报不平,没有对任何人做人身攻击。不喜勿喷

spring boot jar冲突问题集锦

总结下spring boot项目搭建过程中,冲突解决的一些小经验

1、日志jar包冲突

1.1、日志主要是spring boot自带spring-boot-starter-logging的排除

一是要用log4j2,二是xdcs不排除这个也会有冲突。(隐秘程度:低;重要程度:高)

<exclusion>
<artifactId>spring-boot-starter-logging</artifactId>
<groupId>org.springframework.boot</groupId>
</exclusion>

1.2、引的日志jar颇多

可能会有别的jar里也带了冲突的class,但是不影响启动,属于可排可不排。可能会导致测试环境起不来。(隐秘程度:低;重要程度:高)

//这是举个例子
<exclusion>
<artifactId>slf4j-log4j12</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/Users/xmly/.m2/repository/org/apache/logging/log4j/log4j-slf4j-impl/2.11.2/log4j-slf4j-impl-2.11.2.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/Users/xmly/.m2/repository/org/slf4j/slf4j-log4j12/1.7.5/slf4j-log4j12-1.7.5.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.apache.logging.slf4j.Log4jLoggerFactory]
//这是启动时对应的报错,经检验,这个不影响启动

2、本地ok,测试环境失败之mainstay

发测试时,出现过mainstay的yml解析失败的问题,maven helper排jar包并未显示有冲突,tree搜索mainstay,发现了一些猫腻。passport-sso-api(0.0.14-M3,下面用到的也是这个版本)这个jar包里包含了这个mainstay的jar,最终导致了解析失败。后续登录验证可以接下网关鉴权等方式,这个jar冲突应该就不会出现了。(隐秘程度:高;重要程度:中)

<exclusion>
<artifactId>mainstay-rpc-thrift</artifactId>
<groupId>com.ximalaya.mainstay</groupId>
</exclusion>

3、本地ok,测试环境失败之servlet

发测试时,出现过servlet2和spring boot内置tomcat class重名冲突的问题,一般主要passport-sso-api和xdcs默认会带这个,排掉即可(隐秘程度:中;重要程度:高)

<exclusion>
<artifactId>servlet-api</artifactId>
<groupId>javax.servlet</groupId>
</exclusion>

4、本地ok,测试环境失败之tomcat

发测试时,也出现过passport-sso-api这个jar包里包含的spring-instrument-tomcat和spring boot内置tomcat冲突,排掉即可。后续登录验证可以接下网关鉴权等方式,这个jar冲突应该就不会出现了。(隐秘程度:高;重要程度:中)

<exclusion>
<artifactId>spring-instrument-tomcat</artifactId>
<groupId>org.springframework</groupId>
</exclusion>

5、本地ok,测试环境失败之spring asm

测试环境出现过passport-sso-api里spring asm与spring-boot-test-start冲突的情况,排掉排掉。passport-sso-api这个jar包含的jar比较多,后面建议用注解或者网关鉴权来做登录控制。(隐秘程度:高;重要程度:中)

<exclusion>
<artifactId>spring-asm</artifactId>
<groupId>org.springframework</groupId>
</exclusion>

6、万恶的测试环境字节码验证失败

之前发过一个前项目改造的spring boot项目就出现过,当时不以为意,让jvm参数加了-noverify就没管,后来发现很多项目都有这个问题,开始排查。之前看过jdk和aspectj有冲突的例子,就开始tree里搜aspectj,发现spring-boot-start-aop里引入了1.9.4版本的aspectjweaver,但是当时因为maven helper提示它冲突,就把它排了,后重新排掉所有1.7版本的aspectj,引入1.9.4版本的,解决。(隐秘程度:高;重要程度:高)

<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>${aspectj.version}</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjtools</artifactId>
<version>${aspectj.version}</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>${aspectj.version}</version>
</dependency>
<exclusion>
<artifactId>*</artifactId>
<groupId>org.aspectj</groupId>
</exclusion>

7、日志不能正常输出问题

排除,日志桥接混乱,后台配置的日志格式不支持了

<exclusion>
    <artifactId>slf4j-log4j12</artifactId>
    <groupId>org.slf4j</groupId>
</exclusion>
Configuration:
  status: info
  Properties:
    Property:
      - name: log.level.console
        value: info
      - name: log.path
        value: /var/XXX/weXXX
      - name: project.name
        value: weXXX
      - name: log.pattern
        value: "%-d{yyyy-MM-dd HH:mm:ss SS} [%c]-[%p] %m%n"
  Appenders:
    Console:
      name: CONSOLE
      target: SYSTEM_OUT
      PatternLayout:
        pattern: ${log.pattern}
    RollingRandomAccessFile:
      - name: APP_FILE
        fileName: ${log.path}/${project.name}.log
        filePattern: "${log.path}/${project.name}-%d{yyyy-MM-dd}.log"
        PatternLayout:
          pattern: ${log.pattern}
        Filters:
          ThresholdFilter:
            - level: info
              onMatch: ACCEPT
              onMismatch: DENY
        Policies:
          TimeBasedTriggeringPolicy:
            modulate: true
            interval: 1
        DefaultRolloverStrategy:
          max: 30
  Loggers:
    Root:
      level: info
      AppenderRef:
        - ref: CONSOLE
        - ref: APP_FILE
    Logger:
      - name: app
        level: info
        additivity: false
        AppenderRef:
          - ref: CONSOLE
          - ref: APP_FILE

8、本地打包正常

测试或者线上环境打包失败,查看wrap.log日志,本地配置文件使用线上,打包测试;

spring-boot-maven-plugin插件放在靠后位置,不然打包失败;

<profile>
    <id>uat</id>
    <properties>
        <profileActive>UatXXX</profileActive>
    </properties>
    <build>
        <plugins>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>appassembler-maven-plugin</artifactId>
                <version>2.0.0</version>
                <configuration>
                    <configurationDirectory>conf</configurationDirectory>
                    <repositoryLayout>flat</repositoryLayout>
                    <useWildcardClassPath>true</useWildcardClassPath>
                    <daemons>
                        <daemon>
                            <id>${project.artifactId}</id>
                            <mainClass>com.XXXX.Application</mainClass>
                            <commandLineArguments>
                                <commandLineArgument>--spring.profiles.active=${profileActive}
                                </commandLineArgument>
                            </commandLineArguments>
                            <platforms>
                                <platform>jsw</platform>
                            </platforms>
                            <jvmSettings>
                                <!-- 启动内存配置 -->
                                <initialMemorySize>2048M</initialMemorySize>
                                <maxMemorySize>2048M</maxMemorySize>
                                <maxStackSize>128</maxStackSize>
                                <systemProperties>
                                    <systemProperty>application.root=.</systemProperty>
                                    <systemProperty>spring.application.name=${project.artifactId}
                                    </systemProperty>
                                    <systemProperty>spring.config.location=./conf/${profileActive}/
                                    </systemProperty>
                                </systemProperties>
                                <extraArguments>
                                    <extraArgument>-XX:MetaspaceSize=256M</extraArgument>
                                    <extraArgument>-XX:MaxMetaspaceSize=256M</extraArgument>
                                    <extraArgument>-XX:+UseG1GC</extraArgument>
                                    <extraArgument>-XX:-OmitStackTraceInFastThrow</extraArgument>
                                    <extraArgument>-XX:MaxGCPauseMillis=100</extraArgument>
                                    <extraArgument>-XX:+ParallelRefProcEnabled</extraArgument>
                                    <extraArgument>-XX:+HeapDumpOnOutOfMemoryError</extraArgument>
                                    <extraArgument>-XX:+PrintCommandLineFlags</extraArgument>
                                    <extraArgument>-XX:+PrintGCDetails</extraArgument>
                                    <extraArgument>-XX:+PrintGCDateStamps</extraArgument>
                                    <extraArgument>-verbose:class</extraArgument>
                                    <extraArgument>-XX:+PrintClassHistogramBeforeFullGC</extraArgument>
                                    <extraArgument>-XX:+PrintClassHistogramAfterFullGC</extraArgument>
                                    <extraArgument>-XX:+PrintTenuringDistribution</extraArgument>
                                    <extraArgument>-XX:+PrintHeapAtGC</extraArgument>
                                    <extraArgument>-XX:+PrintGCApplicationStoppedTime</extraArgument>
                                    <extraArgument>-XX:+PrintGCApplicationConcurrentTime</extraArgument>
                                    <extraArgument>-Xloggc:/var/log/${project.artifactId}/gc-%t</extraArgument>
                                    <extraArgument>-XX:+UseGCLogFileRotation</extraArgument>
                                    <extraArgument>-XX:GCLogFileSize=10M</extraArgument>
                                    <extraArgument>-XX:NumberOfGCLogFiles=10</extraArgument>
                                    <extraArgument>-javaagent:/opt/jars/aspectjweaver-1.8.9.jar</extraArgument>
                                </extraArguments>
                            </jvmSettings>
                            <generatorConfigurations>
                                <generatorConfiguration>
                                    <generator>jsw</generator>
                                    <includes>
                                        <include>linux-x86-64</include>
                                        <include>macosx-universal-64</include>
                                    </includes>
                                    <configuration>
                                        <property>
                                            <name>configuration.directory.in.classpath.first</name>
                                            <value>conf</value>
                                        </property>
                                        <property>
                                            <name>wrapper.ping.timeout</name>
                                            <value>60</value>
                                        </property>
                                        <property>
                                            <name>set.default.REPO_DIR</name>
                                            <value>lib</value>
                                        </property>
                                        <property>
                                            <name>wrapper.logfile</name>
                                            <value>/var/XXXX/${project.artifactId}/wrapper.YYYYMMDD.log</value>
                                        </property>
                                        <property>
                                            <name>wrapper.logfile.rollmode</name>
                                            <value>DATE</value>
                                        </property>
                                        <property>
                                            <name>wrapper.logfile.maxfiles</name>
                                            <value>10</value>
                                        </property>
                                        <property>
                                            <name>wrapper.pidfile</name>
                                            <value>/var/XXXX//${project.artifactId}</value>
                                        </property>
                                        <property>
                                            <name>wrapper.java.command</name>
                                            <value>/usr/local/jdk8/bin/java</value>
                                        </property>
                                        <property>
                                            <name>wrapper.disable_restarts</name>
                                            <value>TRUE</value>
                                        </property>
                                        <property>
                                            <name>wrapper.jvm_exit.timeout</name>
                                            <value>5</value>
                                        </property>
                                        <property>
                                            <name>wrapper.shutdown.timeout</name>
                                            <value>5</value>
                                        </property>
                                        <property>
                                            <name>wrapper.cpu.timeout</name>
                                            <value>0</value>
                                        </property>
                                    </configuration>
                                </generatorConfiguration>
                            </generatorConfigurations>
                        </daemon>
                    </daemons>
                </configuration>
                <executions>
                    <execution>
                        <id>generate-jsw</id>
                        <phase>package</phase>
                        <goals>
                            <goal>generate-daemons</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-assembly-plugin</artifactId>
                <configuration>
                    <descriptors>
                        <descriptor>src/main/assembly/assembly.xml</descriptor>
                    </descriptors>
                </configuration>
                <executions>
                    <execution>
                        <id>make-assembly</id>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>${spring.boot.version}</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>build-info</goal>
                        </goals>
                        <configuration>
                            <additionalProperties>
                                <encoding.source>UTF-8</encoding.source>
                                <encoding.reporting>UTF-8</encoding.reporting>
                                <java.source>${java.version}</java.source>
                                <java.target>${java.version}</java.target>
                            </additionalProperties>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</profile>

tips:

1、不要太相信maven helper提示的jar冲突,具体还是要具体分析

2、有些jar冲突网上容易查到,有些基本查不到,可以先去tree搜个短名看看,看看有没有相似的jar,再去查是否真的会有冲突

3、有些是class冲突,找到对应的jar排掉即可,尽量别排spring自带的,容易出现兼容性问题

4、启动时,我已经将一些不必须的autoConfigure排掉了,真要用到,记得放出来,平时用不到的尽量排掉,这样就不会去加载了,不然很多都是默认加载的。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • 详解springboot解决第三方依赖jar包的问题

    公司现在用的是springboot+maven,想要把一些老的项目都改成这种框架.但是一些老的项目中有好多第三方的jar包或者是自己的jar包,maven库上没有.最初的解决方案是一个个的deploy到maven库上,但是遇到太多的三方jar包就太费事了.网上查了一下发现maven有一种方式可以将本地的Jar包依赖到项目中而不需要先deploy到maven库上.具体做法如下: 跟普通的java项目一样,新建个lib目录放jar包,我建在了src下. pom文件中依赖这样写: <!--添加外部依赖

  • Jar包冲突问题原理及解决方案

    背景: 新需求需要引入新jar包,引入后发现本地启动没有报错,发到测试环境提示某个bean无法创建,nested exception is java.lang.VerifyError: Bad type on operand stack. 解决: 1,没有引入新jar包之前是没有提示这个报错了,猜测是jar包冲突. 2,到测试环境的lib目录根据新引入jar包的关键字找到如图所示的jar,图中最下面三个jar是新功能需要引入的jar,多了excelmagic-1.3-20190806.10055

  • 详解Maven JAR包冲突问题排查及解决方案

    前言 写这篇文章的初衷是因为今天在使用mvn dependency:tree命令时,突然想起一年前面试阿里的一道面试题.面试题是说假设线上发生JAR包冲突,应该怎么排查?我那时候的回答是IDEA有个Maven Helper的插件,可以帮忙分析依赖冲突,然后还有一种办法是如果一个类import的时候提示两个地方可导入,那就说明有冲突.现在回头想想确实太不专业了,以下是一次JAR包冲突的一个比较正规的流程,是通过整理几篇博客后总结的希望对大家也有帮助,如果有错误的地方也欢迎指出 GitHub地址:h

  • springboot依赖冲突问题及解决过程

    项目场景: 新搭了一个springboot 2.3.7.RELASE的框架,在集成mysql,tkMapper,mybatis的过程中,启动报错. 问题描述: 提示各种依赖的错误 通过idea的功能解决冲突依赖,尝试了多次,也不行 还尝试过删除可能意外引入的jar: 原因分析: 在之前搭的一个分布式项目里面有这些基础的配置,依赖按照版本拿过来一个个添加,尝试,依然不行. 在旧的项目可以,在这里就不行. 把springboot版本改成和旧项目一样,也不可以. 解决方案: 最后,把代码全部删掉(因为

  • SpringBoot解决jar包冲突的问题,简单有效

    目录 SpringBoot解决jar包冲突 今天SpringBoot项目打包发现一直在报错 我查到的一个解决方案,可使用所有jar包冲突问题 spring boot jar冲突问题集锦 1.日志jar包冲突 2.本地ok,测试环境失败之mainstay 3.本地ok,测试环境失败之servlet 4.本地ok,测试环境失败之tomcat 5.本地ok,测试环境失败之spring asm 6.万恶的测试环境字节码验证失败 7.日志不能正常输出问题 8.本地打包正常 SpringBoot解决jar包

  • 使用maven工具解决jar包冲突或重复加载的问题

    在使用maven开发项目的过程中,经常会遇到jar包重复加载或者jar包冲突的问题的,但是由于有些jar是由于maven的依赖加载自动加载进来的, 而不是开发者自己配置的,特别是当项目中pom中配置的jar包依赖本身很多时,开发者靠自己的经验,有时很难找出是哪个jar的加载导致加载了 多余的依赖jar,从而产生冲突. 今天刚好遇到一个借用eclipse中的maven插件解决jar包依赖冲突的问题,分享一下. 项目中出现的问题如下: Caused by: java.lang.NoClassDefF

  • Maven中jar包冲突原理与解决办法

    Maven中jar包冲突是开发过程中比较常见而又令人头疼的问题,我们需要知道 jar包冲突的原理,才能更好的去解决jar包冲突的问题.本文将从jar包冲突的原理和解决两个方面阐述Maven中jar包冲突的解决办法. 一.Maven中jar包冲突产生原因 MAVEN项目运行中如果报如下错误: Caused by:java.lang.NoSuchMethodError Caused by: java.lang.ClassNotFoundException 十有八九是Maven jar包冲突造成的.那

  • 解决springboot 部署到 weblogic 中 jar 包冲突的问题

    目录 背景 问题1 问题2 背景 某项目,客户要求使用已有的 weblogic 部署已经开发好的 springboot,于是乎对 springboot 进行了部分配置的调整,主要包括去除 tomcat 依赖,增加启动类的处理. 一般都会比较顺利,实际上总会遇到些小问题. 本文不赘述如何在 weblogic 中部署项目,如果你有需要,可以访问https://www.jb51.net/article/218458.htm 参考该文章. 问题1 打包后发布到 weblogic 上启动时,如下图所示的错

  • 完美解决android 项目jar包冲突的问题

    大家在做开发中竟然需要用到一些三方库 或者 需要集成三方的SDK开发包,尤其是项目特别庞大的时候,引用的三方的东西特别多,那么肯定会碰到一些jar包冲突的情况. 常见的情况有以下几种 1.项目自己引用jar包重复 2.项目中jar包和三方SDK 3.三方sdk之间都含有相同类 4.打包时候出现编译错误,出现冲突 1.项目自己引用jar包重复 com.android.dex.DexException: Multiple dex files define Landroid/support/v4/ac

  • 使用Springboot 打jar包实现分离依赖lib和配置

    目录 打jar包实现分离依赖lib和配置 操作步骤 Springboot中jar包分离(分离lib包) jar包分离介绍 jar包分离实施步骤 小结一下 打jar包实现分离依赖lib和配置 为了业务需要配置文件和jar分离,便于使用者修改配置信息,在网上找了很久,最终找到一个简单有效的方法. 操作步骤 打开project工程的pom.xml文件,将下列配置粘贴到pom文件中: <properties> <java.version>1.8</java.version> &

  • Hbase、elasticsearch整合中jar包冲突的问题解决

    问题背景 再数据平台中,项目搭建需要使用es和HBASE搭建数据查询接口,整合的过程中出现jar包冲突的bug :com.google.common.base.Stopwatch.()V from class org.apache.hadoop.hbase.zookeeper.MetaTableLocator org.apache.hadoop.hbase.DoNotRetryIOException: java.lang.IllegalAccessError: tried to access m

  • 浅谈Spring解决jar包依赖的bom

    名词解释: BOM(bill of materials):材料清单,用于解决jar包依赖的好方法. Spring IO Platform 缘起:Spring起初只专注ioc和aop,现在已发展成一个庞大体系.比如security.mvc等.如此一来,不同模块或者与外部进行集成时,依赖处理就需要各自对应版本号.比如,较新spring与较老的quartz,它们集成就会遇到问题,给搭建和升级带来不便.因此Spring IO Platform应运而生,只要项目中引入了它,外部集成时依赖关系无需版本号.官

  • springboot工程jar包部署到云服务器的方法

    首先,springboot在这里不多做介绍了,关于怎么打成jar包,我相信凡是用过的同学都知道吧! 然后就是将jar包上传到云服务器了,这个有好些工具的,博主在这里也不多做说明了! 咱们还是直奔主题吧.... 运行命令:java -jar xxx.jar,然后springboot工程的内置tomcat就开启了,项目已经启动,接下来你就可以访问了. 感觉一切ok,其实你已经掉到坑里了... 怎么回事呢? 当你关闭当前的xshell 命令界面时,再次访问就失效了,why? why? why? 这是因

随机推荐