SpringBoot支持两种打包方式,jar包和war包。
jar包:通过内置tomcat运行,不需要额外安装tomcat。而spring boot恰好内置了tomcat,所以springboot打包为jar包后可以在不安装外置tomcat的情况下通过jar命令直接运行,非常方便。但它将整个项目高度集成,部署后如果想更改代码细节,那么再重新上传时是整个包完全覆盖。
war包:需要额外安装tomcat,然后将war包放到waeapps目录下,通过重启tomcat来运行。这样在打包时就需要屏蔽springboot内置的tomcat。war包解压后分为多个子目录各司其职,部署后如果想更改代码细节,那么再重新上传时是选择性覆盖。
一、SpringBoot打包为jar,并部署
1、设置工程打包属性
在pom.xml中设置打包属性:
<packaging>jar</packaging> |
2、自定义jar包名称
默认的包名是 项目名-版本号.jar
, 比如 demo-0.0.1-SNAPSHOT.jar
, 如果想自定义,需要在pom.xml中的build中设置finalName。
<build> |
3、打包
在pom.xml的同级目录下打开cmd窗口,运行命令:
mvn clean package -Dmaven.test.skip=true |
- clean:清除上一次的打包内容
- package:打包
- -Dmaven.test.skip=true:跳过单元测试
如图,打包完成后,在此目录下会生成target子目录,其中便有MyDemo.jar
。
4、部署
将MyDemo.jar
复制到任意位置,在当前目录下使用jar命令运行。
java -jar MyDemo.jar |
即完成部署,访问 ip:端口号
即可。端口号默认为8080。如果想更改端口,可直接在上面的命令中设置:
java -jar -Dserver.port=8090 MyDemo.jar |
注意:如果修改端口号后不能访问,就查看一下该端口号是否在安全组策略中开放(入方向)。
另外,使用上述命令,会在窗口关闭或者阿里云服务器远程连接关闭后,自动停止tomcat服务,导致无法运行网站。解决方法是添加nohup指令,保证后台执行。
nohup java -jar -Dserver.port=8090 MyDemo.jar > /dev/null 2>&1 & |
如果想关掉服务的话,需要先查看该jar包占用的进程号,然后杀死。
第一步:查看进程的PID
- 知道jar包端口号的情况下,可使用:
lsof -i:端口号
。PID那一列即是结果。(先安装lsof) - 在不知道端口号的情况下,可使用
ps -ef | grep java
。第一行第一列即是结果
此为例子,说明 ImgBed.jar
占用的PID是 19561
.
第二步:通过PID强制停止对应的进程
命令:kill -s 9 PID
5、容易产生的错误
运行jar包,报错
XXXX.jar中没有主清单属性 # windows系统的报错 |
其原因是pom.xml中的依赖没配好,不出所料的话,用解压工具解压jar包,会是下面的构成:
关键的依赖是spring-boot-maven-plugin
,要具体配置为
<plugin> |
其中mainClass
项就是代码的主类,根据自己的情况修改。同时,如果该项下面有一个<skip>true</skip>
的设置,一定要删去,它会跳过主类,导致依旧报上面的错误。
配置好后重新导入依赖,然后重新达到,最终生成的jar包的内部会是下面样子的。
重新运行,成功。
二、SpringBoot打包为war,并部署
1、设置工程打包属性
在pom.xml中设置打包属性:
<packaging>war</packaging> |
2、屏蔽springboot内置tomcat
添加依赖
<dependency> |
如果部署在jetty,则使用 spring-boot-starter-jetty
依赖。
3、自定义jar包名称
默认的包名是 项目名-版本号.war
, 比如 demo-0.0.1-SNAPSHOT.war
, 如果想自定义,需要在pom.xml中的build中设置finalName。
<build> |
4、修改SpringBoot启动类
启动类继承实现 SpringBootServletInitializer
,并重写configure
方法。
import org.springframework.boot.SpringApplication; |
5、打包
在pom.xml的同级目录下打开cmd窗口,运行命令:
mvn clean package -Dmaven.test.skip=true |
- clean:清除上一次的打包内容
- package:打包
- -Dmaven.test.skip=true:跳过单元测试
如图,打包完成后,在此目录下会生成target子目录,其中便有MyDemo.war
。
6、部署
将MyDemo.war
复制到tomcat安装目录下的webapps子目录里,重启tomcat服务器来执行。
windows下的重启方法:在tomcat的bin目录下双击
startup.bat
;或者在该目录下的cmd窗口输入startup.bat
回车。linux下的重启方法:在tomcat的bin目录下双击
startup.sh
;或者在该目录下的terminal窗口输入./startup.sh
回车。
即完成部署,访问 ip:端口号/项目名
即可。端口号默认为8080。如果想更改端口,就需要修改tomcat安装目录下conf子目录下的配置文件。这里的项目名就是刚才的finalName,即 MyDemo
。
单独访问 ip:8080
出现的是tomcat官网首页;访问 ip:8080/MyDemo
才出现项目首页。
7、修改映射路径
由上可知,如果想用war包部署,还需要自动将项目中所有往controller层映射的请求加上 项目名
前缀,有两种方法。
第一种:在 application.properties
添加项目映射路径
server.servlet.context-path=/MyDemo |
第二种:在每个 controller.java
的类名上方添加 @RequestMapping
,表示类中的所有响应请求的方法都以该地址作为父路径。
|
重新打包部署,访问 ip:8080/MyDemo
出现项目首页,每次跳转也都能自动加上 MyDemo
前缀。
三、部署到远程服务器
可以使用 WinSCP
软件拷贝包到远程服务器,支持拖拽移动,支持服务器端文件编辑 。
登录界面:
主界面: