一、前言
在接触SpringBoot
之前,项目使用的框架是Spring
,运行项目的方式是将其打成war
包,然后部署到Tomcat
下,再通过命令启动Tomcat
。
在接触SpringBoot
之后,其默认的打包方式为jar
包,直接通过jar -jar xxx.jar
的方式运行。如果想要通过传统的方式进行运行,即将SpringBoot
打包成war
的方式,则需要进行以下的操作。
开发工具:Intellij IDEA
管理工具:Maven
服务器:阿里云 Centos7.6.1810
项目运行容器:Tomcat 8.5.38
SpringBoot
:2.1.5
二、操作
将pom.xml
中的打包方式选择为war
,并且在依赖中设置内置容器tomcat
的作用域(scope
)只在maven的编译、测试阶段。因此在后续生成的war
包下的lib
目录中,是没有tomcat
这个依赖的。
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.5.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>spring-war</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>spring-war</name>
<!-- 打包方式为war -->
<packaging>war</packaging>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- 当项目打包方式为war时,需要排除springboot内置的tomcat容器 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<!-- 作用范围只会影响到maven的编译、测试阶段 -->
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<!--设置生成的文件名称为ROOT-->
<finalName>ROOT</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
编写TestController
package com.example.springwar.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @program: spring-war
* @description: 测试
* @author: Mw
* @create: 2019-06-03 20:07
**/
@RestController
public class TestController {
@RequestMapping(value = "test", produces = "application/json;charset=UTF-8")
public String test(){
return "{\"code\": 200,\"message\": \"成功\"}";
}
}
在启动类中添加注解@ServletComponentScan
,继承SpringBootServletInitializer
并重写configure()
package com.example.springwar;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.ServletComponentScan;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
@SpringBootApplication
@ServletComponentScan
public class SpringWarApplication extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(SpringWarApplication.class);
}
public static void main(String[] args) {
SpringApplication.run(SpringWarApplication.class, args);
}
}
通过Maven
将项目打包成ROOT.war
,再通过xftp
将文件ROOT.war
上传到tomcat/webapps/
目录下,然后使用以下命令来启动项目。
在webapps
目录下,启动tomcat
$ ../bin/./startup.sh
请求访问test
接口
$ curl http://localhost:8080/test
跟随以上步骤进行操作,最终出现成功响应值,即算作成功。
三、澄清
SpringBoot
不是一个应用服务器。这样误解产生的原因:Spring Boot
可以把Web
应用程序变为可自执行的JAR
文件,
不用部署到传统Java
应用服务器里就能在命令行里运行。
而实际的情况:Spring Boot
在应用程序里嵌入了一个Servlet容器
(Tomcat、Jetty或Undertow
),以此实现这一功能。但这是内嵌的Servlet容器
提供的功能,不是Spring Boot
实现的。
参考:
Spring官网文档
SpringBoot war方式部署
《SpringBoot 实战》
- 阅读此篇文章任何疑问、意见或建议,欢迎下方评论,本人看到会及时回复。