其实按照正常的学习顺序,项目的构建与部署应当安排在第一章,但是放在后面则说明本套学习笔记差不多应该结束了,一个项目到了不部署的阶段。

JAR

项目打包

本篇就不再新建SpringBoot项目了,而是使用第一个hellospringboot项目作为例子进行介绍。使用spring-boot-maven-plugin插件可以创建一个可执行的JAR应用程序,前提是应用程序的parent为spring-boot-starter-parent。在pom.xml文件中新增打包插件的build:

1
2
3
4
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>

配置完成后,在当前项目的根目录(与pom.xml文件同级目录)下执行如下的Maven命令进行打包操作:

1
mvn package

如果你使用的开发工具为IDEA,那么可以单击右侧的Maven Project按钮,然后找到Lifecycle中的package,然后双击打包即可:

然后控制台开始输出打包信息,当最后输出BUILD SUCCESS字段时,则表明该项目已经被打包成jar包。

打包成功后,在当前项目的根目录下找到target目录,target目录中就已经有了刚刚打包而成的jar包,且命名规则为项目名称-0.0.1-SNAPSHOT.jar,如下图所示:

前面也说过这种打包方式的前提是项目使用了spring-boot-starter-parent作为parent,不过在大部分项目中,项目的parent可能并不是spring-boot-starter-parent,而是公司内部定义好的一个配置,此时spring-boot-maven-plugin插件并不能直接使用需要多做一些额外的配置。此时应当在pom.xml文件中新增打包插件的build代码为:

1
2
3
4
5
6
7
8
9
10
11
12
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.1.14.RELEASE</version>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>

配置完成后,就可以通过Maven命令或者IDEA中的Maven插件来进行打包,由于打包方式和前面的完全一致,因此这里就不再赘述。

项目运行

对于打包后的项目的运行,如果开发者使用的是windows系统,且已经安装了JDK,那么直接进入target目录下执行如下命令即可启动项目:

1
java -jar hellospringboot-0.0.1-SNAPSHOT.jar

如果开发者在Linux系统上允许SpringBoot项目,则需要确保Linux上安装了Java运行环境。关于在CentOS安装jdk,笔者有一篇文章专门进行了介绍,这里还是粘贴一下内容。安装jdk有两种方式,第一种是自动安装jdk(无法修改安装路径),另一种是手动安装jdk(手动配置安装路径)。

方式一:自动安装jdk(无法修改安装路径)的步骤如下:
第一步,使用yum -y list java*命令查询要安装jdk的版本;
第二步,使用yum install -y java-1.8.0-openjdk.x86_64命令下载安装jdk;
第三步,使用java -version来检测是否安装成功,输出版本信息则表示java就已经默认安装在usr/lib/jvm/目录下。

方式二:手动安装jdk(手动配置安装路径)的步骤如下:
第一步,点击 这里,登录oracle获取jdk1.8的各个版本信息,然后进入/usr/local/soft/目录,在里面执行wget 下载链接命令,或者是先下载到windows然后通过xftp上传到CentOS的该目录下,然后使用tar -zxvf jdk-8u241-linux-x64.tar.gz命令进行解压;
第二步,使用vi /etc/profile命令打开配置文件,在最底下输入以下信息:

1
2
3
export JAVA_HOME=/usr/local/soft/jdk1.8.0_241
export CLASSPATH=$:CLASSPATH:$JAVA_HOME/lib/
export PATH=$PATH:$JAVA_HOME/bin

第三步,使用使用source /etc/profile命令激活配置信息,然后使用java -version来检测是否安装成功,输出版本信息则表示java就已经安装在/usr/local/soft/jdk1.8.0_241目录下。

安装好了JDK以后,接下来通过XFTP或者其他工具将生成的JAR包上传到Linux上,然后执行如下命令来启动项目:

1
java -jar hellospringboot-0.0.1-SNAPSHOT.jar &

可以看到这比在Windows系统上多出了一个&,它表示让项目在后台运行。由于在生产缓存中,Linux大多数情况下都是远程服务器,开发者通过远程工具连接Linux,如果使用上面的命令启动JAR,一旦窗口关闭,JAR也就停止运行了,因此一般通过如下命令来启动JAR:

1
nohup java -jar hellospringboot-0.0.1-SNAPSHOT.jar &

这里仅仅在该命令前面添加了nohup,表示当前窗口关闭时服务部挂起,继续在后台运行。

创建可依赖的JAR

