SpringBoot 项目如何打成 war 包

SpringBoot项目的默认打包方式是将工程打包成为一个 jar 包。部分情况下,我们需要将项目打包成一个 war 包,以方便我们将工程部署在 tomcat 上运行。

那如何将 SpringBoot 项目打包成一个 war 包呢?

pom 文件修改

修改打包方式。由于 SpringBoot 的默认打包方式将其打包成 jar 包,所以创建出来的项目的 pom是没有特殊声明 packaging 的元素。所以首先要在 pom 坐标处增加<packaging>war</packaging>的设置。

因为使用的 SpringBoot,而且选中了 web的 start,其内置 tomcat服务,但是我们这里又需要手动将其部署到 tomcat 上,所以要将 spring-boot-start-web 中移除对spring-boot-start-tomcat 的依赖传递,所以pom 文件中需要这样修改。

<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>

然后 pom 中添加 servlet-api 的依赖。下面有两种方法,可以任选其中一个

方法一:

<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>

方法二:

<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-servlet-api</artifactId>
<version>8.0.36</version>
<scope>provided</scope>
</dependency>

最后将 pom 文件中元素中添加元素并赋值为你需要的打包的名字,比如我这边的手头的这个例子,我希望打出来的 war 包名字为 dataServer.war。所以我的设置是这样的。

<finalName>dataServer</finalName>

到目前为止所有的pom 修改就已经完成了,现在需要修改启动类,并重写初始化方法

重写初始化方法

我们平常用main方法启动的方式,都有一个App的启动类,代码如下:

@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}

我们需要类似于web.xml的配置方式来启动spring上下文了,在Application类的同级添加一个SpringBootStartApplication类,其代码如下:

/**
* 修改启动类,继承 SpringBootServletInitializer 并重写 configure 方法
*/
public class SpringBootStartApplication extends SpringBootServletInitializer { @Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
// 注意这里要指向原先用main方法执行的Application启动类
return builder.sources(Application.class);
}
}

打包

在项目根目录下(即包含pom.xml的目录),在命令行里输入:

mvn clean package即可, 等待打包完成,出现[INFO] BUILD SUCCESS即为打包成功。

如何在 tomcat8 上运行

把target目录下的war包放到tomcat的webapps目录下,启动tomcat,即可自动解压部署。

最后在浏览器中输入http://localhost:[端口号]/[打包项目名]/即可浏览。

我再 tomcat8 上运行没有发现什么问题,然后我将程序部署到了服务器上却出现了问题。服务器上 的 tomcat 版本是 7.所以我在本地重新部署了一套 tomcat7 的运行环境用来测试,结果却意外发现了大问题。

如何在 tomcat7 上运行

在 tomcat7 上运行打好的包的时候出现了这样的一个错误。我曾在Stack Overflow 上进行查找,找到一个比较靠谱的解释。大致是说,之所以在 tomcat8 上可以运行,而 tomcat7 上不能运行,是因为 tomcat8中已经包含 el-api 3.0而 tomcat7 上只有el-api 2.2。

解决方法也说的是五花八门,我尝试过很多种方法,最后是一个意想不到的方法帮助我解决了这个问题。

看了网上所说,把tomcat/lib下的el-api.jar拷贝到D:\xxx\jdk1.8.0_121\jre\lib\ext发现还是一样的异常;反编译el-api的确没有ElManager,在el-api3.0才引入.so ,下载el-api3.0.jar,放到jdk或者只放tomcat/lib都可;(直接使用tomcat8也可解决)

然后我将本地 maven 仓库中的el-api3.0 copy 到了 tomcat7 的 lib 路径下,然后将文件放进去,再次使用 catalina 执行 tomcat 没有报错了。真的是坑。。。

