前言:用过Springboot的同学都知道,Springboot采用了约定大于配置的思想,提供了大量简化配置的操作,使得我们从繁重的SpringMVC项目配置中解脱出来,只需要在.properties或者.yml文件上给指定的参数配置适当参数值即可,然后Springboot会自动应用;个人认为Springboot的优势在于提供快速便捷的开发模式,比如快速开发服务接口,通过mvn打包成jar包,然后通过java -jar命令行的方式(内置服务器)启动服务,这是正确的应用之道;Springboot同样支持web项目(包含各种html、css、js等前端资源)的开发和部署到外部服务器,但此时就需要做适当调整;
去年接了个应用类项目,就手欠采用Springboot开发web项目,项目目录结构如下:
发过程中倒是方便无比,但部署时就需要打包成war包部署到外部服务器,就需要改动配置并做适当调整,本文以此为契机,记录下操作过程,方便自己以及后来者!
理清思路,有以下几个地方需要处理:
1、由于服务器上面使用的一般是war包,所以此处将项目打包方式由jar包->war包
2、使用外部服务器,所以去除Springboot内置的服务器
3、由于部分jar包在外部服务器已经包含了,所以适当去除
4、重点:Springboot项目启动时,会创建Spring容器,容器中包含大量的Servlet、Filter和Spring Beans对象,此时由于使用外部的服务器,所以我们需要将Spring容器中的对象绑定到服务器上,我们采用官方推荐的方式,让启动类继承SpringBootServletInitiallizer并重写configure方法,官方demo如下:
下面开始,从创建一个Springboot项目,到最终通过浏览器访问为止,步骤如下:
1、极简新建一个Springboot项目适当调整,新建完成后pom.xml和项目目录结构如下:
<?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.4.RELEASE</version>
<relativePath/>
</parent>
<groupId>com.dongnao</groupId>
<artifactId>springboot-tomcat-deployment-demo</artifactId>
<version>0.0.1</version>
<packaging>jar</packaging>
<name>springboot-tomcat-deployment-demo</name>
<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>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
2、新建一个HelloController.java,代码如上所示,启动Springboot项目,测试下新建项目是否ok,结果如下:
3、修改Springboot项目启动类,让该类继承SpringBootServletInitializer并重写configure方法,修改后代码如下:
package com.dongnao;
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 SpringbootTomcatDeploymentDemoApplication extends SpringBootServletInitializer {
public static void main(String[] args) {
SpringApplication.run(SpringbootTomcatDeploymentDemoApplication.class, args);
}
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(SpringbootTomcatDeploymentDemoApplication.class);
}
}
4、修改pom.xml,修改项目打包方式,移除springboot内置tomcat服务器,适当调整tomcat的lib文件夹里面存在的,当项目里面却引用的,说白了就是既然tomcat服务器已经提供了某些通用jar包,那么咱们就在maven里面标识出来,修改后的pom.xml内容如下:
<?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.4.RELEASE</version>
<relativePath/>
</parent>
<groupId>com.dongnao</groupId>
<artifactId>springboot-tomcat-deployment-demo</artifactId>
<version>0.0.1</version>
<!-- 指定项目打包方式 -->
<packaging>war</packaging>
<name>springboot-tomcat-deployment-demo</name>
<description>Demo project for Spring Boot</description>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 移除Springboot内置tomcat服务器 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
<!-- 以下三个dependency根据实际情况添加,不是必须,此处为了演示 -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
</dependencies>
<build>
<finalName>springboot-deploy</finalName>
<plugins>
<!-- 配置war打包插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.6</version>
<configuration>
<!-- 禁止当项目中web.xml不存在时抛出异常 -->
<failOnMissingWebXml>false</failOnMissingWebXml>
</configuration>
</plugin>
<!-- 配置编译插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
5、依次通过idea开发工具的maven工具类,依次执行以下1,2两个操作,得到war包,如图,这个就是我们要放到服务器中:
6、找到一个tomcat服务器,将war包放到tomcat/webapps文件夹下面,启动服务器,服务器启动成功后,采用:服务器地址 + 端口 + war名称 + 接口名称,我的就是:http://localhost:8080/springboot-deploy/showDeploymentResult,结果如下:
好了,转换成功!