本文内容来自Spring Boot相关书籍学习总结
1、Spring Boot打包、发布与部署
Spring Boot使用了内嵌容器,因此它的部署方式也变得非常简单灵活,可以将Spring Boot项目打包成JAR包来独立运行,也可以打包成WAR包部署到Tomcat容器中运行。
1.1 项目打包
Maven项目打包
1. 生成JAR包
在pom文件中指定打包方式
<packaging>jar</packaging>
命令行方式执行打包,在项目根目录下,执行如下命令:
mvn clean package -Dmaven.test.skip=true
命令执行完成后,JAR包会生成到target目录下,命名一般是“项目名+版本号.jar”的形式。
2. 生成WAR包
JAR包和WAR包的区别:
JAR包:通过内置Tomcat运行,不需要额外安装Tomcat。如果需修改内置Tomcat的配置,只需要在Spring Boot的配置文件中配置即可。内置Tomcat没有自己的日志输出,全靠JAR包应用输出日志,但是部署简单方便,适合快速部署。
WAR包:传统的应用交付方式,需要安装Tomcat,然后将WAR包放到webapps目录下运行,这样可以灵活选择Tomcat版本,也可以直接修改Tomcat的配置,同时有自己的Tomcat日志输出,可以灵活配置安全策略。WAR包相对JAR包来说没那么快速方便。
生成war包的步骤:
(1)在pom文件中指定打包方式
<packaging>war</packaging>
(2)排除依赖中的Tomcat
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
将Tomcat组件的scope属性设置为provided,这样在打包产生的WAR中就不会包含Tomcat相关的JAR。
(3)注册启动类
@SpringBootApplication
public class Application extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(Application.class);
}
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
(4)生成WAR包
生成WAR包的命令与JAR包的命令一样。
3. 实现静态文件、配置文件、JAR包分离
Spring Boot打包时,默认会把resources目录下的静态资源文件和配置文件统一打包到JAR文件中。这样部署到生产环境后,一旦需要修改配置文件就会非常麻烦。所以,在实际项目中,会将静态文件、配置文件和JAR包分离。
Spring Boot通过重新定义Maven插件能够轻松实现静态文件、配置文件与JAR包的分离,只需要修改项目中的pom.xml文件,在pom.xml配置文件中的<build>节点添加自定义maven打包插件即可,具体配置如下:
<build>
<plugins>
<!--定义项目的编译环境-->
<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>
</configuration>
</plugin>
<!-- 打JAR包 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<!-- 不打包资源文件(配置文件和依赖包分开) -->
<excludes>
<exclude>*.yml</exclude>
<exclude>*.properties</exclude>
<exclude>mapper/**</exclude>
<exclude>static/**</exclude>
<include>templates/**</include>
</excludes>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<!-- MANIFEST.MF 中 Class-Path 加入前缀 -->
<classpathPrefix>lib/</classpathPrefix>
<!-- JAR包不包含唯一版本标识 -->
<useUniqueVersions>false</useUniqueVersions>
<!--指定入口类 -->
<mainClass>com.example.Application</mainClass>
</manifest>
<manifestEntries>
<!--MANIFEST.MF 中 Class-Path 加入资源文件目录 -->
<Class-Path>./html/</Class-Path>
</manifestEntries>
</archive>
<outputDirectory>${project.build.directory}</outputDirectory>
</configuration>
</plugin>
<!-- 该插件的作用是复制依赖的JAR包到指定的文件夹中 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/lib/</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
<!-- 该插件的作用是复制指定的文件 -->
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<executions>
<execution> <!-- 复制配置文件 -->
<id>copy-resources</id>
<phase>package</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>mapper/**</include>
<include>static/**</include>
<include>templates/**</include>
<include>*.yml</include>
<include>*.properties</include>
</includes>
</resource>
</resources>
<outputDirectory>${project.build.directory}/html</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
1.2 运行部署
直接启动
java -jar xxx.jar
后台启动
nohup java -jar xxx.jar &
使用该方式日志会被重定向到nohup.out文件中。可以用“>filename 2>&1”来更改默认的重定向文件名:
nohup java -jar xxx.jar >out.log 2>&1 &
Spring Boot项目支持在启动时添加定制,比如设置应用的堆内存、垃圾回收机制、日志路径等。
(1)设置jvm参数优化性能
java -Xms10m -Xmx80m -jar xxx.jar
(2)选择运行环境
如果配置了多运行环境,在启动项目时,选择对应的启动环境
java -jar xxx.jar --spring.profiles.active=dev
2、使用Docker部署Spring Boot项目
Docker能够让开发者打包它们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,方便快捷。
2.1 Spring Boot项目添加Docker支持
(1)创建Spring Boot项目
(2)添加Docker支持
在pom.xml中添加Docker镜像名称:
<properties>
<docker.image.prefix>example-springboot</docker.image.prefix>
</properties>
(3)添加Docker构建插件
在pom文件中添加构建Docker镜像的插件
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<!-- Docker maven plugin -->
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.0.0</version>
<configuration>
<imageName>${docker.image.prefix}/${project.artifactId}</imageName
>
<dockerDirectory>src/main/docker</dockerDirectory>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
<!-- Docker maven plugin -->
</plugins>
</build>
参数说明:
${docker.image.prefix}:自定义的镜像名称。
<dockerDirectory>:配置Dockerfile的路径。
${project.artifactId}:项目的artifactId。
${project.build.directory}:构建目录,默认为target。
${project.build.finalName}:产出物名称
2.2 发布Docker镜像
(1)创建Dockerfile文件
在目录src/main/docker下创建Dockerfile文件
(2)生成Docker镜像
进入项目根目录,使用如下命令生成Docker镜像:
mvn package docker:build
(3)运行Docker镜像
使用docker run命令运行镜像,创建并启动应用。