前言
我们在实际工作中往往会遇到这样的问题,我们项目依赖的一些jar 包升级了,修复了一些漏洞,为了安全考虑,我们也需要进行升级,通常来说,我们不会深度的用到依赖的jar 包,所以升级一个小版本直接替换就完事了。
但是Springboot项目并没有我们想的那么简单。

打包方式
首先还得从打包方式说起,我们使用的打包方式不是直接将将依赖的jar 和配置文件都打在可运行的jar 中。我们打包方式如下:
pom.xml 文件:
 

<build>
		<!--打包后的项目名称 -->
		<resources>
			<resource>
				<directory>src/main/resources</directory>
				<targetPath>${project.build.directory}${file.separator}classes</targetPath>
			</resource>
			<resource>
				<directory>src/main/java</directory>
				<includes>
					<!-- 这里必须包含.xml否则Mybatis的xml无法打包 -->
					<include>**/*.xml</include>
				</includes>
				<filtering>true</filtering>
			</resource>
		</resources>
		<plugins>
			<!-- java编译插件 -->
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-compiler-plugin</artifactId>
				<configuration>
					<source>1.8</source>
					<target>1.8</target>
					<encoding>UTF-8</encoding>
					<fork>true</fork>
				</configuration>
			</plugin>
			<!-- 打jar包的插件 -->
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-jar-plugin</artifactId>
				<configuration>
					<archive>
						<manifest>
							<addClasspath>true</addClasspath>
							<classpathPrefix>lib</classpathPrefix>
							<!-- 程序启动入口 -->
							<mainClass>cn.mastercom.statistics.SdzzStatisticsApplication</mainClass>
						</manifest>
						<manifestEntries>
							<Class-Path>./</Class-Path>
						</manifestEntries>
					</archive>
					<excludes>
						<exclude>config/**</exclude>
						<exclude>/**/*.xml</exclude>
						<exclude>/**/*.properties</exclude>
					</excludes>
				</configuration>
			</plugin>
			<plugin>
				<artifactId>maven-assembly-plugin</artifactId>
				<configuration>
					<!-- not append assembly id in release file name -->
					<appendAssemblyId>false</appendAssemblyId>
					<descriptors>
						<!-- 注意这里的路径 -->
						<descriptor>src/main/build/package.xml</descriptor>
					</descriptors>
				</configuration>
				<executions>
					<execution>
						<id>make-assembly</id>
						<phase>package</phase>
						<goals>
							<goal>single</goal>
						</goals>
					</execution>
				</executions>
			</plugin>
		</plugins>
	</build>

package.xml 文件内容如下:

<?xml version="1.0" encoding="UTF-8"?>  
<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3 http://maven.apache.org/xsd/assembly-1.1.3.xsd">  
    <id>package</id>  
    <formats>  
        <format>zip</format>
    </formats>  
    <!-- 改为false不会出现两层相同的目录 -->
    <includeBaseDirectory>false</includeBaseDirectory>  
    <fileSets>  
        <fileSet>
            <directory>bin</directory>
            <outputDirectory>${file.separator}</outputDirectory>  
        </fileSet>  
        <fileSet>  
            <directory>src/main/resources</directory>  
            <outputDirectory>${file.separator}</outputDirectory>  
            <excludes>
            	<exclude>static/**</exclude>
            	<exclude>templates/**</exclude>
            </excludes>
        </fileSet>  
        <fileSet>  
            <directory>${project.build.directory}</directory>
            <outputDirectory>${file.separator}</outputDirectory>
            <includes>  
                <include>*.jar</include>  
            </includes>  
        </fileSet>  
    </fileSets>  
    <dependencySets>  
        <dependencySet>  
    <useProjectArtifact>true</useProjectArtifact>
            <outputDirectory>lib</outputDirectory>  
            <scope>runtime</scope>  
            <!--<unpack>false</unpack> -->
            <excludes>  
                <!--<exclude>${project.name}-${project.version}</exclude> -->
                <exclude>${groupId}:${artifactId}</exclude>
            </excludes>  
        </dependencySet>  
    </dependencySets>  
</assembly>

最后实现的效果是,依赖jar 和配置文件外置。

springboot 升级依赖的第三方jar包_jar

springboot 升级依赖的第三方jar包_hive_02

升级

上面可以看到,我们依赖的jar 都存在lib 中了,那比如说要升级一个fastjson

springboot 升级依赖的第三方jar包_jar_03

如果仅仅这样修改,启动项目的时候,会发现报错,运行不起来。
造成这个原因是我们打包方式导致的,我们这样打包,在运行jar 包中有一个lib中jar 文件的索引,如果我们仅仅替换了jar。那这个索引就找不到对应的文件了。所以需要修改索引,怎么修改呢?
需要修改运行jar中的MANIFEST.MF 文件。

springboot 升级依赖的第三方jar包_xml_04

这样修改之后就可以启动成功了。
如果觉得这样麻烦,我们也可以修改项目的pom文件,将要升级的jar 进行升级,然后重新打包,替换升级的jar 和可运行的jar 可以达到一样的效果。