(九)Spring Boot将程序打成可执行jar包,并将配置文件从jar包中分离出来

时间:2021-02-10 09:16:46
Spring Boot自带spring-boot-maven-plugin 插件,但是spring-boot-maven-plugin的使用感觉,相关配置太少,并且无法满足方便部署和运行的需求。
这里我们使用了,Maven的如下插件:
               maven-compiler-plugin  java编译插件,可以配置jdk版本
               maven-jar-plugin  负责将应用程序打包成可执行的jar文件 
               maven-assembly-plugin  负责将整个项目按照自定义的目录结构打成最终的压缩包,方便实际部署

项目目录结构:

(九)Spring Boot将程序打成可执行jar包,并将配置文件从jar包中分离出来

项目目录结构介绍

(1).config : #将Spring的一些xml配置更改为基于java的配置,比如:整合Mybatis 整合Druid数据源,这些配置中一些基本配置都是写死的,因为它们不是经常变化的(可以参考前面写的一些博客)
(2).HelloApplication : #Spring Boot启动入口,内含main方法
(3).(4).(5).src/main/resources/config : 
    application.properties : #该文件放到src/main/resources下也是可以加载的
    logback-spring.xml : #日志文件,默认要放到src/main/resources下,如果放到src/main/resources/config下,就需要在application.properties中配置logging.config=classpath:config/logback-spring.xml
    path.properties : #放置一些调用第三方服务的接口地址,避免放在application.properties造成数据太多
(6).src/main/resources/static : #css,js,图片等静态资源存放路径
(7).src/main/resources/templates : #Thymeleaf模板,动态页面,类似于jsp
(8).src/main/build : #package.xml 中存放这篇博客的核心,就是将 配置文件从jar中抽离

打包后的目录结构:

  (九)Spring Boot将程序打成可执行jar包,并将配置文件从jar包中分离出来
最终的可运行文件jar文件并不包含依赖的jar包,和打包前src/main/resources/config中的配置文件, 所有依赖的jar包都放在和可运行文件jar文件平行的lib文件夹内,这样如果以后想快速部署,就不用每一次都把体积很大的lib包都要传一遍,除非依赖包有所变化,当然这些都是后续如果想这么做的前提,我这里还是为了使部署的文件比较规整 

这里的pom.xml中的build配置文件如下:

<build>
  	<!--打包后的项目名称  -->
  	<finalName>com.springboot.example</finalName>
  	<resources>
        <resource>
            <directory>src/main/resources</directory>
            <targetPath>${project.build.directory}\classes</targetPath>
            <excludes>
            	<!-- 这里不能排除config/**,这里是myeclipse的编译环境,不是打包的,排出之后,
            	myeclipse中classpath下将找不到config,会报错
            	 -->
                <!-- <exclude>config/**</exclude> -->
            </excludes>
        </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.7</source>
				<target>1.7</target>
				<encoding>UTF-8</encoding>
			</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>com.test.springboot.HelloApplication</mainClass>
                    </manifest>
                    <manifestEntries>
                        <Class-Path>./</Class-Path>
                    </manifestEntries>
                </archive>
                <excludes>
                    <exclude>config/**</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>
maven-jar-plugin的配置:
其中manifest的部分是核心,在可执行的jar文件中,打包后会在jar文件内的META-INF文件夹下,生成一个MANIFEST.MF文件,里面记录了可执行文件的一些相关配置,比如像上面一段代码中所配置的内容,这里面就配置了可执行jar文件未来读取classpath的相对目录位置在什么地方,以及引入的jar文件都有哪些
mainClass配置表示,哪个class作为程序的入口来执行 
addClasspath配置表示,是否将依赖的classpath一起打包 
classpathPrefix配置表示,依赖的classpath的前缀,也就是打包后生成的MANIFEST.MF文件里,引入的jar文件都会加上前缀,lib/,比如fastjson-1.2.7.jar,在mainfest文件里就会是lib/fastjson-1.2.7.jar 
excludes配置表示,排除哪些文件夹不被打包进去 


package.xml的文件内容 :

重点的就是package.xml了,使用maven-assembly-plugin的相关配置实际上都在这个文件里面,注意路径:在myeclipse中 点击项目右击-->new-->source folder--然后输入src/main/build 
<?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>  
            <outputDirectory>lib</outputDirectory>  
            <scope>runtime</scope>  
            <!--<unpack>false</unpack> -->
            <excludes>  
                <!--<exclude>${project.name}-${project.version}</exclude> -->
                <exclude>${groupId}:${artifactId}</exclude>
            </excludes>  
        </dependencySet>  
    </dependencySets>  
</assembly>
这里面我配置了,最终压缩的文件格式,为zip,也就是最终打包出来的是一个zip的文件,然后发布到服务器上进行解压部署,相关我要的配置都在这个压缩包内,
解压后使用命令后台启动: nohup java -jar xxx.jar >/dev/null&