Spring Boot学习笔记:打包、发布与部署

1,371 阅读3分钟

本文内容来自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命令运行镜像,创建并启动应用。