IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> 【原创】解决SpringBoot在部署过程中出现大量jar包冲突的问题 -> 正文阅读

[Java知识库]【原创】解决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包冲突的问题了。

?

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-04-29 11:57:32  更:2022-04-29 11:58:32 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 2:17:19-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码