原创解决SpringBoot在部署过程中出现大量jar包冲突的问题
Posted DCTANT
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了原创解决SpringBoot在部署过程中出现大量jar包冲突的问题相关的知识,希望对你有一定的参考价值。
前言
目前项目上有个数据迁移类型的项目需要将老ES的数据迁移到mysql中,然后由于ES的版本为5.X导致用的引入ES框架的POM就非常老,结果导致项目部署后出现了大量的jar包冲突,但是在IDEA本地却能够正常启动,这就让我感觉有点匪夷所思,这也是这篇博客灵感的来源,嘿嘿O(∩_∩)O
1、安装jar包检查冲突插件
第一步最简单,在IDEA中装一个检查jar包冲突的插件:Maven Helper
首先这个工具就能列出所有存在冲突的jar包,比如我这个项目,简直可以用惨不忍睹来形容!注意选择的pom.xml最好是最后用来打包的子模块pom.xml,这样是最全的,然后去功能模块中去排除这些多余的jar包,例如:
这样就排除了古董ES包中的snakeyaml和jackson-core这两个会导致jar冲突的地方。
然后我发现这远远还不够!还有其他很多jar包冲突
当时的报错日志:
2、更换项目打包方式
我之前使用过打full包的方式打SpringBoot的jar包,但是这些jar包全被封死在了整个full包中很难修改,因此需要换打包方式,让其暴露在外,便于修改
SpringBoot全包的打包方式(full包)
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.3.9.RELEASE</version>
<configuration>
<finalName>$project.build.finalName</finalName>
<mainClass>********</mainClass>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
注意:mainClass需要填写自己项目的SpringBoot启动类
然后改为Dependency+Assemble的方式进行打包
<!--设置jar所依赖的三方jar包存放的路径-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy-dep</id>
<phase>prepare-package</phase>
<goals>
<goal>
copy-dependencies
</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<finalName>$project.build.finalName</finalName>
<appendAssemblyId>false</appendAssemblyId>
<descriptors>
<descriptor>build/package.xml</descriptor>
</descriptors>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
其中的build/package.xml需要自己建立,填写方式可以参考其他博客,我这边就不过多赘述了
Maven打包插件maven-assembly-plugin配置_恨水不成冰9520的博客-CSDN博客_maven-assembly-plugin
maven-assembly-plugin配置打包 - 风雨无阻415 - 博客园
项目启动脚本需要改为java -cp的方式,cp即classpath,通过执行classpath来让项目启动加载哪些jar包
像我这边打包后是bin目录下放启动脚本,conf下放配置文件,lib下放所有dependency的jar包,那我的启动命令就是:
java -cp ../conf:../lib/* 包名.Application
最后的包名.Application就是你项目的启动类的全路径。
3、想想凭什么IDEA中能够正常启动
终于到了最关键的一步了,我就好奇了凭什么IDEA中能够启动成功,而部署后就没法启动了呢?何不看一下IDEA中的项目启动命令?
IDEA项目的启动命令就是控制台打印的第一行:
别犹豫了,把这一行全部拷出来,贴到记事本中
哇!这么多看的眼花缭乱的,不是吗?没错!!这就是我们要找的答案了!!由于项目起不来肯定是jar包的版本冲突了,直接拿IDEA用的版本号不就行了?它能把项目起起来,你当然也能拿着IDEA提供的答案把项目起起来。结合Maven Helper提供的冲突jar包的线索,配合项目启动时报的错,很容易就能找的版本冲突的jar包。
拿我上面的报错图举个例子,它报的是spring-data-commons的包有问题,我看了一下项目打包部署的版本是2.1.8.RELEASE,而IDEA中用的是2.3.9.RELEASE,很明显部署时的包版本错了,我立马把这个spring-data-commons-2.1.8.RELEASE.jar删了,从IDEA显示的路径中把spring-data-commons-2.3.9.RELEASE.jar放上去,重新启动项目,发现报错信息直接变了,然后不停重复这个过程,直到整个项目都顺利起起来,至此这个大量jar包冲突的问题解决了。
后面如果代码需要更新,只需要更换项目改的那几个jar包即可,之前的jar包都不用动了。即使对外提供项目,也只需要将目前的项目整体打个包即可,完全不用再管那些jar包冲突的问题了。
以上是关于原创解决SpringBoot在部署过程中出现大量jar包冲突的问题的主要内容,如果未能解决你的问题,请参考以下文章
[原创]-在Idea中使用Alibaba Cloud Toolkit将SpringBoot项目部署到ECS服务器
[原创]-在Idea中使用Alibaba Cloud Toolkit将SpringBoot项目部署到ECS服务器
idea中SpringBoot热部署时mapping偶然出现丢失的问题。
Linux 中启动 SpringBoot 项目出现 java.lang.OutOfMemoryError Java heap space 错误
Linux 中启动 SpringBoot 项目出现 java.lang.OutOfMemoryError Java heap space 错误