第16章 部署、测试和监控

部署和运行

部署分为连个步骤,第一步是项目打包(war或者jar),第二步是如何运行项目。运行项目又可分为内嵌服务器和第三方服务器。

打包

使用IDEA创建项目时,采用的是war打包方式,二十几上还可以使用jar打包,只是这种创建方式不是主流,毕竟Java当前的开发方向是以Web应用为主。使用war创建项目后,IDE会帮助生成Web应用所需要的目录,例如JSP页面的webapp目录,与此同时还会在Maven的配置文件pom.xml中添加一些内容和,其中需要注意的是其中的打包方式packaging标签中的内容是war

1
2
3
4
5
6
<groupId>com.xyd</groupId>
<artifactId>mc</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<name>mc</name>
<description>Demo project for Spring Boot</description>

在IDEA中,点击Build,选择Build Artifacts..即可编译打包项目,打包完成后会在项目的target目录下生成打包成的war包

运行项目

  1. 使用内嵌服务器运行项目
    运行项目的方式很简单,对于IDE打出来的包,可以直接java -jar命令就可以直接运行,如下命令
    1
    java -jar projectname.war

有时候可能希望使用命令指定参数,这也是没有问题的。比方说运行时候发现8080端口被占用了,此时希望使用9080,于是可以把命令修改为

1
java -jar projectname.war --server.port=9080

这样就可以启用9080端口运行服务器,这里注意项目配置文件中设置的端口也会被这个命令行的参数所覆盖。

  1. 使用外部服务器运行项目
    最常用的中间件服务器是Tomcat,对于部署第三方非内嵌服务器,需要自己初始化Spring MVC的DispatcherServlet,关于这点IDE会帮助我们自动生成,在选择使用war打包项目时,他还会自动生成一个ServletInitializer.java。从名称看,他就是初始化Servlet的,代码如下
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    package com.xyd.mc;

    import org.springframework.boot.builder.SpringApplicationBuilder;
    import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;

    public class ServletInitializer extends SpringBootServletInitializer {
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
    return application.sources(McApplication.class);
    }

    }

这里可以看到,他继承可SpringBootServletInitializer,然后实现了configure方法,实现这个方法时为了载入Spring Boot的启动类,依靠这个启动类来读取配置。那么Web容器是如何识别到这SpringBootServletInitializer类的呢。原因是,在Servlet3.1规范之后允许Web容器不通过web.xml配置,只需要实现ServletContainerInitializer接口。在SpringMVC中已经提供了ServletContainerInitializer的实现类SpringServletContainerInitializer,这个实现类会遍历WebApplicationInitializer接口的实现类,加载它所配置的内容。
根据以上内容,只需要将生成的war包拷贝到Tomcat的webapps目录下,就可以完成部署

热部署

热部署,是在应用正在运行的时候升级软件,缺不需要重启应用。在Spring Boot中热部署也十分简单,通过Maven导入spring-boot-devtools即可,代码清单如下

1
2
3
4
5
6
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>

然后重启系统,这样当修改其中的文件时,文件就会自动即时生效。其中配置了optional选项为true,代表别的项目依赖于当前项目,这个热部署不会在该项目上生效。热部署是通过LiveReload进行支持的,所以在日志中会看到下面的内容

1
2019-09-08 11:18:11.872  INFO 18080 --- [  restartedMain] o.s.b.d.a.OptionalLiveReloadServer       : LiveReload server is running on port 35729

关于热部署的配置,主要有一下选项

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

# 是否启用一个livereload.com兼容的服务器
spring.devtools.livereload.enabled=true
# livereload.com服务器端口
spring.devtools.livereload.port=35729
# 在原来的基础上新增重启服务的文件夹目录
spring.devtools.restart.additional-paths=
# 在原来的基础上新增不重启服务的文件夹目录
spring.devtools.restart.additional-exclude=
# 是否启用自动重启功能
spring.devtools.restart.enabled=true
# 不重启服务的文件夹配置
spring.devtools.restart.exclude=
# 设置对路径变化进行检测的时间间隔(毫秒为单位)
spring.devtools.restart.poll-interval=1000ms
# 在没有改变任何classpath的情况下,在重启被出发前的静默时长(毫秒为单位)
spring.devtools.restart.quiet-period=300ms
# 设置触发文件,当需要实现触发启动检查时,则需要修改这个文件
spring.devtools.restart.trigger-file=

测试

在pom文件中引入测试包

1
2
3
4
5
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>

spring-boot-starter-text会引入JUnit的测试包,这也就是先中使用最多的方案,所以下面基于它进行讨论,在Spring Boot可以支持多种方面的测试,如JPA,MongoDB、Rest风格和Redis等,基于使用原则

0%