SpringBoot 项目运行在 tomcat7 上的更多相关文章

  1. 新建SpringBoot项目运行页面报错Whitelabel Error Page This application has no explicit mapping for /error, so yo

    新建SpringBoot项目运行页面报错Whitelabel Error Page This application has no explicit mapping for /error, so yo ...

  2. 将Spring Boot项目运行在Docker上

    将Spring Boot项目运行在Docker上 一.使用Dockerfile构建Docker镜像 1.1Dockerfile常用指令 1.1.1ADD复制文件 1.1.2ARG设置构建参数 1.1. ...

  3. Springboot项目如何把项目运行在服务器上

    作为一个开发者,不可避免的要把本地项目变成可以接入外网的上线项目,今天来记录下springboot框架下如果把项目打包放在服务器上运行 第一步,首先要买个服务器,这个一般甲方会提供 第二步,导入jar ...

  4. SpringBoot项目在新电脑上的配置运行,包括JDK+MAVEN+Git+SpringBoot配置等

    该教程记录了我在一台新的电脑上安装IDEA,配置JAVA+MAVEN+GIT+SpringBoot项目的过程,最终完成了项目的运行. 一.若想利用IDEA的git工具从GitHub或者码云上面获取项目 ...

  5. 使用外部容器运行spring-boot项目:不使用spring-boot内置容器让spring-boot项目运行在外部tomcat容器中

    前言:本项目基于maven构建 spring-boot项目可以快速构建web应用,其内置的tomcat容器也十分方便我们的测试运行: spring-boot项目需要部署在外部容器中的时候,spring ...

  6. 搞定springboot项目连接远程服务器上kafka遇到的坑以及完整的例子

    版本 springboot 2.1.5.RELEASE kafka 2.2 遇到的坑 用最新的springboot就要用最新的kafka版本! 当我启动云服务器上的zk后,再启动kafka后台日志也没 ...

  7. 部署基于maven的springboot项目到linux服务器上

    目录 本地运行调试 导入数据库: 导入项目: 将项目打包: linux准备: 运行项目: 脚本运行 本地运行调试 导入数据库: 导入数据库的时候使用的是sqlYog导入navcat的脚本:由于两个应用 ...

  8. springboot项目部署到服务器上

    链接:https://blog.csdn.net/qq_22638399/article/details/81506448#commentsedit 链接2:https://blog.csdn.net ...

  9. Springboot 项目部署到服务器上

    项目部署到服务器上,有两种方式,一种 jar 包,一种 war 包 jar包 部署时,后续的域名配置,SSL证书等在nginx中配置 war包 部署时,后续的域名配置可以在tomcat中配置就好,修改 ...

随机推荐

  1. [TimLinux] TCL 自定义包

    1. 包 很多功能存放在一起,定义为一个包,在iTcl(Incr TCL)之后,可以定义一个类,类可以放在一个包里面,包为一个独立的文件,可以为TCL文件,也可以为C/C++语言实现的动态库. 2. ...

  2. [TimLinux] 命令 procps-ng 包内命令介绍

    1. procps-ng包 System and process monitoring utilities. 2. 文件列表 free, pgrep, pkill, pmap, ps, pwdx, s ...

  3. Dubbo源码分析之 SPI(一)

    一.概述 dubbo SPI 在dubbo的作用是基础性的,要想分析研究dubbo的实现原理.dubbo源码,都绕不过 dubbo SPI,掌握dubbo SPI 是征服dubbo的必经之路. 本篇文 ...

  4. Sql Server存储过程详解

    存储过程--查询: if (exists (select * from sys.objects where name = 'GetUser')) drop proc GetUser --判断存储过程是 ...

  5. java面向对象基础知识

    一.面向对象与面向过程的区别: ①所处的角色不同:前者指挥者,后者执行者:②所需知道的事情不同:前者知道哪些是做这些事情的人就可以,不需了解具体的事情操作的过程.后者需要具备应有的技能来做这些事情. ...

  6. 一线大厂Java面试必问的2大类Tomcat调优

    一.前言 最近整理了 Tomcat 调优这块,基本上面试必问,于是就花了点时间去搜集一下 Tomcat 调优都调了些什么,先记录一下调优手段,更多详细的原理和实现以后用到时候再来补充记录,下面就来介绍 ...

  7. ansible部署apache

    Ansible 配置Apache(加粗的字体是要执行的命令) 配置免密登录 [root@localhost ansible]# vim /etc/ansible/hosts //用来配置目标主机 加入 ...

  8. 建议2:注意Javascript数据类型的特殊性---(1)防止浮点数溢出

    1.防止浮点数溢出 二级制的浮点数不能正确地处理十进制的小数,因此 0.1+0.2不等于0.3 num = 0.1+0.2; //0.30000000000000004 这是JavaScript中经常 ...

  9. 你不知道的JavaScript(上)this和对象原型(四)原型

    五章 原型 1.[[ Prototype ]] JavaScript 中的对象有一个特殊的 [[Prototype]] 内置属性,其实就是对于其他对象的引用.几乎所有的对象在创建时 [[Prototy ...

  10. 【搞定Jvm面试】 面试官:谈谈 JVM 类文件结构的认识

    类文件结构 一 概述 在 Java 中,JVM 可以理解的代码就叫做字节码(即扩展名为 .class 的文件),它不面向任何特定的处理器,只面向虚拟机.Java 语言通过字节码的方式,在一定程度上解决 ...