这里就简单写了一个controller,用于测试,如下图所示
在idea运行的时候可以看到,springboot内置的tomcat,以及端口号和context path
http://localhost:8080/test
springboot打包成war包
首先在pom.xml中配置,如下图所示
<!-- 配置打包方式,这里为war包,默认是jar包 -->
<packaging>war</packaging>
使用外部的tomcat
<!--使用外部tomcat-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
这里需要注意了,通过idea创建的springboot项目,默认导入了maven的plugin打包插件的。需要有这个打包的插件,具体看完整的pom.xml文件。为什么提这个呢,是因为我感觉有很多人是通过先建立一个maven项目,然后通过导入springboot坐标的方式,建立springboot项目的,然后就会少了这个打包插件。我这里是使用IDE内置的springboot创建项目的方法
通过这种方式建立的springboot项目,会自动配置好了maven的plugin打包插件,如下图所示
<?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>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.10</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>wartest</artifactId>
<version>0.0.1-SNAPSHOT</version>
<!-- 配置打包方式,这里为war包,默认是jar包 -->
<packaging>war</packaging>
<name>wartest</name>
<description>wartest</description>
<properties>
<java.version>11</java.version>
</properties>
<dependencies>
<!--使用外部tomcat-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>
因为打包的时候使用了,外部的tomcat,所以需要为war包配置tomcat的启动配置,这里我在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;
@SpringBootApplication
public class WartestApplication extends SpringBootServletInitializer {
public static void main(String[] args) {
SpringApplication.run(WartestApplication.class, args);
}
// tomcat启动配置
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
// return super.configure(builder);
return builder.sources(WartestApplication.class);
}
}
配置好了之后,就可以打包了。
打包成功之后,我们就可以看到target目录下的war包了
将打包得到的war包复制大tomcat的webapps目录下
启动tomcat
看到springboot对应的logo,并且没有报错的情况下,说明部署成功了打包的war包,我们到webapps目录下,可以看到生成了对应的war包的文件夹
http://localhost:8080/wartest-0.0.1-SNAPSHOT/test 注意下图画横线哪里,跟上图的画横线那里对比一下。
tomcat的webapps目录下可以部署多个war包,如这里我将wartest-0.0.1-SNAPSHOT.war复制一份,并改名为aa.war
启动tomcat,可以看到启动了两个springboot项目
启动部署之后
http://localhost:8080/aa/test
http://localhost:8080/wartest-0.0.1-SNAPSHOT/test
部署war包遇到的奇葩问题
打包成war包之后,部署到tomcat的webapps目录下,启动tomcat之后,没有报错,可以正常运行,就是没有成功启动springboot项目打包的war包,也就是说运行过程,springboot的logo就没有出现过(这里排除在配置中关闭springboot的logo的情况)。但是部署其他的war包它又没问题,部署刚打包的springboot的war包就有问题,然后部署出现springboot的logo的项目它又可以,就算把springboot改成同一个版本,跟能正常部署的springboot是同一个版本,也不行。就是不出现对应的logo,而且两个程序的配置都是一样的,一个得一个不得。这里我猜的原因是因为先部署了可以正常运行的war包,然后新的程序打包的war包部署就收到影响了。解决办法,就是拿一个同一版本的纯净版的tomcat进行部署,也就是刚下载,什么都没有设置过的tomcat进行部署。不同版本的tomcat也可以,纯净版的tomcat。下面把过程以截图的形式复现一下。
如上图所示,都运行完了,就是没有看到spring这个logo,说您springboot项目打包的war包没有部署成功。然后到webapps目录看一下,对应的文件也正常生成了
访问对应的接口就是没有
然后我拿可以正常部署的war包,试了一下,这个就可以看到springboot的logo。可能是因为这里有配置,然后只能部署这个对应的war包,而且这个可以成功部署的war包,我去对应的程序重新打包成war包,然后到这里webapps下进行部署它还是可以的。就是部署其他项目的war包不行,不知道这里改了tomcat的什么配置,反正就是不行,好像这个tomcat认主一样,其他的我就不接受。部署之前能正常运行的包,它就可以,而且是之前能正常运行的war包重新打包也可以,就是其他程序的war包就不行,其他程序的war包改成一样的名字也不可以,一模一样的配置,包括springboot的版本都一样,就是不行。我也不知道,这个tomcat到底配置了什么,简直就是奇葩。浪费了我挺多时间的,后面换了一个tomcat(同一个版本,都是9.0.62)纯净版,它就解决了。可以部署其他程序的war包了。
换了个同版本的纯净版的tomcat
出现了上面的404之后,重新部署了之后,就不要在这个基础上刷新了,不然它一直在那里转圈,光关闭标签页也不行。还是一直在转圈,(可能是浏览器缓存,这个我也不太清楚),这里应该关闭浏览器,然后再从新输入对应的地址,然后就可以正常显示了。
总结;以后遇到打包这种,tomcat能正常运行的,也没有任何报错,说明war包没有问题,然后springboot就是没有启动成功的。直接去官网下载一个纯净版在部署,尽量不要用以前配置过某个项目的tomcat来部署项目了,如果不想浪费时间排除原因的话。
springboot打包成war包到这里就结束了,后面的可以不看了。
war包部署的详细过程
下面只是把过程记录一下,了解过tomcat部署的,可以直接跳过这里了!
war包的部署需要使用到tomcat,所以这里需要下载tomcat了。
直接百度搜索:tomcat下载就可以去下载tomcat了,我这里直接把tomcat下载的官网写到这里吧。Apache Tomcat® - Apache Tomcat 9 Software Downloads
Index of /dist/tomcat/tomcat-9 (apache.org) 这里可以下载tomcat的历史版本,具体看自己的需求。
这里为什么要下载tomcat9,是因为下图所示的内容,springboot2.7.10内置的tomcat版本是9.0.73,在运行日志中可以看到
当然,也可以是其他版本的tomcat,我试过了,使用比它高或者比它低版本的tomcat都可以正常运行这个springboot程序。我甚至使用tomcat8也可以。不过这里最好还是使用跟内置tomcat同一个版本的tomcat。这里我以为之前已经下载好了目前tomcat9的最新版本了,所以就懒得下载了,就用目前最新版本的tomcat9了。这里我是建议,使用springboot内置版本的tomcat或者比它高一点版本的tomcat,版本不要跳跃太大,如这里springboot2.7.10内置的是tomcat9.0.73,最好是使用tomcat9,使用tomcat9.0.73或者比它大的tomcat9版本。不建议使用tomcat10或者tomcat8。有些springboot项目打包成war包的时候,使用tomcat10不一定能运行起来。这里也可以看springboot内置的tomcat版本。
下载解压好tomcat之后,这里需要配置一下JAVA_HOME的系统环境变量,否则tomcat启动会说找不到JAVA_HOME对应的jdk所在的位置。这里需要注意的是必须是JAVA_HOME,不能是其他的,tomcat中的bin目录下的catalina.bat,在启动tomcat时,会从这里找系统中java的环境变量JAVA_HOME,使用对应的文件编辑器打开可以看到,找的是JAVA_HOME。而不是其他
配置好之后,win+R
输入 java -version确保jdk的系统环境变量JAVA_HOME是否配置成功了。
配置好系统环境变量之后,进入tomcat的bin目录下
找到startup.bat,双击它,启动tomcat。这里需要注意了,如果在idea运行了程序的话,而且程序的顿口号的8080的话,需要在idea中停止运行代码程序。免得到时候端口号冲突,导致tomcat启动失败。
停止正在运行的程序,然后再启动tomcat。
启动tomcat
我们可以看到tomcat启动成功了
tomcat启动成功之后,访问http://localhost:8080/
我们可以看到,tomcat运行的时候是乱码的,我们可以先点击叉号,关闭tomcat
然后到tomcat目录下的conf目录
找到conf目录下的logging.properties文件,打开
将这几个UTF-8全部换成GBK
如下图所示,全部改成GBK,保存一下
然后再去tomcat的bin目录下,双击startup.bat启动tomcat,可以看到不乱码了
将之前打包好的war版,复制到tomcat的webapps目录下,然后启动即可
然后,返回上一级目录,进入tomcat的bin目录下
找到startup.bat,双击它,启动tomcat
我们可以看到springboot启动成功了
访问http://localhost:8080/
我们到tomcat的webapps目录下,看到
所以要想访问springboot打包出来的war包中的接口地址,需要加上对应的war包,
http://localhost:8080/wartest-0.0.1-SNAPSHOT/test
可以看到,对应的接口内容了。点击对应的叉号,关闭tomcat。这个war包可以重命名,然后再部署就是访问重命名的路径了,并且tomcat的webapps目录可以部署多个war包,如我这里复制一份这个war包,并重命名为aa.war,当部署之后就是http://localhost:8080/aa/test了
去tomcat的bin目录下,双击startup.bat,运行tomcat。从图中可以看到有两个springboot项目,具体可以看对应截图中的描述
http://localhost:8080/wartest-0.0.1-SNAPSHOT/test 可以正常访问
http://localhost:8080/aa/test 也可以正常访问