【原创】解决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包)

扫描二维码关注公众号,回复: 14574269 查看本文章
            <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包冲突的问题了。

猜你喜欢

转载自blog.csdn.net/DCTANT/article/details/124462697
今日推荐