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

来源:互联网 发布:c语言浮点数表示方法 编辑:程序博客网 时间:2024/06/06 07:11
Spring Boot自带spring-boot-maven-plugin 插件,但是spring-boot-maven-plugin的使用感觉,相关配置太少,并且无法满足方便部署和运行的需求。
这里我们使用了,Maven的如下插件:
               maven-compiler-plugin  java编译插件,可以配置jdk版本
               maven-jar-plugin  负责将应用程序打包成可执行的jar文件 
               maven-assembly-plugin  负责将整个项目按照自定义的目录结构打成最终的压缩包,方便实际部署

项目目录结构:



项目目录结构介绍

(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中抽离

打包后的目录结构:

 
最终的可运行文件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&
阅读全文
0 0
原创粉丝点击