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


    前言
    我们在实际工作中往往会遇到这样的问题,我们项目依赖的一些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 和配置文件外置。

    升级

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

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

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

  • 相关阅读:
    HTTP协议入门
    TCP/IP的分层管理
    TCP与UDP
    如何处理某个Web页面的HTTP请求
    AGC005D ~K Perm Counting
    “玲珑杯” 线上赛Round #17 B 震惊,99%+的中国人都会算错的问题
    bzoj4455 [Zjoi2016]小星星
    AGC010F Tree Game
    AGC016E Poor Turkeys
    AGC003E Sequential operations on Sequence
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13317274.html
Copyright © 2020-2023  润新知