写作时间:2020-02-27
Spring Boot: 2.1 ,JDK: 1.8, IDE: IntelliJ IDEA,
说明
项目打成war包部署到外部的Tomcat上,要达到这种目的,需要修改一些东西。
1. 新建SprintBoot工程
1.1 IDEA新建一个SpringBoot工程,pom.xml
添加web依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
1.2 DemoApplication.java
类添加根路径返回字符串
@SpringBootApplication
@RestController
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
@RequestMapping("/")
public String index() {
return "Greetings from Spring Boot!";
}
}
1.3 运行项目,访问首页
% curl http://localhost:8080
Greetings from Spring Boot!%
如果需要实践SprintBoot请参考:【第一篇:构建第一个SpringBoot工程】
2. 修改Maven的打包方式
在pon.xml
添加一项,Maven默认的packing为jar,所以要将其改为war:
<packaging>war</packaging>
添加的位置如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<!-- ... -->
<packaging>war</packaging>
<!-- ... -->
</project>
3. 修改内迁容器的依赖范围
在pom.xml
中添加依赖,将spring-boot-starter-tomcat
的要构建可执行并可部署到外部容器中的war文件,需要将嵌入容器依赖项标记为provided
,如以下示例所示:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
4. 修改启动类
因为
Spring WebFlux
没有严格的依赖于Servlet API
和 applications 部署在默认集成的Reactor Netty server
,War
部署并不支持WebFlux applications
.扫描二维码关注公众号,回复: 10733622 查看本文章
部署为war
文件的第一步是,启动类要继承于子类SpringBootServletInitializer
, 并且要重载方法configure
. 这样处理是为了让Spring Framework’s Servlet 3.0
支持并配置应用被servlet container
加载. 通常的做法是,修改application’s main
类去集成子类SpringBootServletInitializer
, 修改如下:
package com.zgpeace.springboot;
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;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@SpringBootApplication
@RestController
public class DemoApplication extends SpringBootServletInitializer {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(DemoApplication.class);
}
@RequestMapping("/")
public String index() {
return "Greetings from Spring Boot!";
}
}
5. Maven打包
5.1 在IDEA的右侧点击Maven Projects > package > Run, 就开始构建package
5.2 最终控制台显示如下日志, 表示成功
...
[INFO] --- maven-war-plugin:3.2.3:war (default-war) @ demo ---
[INFO] Packaging webapp
[INFO] Assembling webapp [demo] in [/Users/zgpeace/Spring-Boot/basic/ExportToTomcat/target/demo-0.0.1-SNAPSHOT]
[INFO] Processing war project
[INFO] Webapp assembled in [147 msecs]
[INFO] Building war: /Users/zgpeace/Spring-Boot/basic/ExportToTomcat/target/demo-0.0.1-SNAPSHOT.war
[INFO]
[INFO] --- spring-boot-maven-plugin:2.1.13.RELEASE:repackage (repackage) @ demo ---
[INFO] Replacing main artifact with repackaged archive
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 7.528 s
[INFO] Finished at: 2020-02-28T07:44:23+08:00
[INFO] Final Memory: 31M/389M
5.3 在target
下面可以找到打出来的包demo-0.0.1-SNAPSHOT.war
5.3 在war包上右键Reveal in Finder
,拷贝war
包,放到Tomcat的webapp目录下, 启动Tomcat, 运行链接记得要加上访问路径,结果如下:
% curl http://localhost:8080/demo-0.0.1-SNAPSHOT/
Greetings from Spring Boot!%
如果启动有问题,可以先访问http://localhost:8080
,看看Tomcat是否启动成功。更多Tomcat知识请参考:Mac下安装配置Tomcat 9, Homebrew安装Tomcat
代码下载
https://github.com/zgpeace/Spring-Boot2.1/tree/master/basic/ExportToTomcat
参考
https://docs.spring.io/spring-boot/docs/2.1.13.RELEASE/reference/htmlsingle/#build-tool-plugins-maven-packaging
https://docs.spring.io/spring-boot/docs/2.1.13.RELEASE/reference/htmlsingle/#howto-create-a-deployable-war-file
https://blog.csdn.net/zgpeace/article/details/104529616
https://blog.csdn.net/zgpeace/article/details/85111272