一,前言
SpringBoot应用常规部署方式是将其打成一个可执行jar包,使其能够通过java -jar xxx.jar命令方式进行启动,因此需要使用Maven等工具进行打包。
二,Maven打包
Springboot应用最简单打包方式:在pom.xml文件中添加相应的打包插件,具体代码如下:
1 <build>
2 <plugins>
3 <plugin>
4 <groupId>org.springframework.boot</groupId>
5 <artifactId>spring-boot-maven-plugin</artifactId>
6 <configuration>
7 <fork>true</fork>
8 </configuration>
9 </plugin>
10 </plugins>
11 </build>
这样打包出来的jar文件比较大,包含了依赖包,以及配置文件等等,然而在实际使用过程中,我们发现那些依赖的jar包是很少会变动的,而且这部分文件也比较大,所以我们最好是可以将可执行的jar包和这些依赖jar包分开;另外,对于一些静态的配置文件,如.proterties,.xml,*.yml等文件,有的时候需要在不重新发布的情况下进行修改,这样,我们也可以将这些配置文件也和可执行jar文件分开。于是我们可以将最终打出来的包分为三个部分:可执行jar文件;依赖jar包文件;配置文件,我们将依赖jar包放入lib文件夹下面,配置文件放入config文件夹下面,最后将这三部分文件打成一个zip包,然后放到对应服务器上解压后运行,下面我们来看看具体配置。
1.指定java编译插件
1 <plugin>
2 <groupId>org.apache.maven.plugins</groupId>
3 <artifactId>maven-compiler-plugin</artifactId>
4 <configuration>
5 <source>1.8</source>
6 <target>1.8</target>
7 <encoding>UTF-8</encoding>
8 </configuration>
9 </plugin>
指定java版本以及编码格式。
2.可执行jar文件打包
1 <plugin>
2 <groupId>org.apache.maven.plugins</groupId>
3 <artifactId>maven-jar-plugin</artifactId>
4 <configuration>
5 <archive>
6 <manifest>
7 <addClasspath>true</addClasspath>
8 <classpathPrefix>lib</classpathPrefix>
9 <!-- 程序启动入口 -->
10 <mainClass>com.wf.blog.Application</mainClass>
11 </manifest>
12 <manifestEntries>
13 <Class-Path>./</Class-Path>
14 </manifestEntries>
15 </archive>
16 </configuration>
17 <executions>
18 <execution>
19 <phase>prepare-package</phase>
20 <goals>
21 <goal>jar</goal>
22 </goals>
23 <configuration>
24 <excludes>
25 <exclude>mybatisGenerator/**</exclude>
26 <exclude>config/**</exclude>
27 <exclude>*.properties</exclude>
28 </excludes>
29 </configuration>
30 </execution>
31 </executions>
32 </plugin>
<Class-Path>./</Class-Path>
表示将jar文件所在目录设置成claspath路径;在进行可执行jar文件打包的时候需要将一些不需要的文件排除在外,如一些和运行无关的,以及一些分离的配置,通过<excludes>
进行处理,这样打出来的jar包就只包含本应用的基本内容,class文件以及一些必须打进jar包的配置文件。
三,assembly插件打包
最后需要将配置文件依赖jar包以及上面打出来的可执行jar文件一起打包成zip文件,这里需要使用到maven的assembly插件,新建src/main/build文件夹,并新建一个package.xml文件,具体打包实现在这个文件里面做的,在pom.xml文件我们需要将其指定到此文件:
1 <plugin>
2 <artifactId>maven-assembly-plugin</artifactId>
3 <configuration>
4 <!-- not append assembly id in release file name -->
5 <appendAssemblyId>false</appendAssemblyId>
6 <descriptors>
7 <!-- 注意这里的路径 -->
8 <descriptor>src/main/build/package.xml</descriptor>
9 </descriptors>
10 </configuration>
11 <executions>
12 <execution>
13 <id>make-assembly</id>
14 <phase>package</phase>
15 <goals>
16 <goal>single</goal>
17 </goals>
18 </execution>
19 </executions>
20 </plugin>
package.xml具体实现如下:
1 <?xml version="1.0" encoding="UTF-8"?>
2 <assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3 xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3 http://maven.apache.org/xsd/assembly-1.1.3.xsd">
4 <id>package</id>
5 <formats>
6 <format>zip</format>
7 </formats>
8 <!-- 改为false不会出现两层相同的目录 -->
9 <includeBaseDirectory>false</includeBaseDirectory>
10 <fileSets>
11 <fileSet>
12 <directory>target/classes</directory>
13 <outputDirectory>config</outputDirectory>
14 <includes>
15 <include>*.properties</include>
16 </includes>
17 <excludes>
18 <exclude>mybatisGenerator/**</exclude>
19 </excludes>
20 <fileMode>0640</fileMode>
21 </fileSet>
22 <fileSet>
23 <directory>target/classes/config</directory>
24 <outputDirectory>config</outputDirectory>
25 <includes>
26 <include>*.properties</include>
27 <include>*.xml</include>
28 <include>*.yml</include>
29 </includes>
30 <fileMode>0640</fileMode>
31 </fileSet>
32 <fileSet>
33 <directory>${project.build.directory}</directory>
34 <outputDirectory>${file.separator}</outputDirectory>
35 <includes>
36 <include>*.jar</include>
37 </includes>
38 </fileSet>
39 </fileSets>
40 <dependencySets>
41 <dependencySet>
42 <outputDirectory>lib</outputDirectory>
43 <scope>runtime</scope>
44 <!--<unpack>false</unpack> -->
45 <excludes>
46 <!--<exclude>${project.name}-${project.version}</exclude> -->
47 <exclude>${groupId}:${artifactId}</exclude>
48 </excludes>
49 </dependencySet>
50 </dependencySets>
51 </assembly>
可以看到将target/classes中的文件进行了区分处理,对明确需要和执行jar文件分开的都放入到config文件夹,另外,依赖包也放入了lib文件夹。
最终目录结构如下图所示:
四,应用无限重启问题
由于Springboot应用可以开启热部署功能,当发现classpath目录下面文件有变更的时候就会自动重新启动应用,而我们应用日志文件正好是在classpath的logs目录下面的,所以发现日志文件有变化也会重新启动,因此才会出现无限重启现象。解决办法有两种:
- 1.将日志的目录移除classpath路径下。
- 2.在springboot配置文件中的热部署配置中排除检测目录。
第二种方式具体配置如下:
1 spring:
2 devtools:
3 restart:
4 enabled: true
5 additional-exclude: logs/**