Spring Boot 项目打包成war包
一、配置pom文件
1、移除spring boot内置的tomcat
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<!-- 移除嵌入式tomcat插件 -->
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
添加Tomcat
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
<scope>provided</scope>
</dependency>
2、添加servlet支持
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
</dependency>
3、移除thymeleaf 模板引擎依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
4、设置打包为war
<!-- 这里设置打包的形式 默认为jar -->
<packaging>war</packaging>
5、设置打包后的项目访问名称
设置打包后的项目访问名称,在build节点里设置文件名(这里是一个特别需要注意的地方,由于开始的时候是使用的单模块程序,所以可以对项目命名,但是在多模块打包中发现,如果添加项目名称 这个结点。打包好的程序在tomcat中运行的时候会发生错误,war 包的目录格式有问题,建议finalName设置的名称 == artifactId名称)
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
<finalName>ROOT</finalName>
</build>
二、Application类的同级添加一个SpringBootStartApplication类(参考)
/* * 为了打包springboot项目 * */
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(this.getClass());
}
三、使用IDEA打包
注:
IDE打包方式多种多样,以上只是列出IDEA中的一种打包方式
默认打包路径为项目的target路径下
四、部署到Tomcat下面
1、将war包放到Tomcat的 webapps目录下
2、修改 tomcat 中 conf 目录下的配置文件 server.xml,在配置文件中找到Host标签,在其中添加如下内容。这里使用的是相对路径,doBase 属性的值是我们所打 war 包的名称
<Context docBase="chenk.war" path="/" reloadable="true" privileged="true"/>
path 是虚拟路径;
docBase 是应用程序的物理路径;
privileged 设置为true的时候,才允许Tomcat的Web应用使用容器内的Servlet;
reloadable 如果为true,则tomcat会自动检测应用程序的/WEB-INF/lib 和/WEB-INF/classes目录的变化,可以在不重起tomcat的情况下,自动装载改变后的应用程序,实现热部署;
修改这一项是因为如果不添加这一句,用tomcat访问时需要加上项目名,这也是为什么doBase属性的值是项目名的原因。