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>
<finalName>MyDemo</finalName>
<plugins>
...
</plugins>
</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系统的报错
no main manifest attribute, in XXXX.jar # Linux系统的报错

其原因是pom.xml中的依赖没配好,不出所料的话,用解压工具解压jar包,会是下面的构成:


关键的依赖是spring-boot-maven-plugin,要具体配置为

<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.3.7.RELEASE</version>
<configuration>
<mainClass>cn.hsy.movie.MoviePubApplication</mainClass>
</configuration>
<executions>
<execution>
<id>repackage</id>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>

其中mainClass项就是代码的主类,根据自己的情况修改。同时,如果该项下面有一个<skip>true</skip>的设置,一定要删去,它会跳过主类,导致依旧报上面的错误。


配置好后重新导入依赖,然后重新达到,最终生成的jar包的内部会是下面样子的。

重新运行,成功。





二、SpringBoot打包为war,并部署

1、设置工程打包属性

在pom.xml中设置打包属性:

<packaging>war</packaging>


2、屏蔽springboot内置tomcat

添加依赖

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>

如果部署在jetty,则使用 spring-boot-starter-jetty 依赖。


3、自定义jar包名称

默认的包名是 项目名-版本号.war , 比如 demo-0.0.1-SNAPSHOT.war , 如果想自定义,需要在pom.xml中的build中设置finalName。

<build>
<finalName>MyDemo</finalName>
<plugins>
...
</plugins>
</build>


4、修改SpringBoot启动类

启动类继承实现 SpringBootServletInitializer,并重写configure方法。

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

@SpringBootApplication
public class AliyunossApplication extends SpringBootServletInitializer {
public static void main(String[] args) {
SpringApplication.run(AliyunossApplication.class, args);
}

@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(AliyunossApplication.class);
}
}


5、打包

在pom.xml的同级目录下打开cmd窗口,运行命令:

mvn clean package -Dmaven.test.skip=true
  • clean:清除上一次的打包内容
  • package:打包
  • -Dmaven.test.skip=true:跳过单元测试


如图,打包完成后,在此目录下会生成target子目录,其中便有MyDemo.war

H6uIgO.png


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 ,表示类中的所有响应请求的方法都以该地址作为父路径。

@Controller
@RequestMapping(path = "/MyDemo")

重新打包部署,访问 ip:8080/MyDemo出现项目首页,每次跳转也都能自动加上 MyDemo 前缀。





三、部署到远程服务器

可以使用 WinSCP 软件拷贝包到远程服务器,支持拖拽移动,支持服务器端文件编辑


登录界面:



主界面: