avatar

目录
springboot package war

为什么要打 war 包?

springboot 默认打包是 jar 包,通过 java -xxx.jar 命令可以直接跑起来。一般的 jar 包,每一个 springboot 项目运行后都有对应的 Tomcat 服务器启动,每个 Tomcat 占一个端口、jvm 占用内存,尤其是多个 springboot 的 jar 包在一台服务器上,包不好管理且端口比较混乱,耗内存,不如启动一个 Tomcat 服务器,将 springboot 打成 war 包放到 webapps 下面统一运行管理,这样所有打成 war 包的项目都可以在同一个端口下运行。

操作流程

亲测的 springboot 版本:2.0.6.RELEASE

将 pom.xml 文件首部的 jar 改成 war

xml
pom.xml
1
2
<!-- <packaging>jar</packaging>-->
<packaging>war</packaging>

去除内置的 Tomcat 容器(a/b 两种方式都可)

  • a.去掉 spring-boot-starter-tomcat(如果没有 tomcat 字样,忽略本步骤)
xml
pom.xml
1
2
3
4
5
6
7
8
9
10
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
  • b.添加依赖
xml
pom.xml
1
2
3
4
5
6
7
8
9
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>

<!--打包的时候可以不用包进去,别的设施会提供。事实上该依赖理论上可以参与编译,测试,运行等周期。
相当于compile,但是打包阶段做了exclude操作-->

<scope>provided</scope>
</dependency>

新建启动类:主要是 SpringApplicationBuilder configure 方法

  • 原 xxxApplication.java 启动类里面的其他东西要原封不动的搬过来(比如@MapperScan 等)
java
1
2
3
4
5
6
7
8
9
10
11
@SpringBootApplication
public class App extends SpringBootServletInitializer{
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(App.class);
}

public static void main(String[] args) {
SpringApplication.run(App.class, args);
}
}
  • 新建该类成功后,将原来的 xxxApplication.java 文件保留,打开文件,将里面的代码全部注释。

打包

bash
1
mvn clean package
  • 打包完成会显示 BUILD SUCCESS,war 包在 target 目录下

测试 war 包

  • 在本地启动 tomcat 服务器,将打好的 war 包放到 webapps 目录下
  • 访问http://localhost:[端口号]/[打包项目名]/进行测试
文章作者: Bill
文章链接: http://blog.webpro.ltd/2020/01/13/springboot-package-war/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Bill's blog

评论