正常情况下,SpringBoot项目是一个可以独立运行的项目,它存在的目的不是作为某一个项目的依赖,如果有一个项目需要依赖SpringBoot中的模块,最好的解决方案是将该方案单独拎出来,创建一个公共模块被其他项目依赖。但若由于其他原因导致该模块无法单独拎出来,此时不可以直接使用前面介绍的方法打包成JAR作为项目依赖,因为前面打包的JAR包是可执行JAR包,它的类是放在BOOT-INF目录下,如果直接作为项目的依赖,就会找不到类。一个可执行的JAR放入结构如下图所示:

因此,如果非要将一个SpringBoot工程作为一个项目的依赖,就需要配置Maven插件生成一个单独的artifact,这个单独的articfact可以作为其他项目的依赖,配置方式如下(假设项目的parent不是默认的spring-boot-starter-parent)。在pom.xml文件中添加如下配置信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.1.14.RELEASE</version>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
<configuration>
<classifier>exec</classifier>
</configuration>
</plugin>

classifier指定了可执行JAR的名字,默认的JAR则作为可被其他程序依赖的artifact。配置完成后,对该项目进行打包,打包成功后可以发现在target目录下生成了两个JAR,如下图所示:

hellospringboot-0.0.1-SNAPSHOT.jar是一个可以被其他应用程序依赖的JAR包,而hellospringboot-0.0.1-SNAPSHOT-exec.jar则是一个可执行的JAR。可以对这两个JAR包分别进行解压,可以看到class的路径是不同的,如下图所示:

文件排除

想将SpringBoot项目打包成可执行JAR包,一般需要一些配置文件,如application.properties或者application.yml等,但若将SpringBoot项目打包成一个可依赖的JAR,这些配置文件很多时候又是不需要的,此时可以在打包时排除配置文件,只需要在pom.xml文件中新增以下配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<!--打包成JAR包时排除application.properties配置文件-->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.1.14.RELEASE</version>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>

<plugin>
<artifactId>maven-jar-plugin</artifactId>
<executions>
<execution>
<id>lib</id>
<phase>package</phase>
<goals>
<goal>jar</goal>
</goals>
<configuration>
<classifier>lib</classifier>
<excludes>
<exclude>application.properties</exclude>
</excludes>
</configuration>
</execution>
</executions>
</plugin>

maven-jar-plugin插件中配置排除application.properties配置文件。配置完成后,对该项目进行打包,打包成功后可以发现在target目录下生成了两个JAR,如下图所示:

hellospringboot-0.0.1-SNAPSHOT.jar是一个可以执行的JAR包,而hellospringboot-0.0.1-SNAPSHOT-lib.jar则是一个可被外部程序依赖的JAR。对hellospringboot-0.0.1-SNAPSHOT-lib.jar这个JAR包进行解压,可以看到里面已经没有application.properties配置文件了,如下图所示:

WAR

在一些特殊情况下,需要开发者将SpringBoot项目打包成WAR包,然后使用传统的方式进行部署。打包成WAR包的配置步骤如下:

第一步,修改pom.xml文件。修改pom.xml文件,将项目打包成WAR包:

1
2
<!--项目打包方式-->
<packaging>war</packaging>

第二步,标记容器。修改pom.xml文件,将内嵌容器的依赖标记为provide,代码为:

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

第三步,提供一个SpringBootServletInitializer的子类。提供一个SpringBootServletInitializer的子类,并覆盖其configure方法,完成初始化操作,代码如下:

1
2
3
4
5
6
public class ServletInitializer extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(HellospringbootApplication.class);
}
}

经过以上三步的配置后,接下来就可以对项目进行打包了。打WAR包的方式和打JAR包的方式是一样的,打包成功后,在target目录下生成一个WAR包,将该文件复制到Tomcat的webapps目录下即可,注意不需要解压,然后启动Tomcat即可。JAR包内置了Tomcat等web容器,因此不需要额外安装Tomcat,但是WAR包必须先安装Tomcat,才能放在web容器内运行。

项目构建与部署小结

本篇主要介绍了SpringBoot项目不同的打包方式,开发者可以使用传统的WAR包部署,也可以使用SpringBoot官方推荐的JAR包部署, 两种部署方式各有优缺点,需要开发者根据实际情况来选择合适的部署方式。通常情况下,还是建议开发者优先选择JAR包方式进行部署。

那么到此,SpringBoot基础篇的学习就完成了,后续是对于SpringBoot的进阶学习。