SpringBoot项目打包发布到外部tomcat(出现各种异常的解决)

先说遇到问题的情景:

初次尝试使用spring boot框架写了个小web项目,在Intellij IDEA中能正常启动运行。使用maven 运行install,生成war包,发布到本机的tomcat下,出现异常,主要的异常信息是  .......LifeCycleException。经各种搜索,找到答案。

spring boot因为内嵌tomcat容器,所以可以通过打包为jar包的方法将项目发布,但是如何将spring boot项目打包成可发布到tomcat中的war包项目呢?

1. 既然需要打包成war包项目,首先需要在pom.xml文件中修改打包类型,将spring boot默认的<packaging>jar</packaging>修改为<packaging>war</packaging>形式;

2. 其次spring boot的web项目中内嵌tomcat服务器,所以如果我们想要发布war包到tomcat项目,要讲spring boot中内嵌的tomcat包依赖排除,不然产生冲突,打开下面代码中的注释即可。

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
  <!--
  <exclusions>
    <exclusion>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-tomcat</artifactId>
    </exclusion>
  </exclusions>
  -->
</dependency>

有一点想说的是,如果本地开发的时候依然想要使用spring boot内嵌tomcat进行调试,添加如下依赖即可;

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-tomcat</artifactId>
  <scope>provided</scope>
</dependency>

3. spring boot发布jar包web程序的入口是main函数所在的类,使用@SpringBootApplication注解。但是如果war包发布至tomcat,需要增加 SpringBootServletInitializer 子类,并覆盖它的 configure 方法,或者直接将main函数所在的类继承 SpringBootServletInitializer 子类,并覆盖它的 configure 方法。代码举例如下,

@SpringBootApplication
public class DemoApplication extends SpringBootServletInitializer {

  @Override
  protected SpringApplicationBuilder configure(
      SpringApplicationBuilder application) {
    return application.sources(DemoApplication.class);
  }

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

以上就完成了spring boot项目打包war包的所有步骤,可以发布至tomcat7及其以上版本。

最后还有最重要的一点,如果你本机的tomcat版本和  springboot自动集成的8.0版本不一致。也会出问题,解决办法 :

我本地的Tomcat版本是8.0.28, 而服务器上的Tomcat是7.0.69。 我在本地下了个Tomcat7.0.70部署也报同样错误。更加确定问题跟Tomcat版本有关。经过多方查找资料,最后在Stackoverflow上看到一个老外说SpringBoot默认Servlet容器是基于Tomcat8的

在打好的war包中确实发现了Tomcat相关jar包,而且是Tomcat8的,拿Tomcat8的embed包在Tomcat7下面那肯定是不能用啊

要支持低版本Tomcat需要在maven中指定Tomat版本,配置如下:

<properties>
  <tomcat.version>7.0.69</tomcat.version>
</properties>

然后依赖中加上(这个其实不加也行, 官方文档是加上的)

<dependency>
  <groupId>org.apache.tomcat</groupId>
  <artifactId>tomcat-juli</artifactId>
  <version>${tomcat.version}</version>
</dependency>

加上以后试了下,果然是没问题了。看了下war包中的lib目录,确实已经变成Tomcat7的包了

但是我还是有点疑惑, 这样配置打成包岂不是换个Tomcat版本就要重新打次包? 既然是由于SpringBoot内部的Servlet容器造成了这个限制, 那我不用行不行? 又查了很多资料, 还真有办法!

<!-- 打war包时加入此项, 告诉spring-boot tomcat相关jar包用外部的,不要打进去 -->
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-tomcat</artifactId>
  <scope>provided</scope>
</dependency>

试了下, 加上这个后, 上面说Tomcat的版本无需指定了, 耶! ^_^

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • spring boot项目打包成war在tomcat运行的全步骤

    前言 使用maven创建的springboot项目,默认是jar包,springboot还有自己带的tomcat.现在需要将项目打包,并部署到服务器tomcat下面. 下面就让我们来一起把spring-boot项目按照平常的web项目一样发布到tomcat容器下,下面话不多说了,来一起看看详细的介绍吧 一.修改打包形式 在pom.xml里设置 <packaging>war</packaging> 二.移除嵌入式tomcat插件 在pom.xml里找到spring-boot-star

  • Spring Boot打包war jar 部署tomcat

    概述 1.Spring Boot聚合工程打包war部署Tomcat 2.Spring Boot打包Jar,通过Java -jar直接运行. 3.提供完整pom.xml测试项目 至github 解决问题 1.xxxx中没有主清单属性 2.解决没有web.xml而报错 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-war-plugin:2.2:war (default-war) on project provider: E

  • spring Boot打包部署到远程服务器的tomcat中

    前言 Spring Boot项目一般都是内嵌tomcat或者jetty服务器运行,很少用war包部署到外部的服务容器,即使放到linux中,一般也是直接启动Application类,但是有些时候我们需要部署到外部的服务器,这对于Spring Boot来说却有点麻烦 下面话不多说了,来一起看看详细的介绍吧. 环境声明: jdk:1.8 服务器:阿里云,ubuntu 16.04 springBoot:1.5.9.RELEASE 目的 将springBoot 打包到远程服务器的tomcat中. pom

  • SpringBoot项目打包发布到外部tomcat(出现各种异常的解决)

    先说遇到问题的情景: 初次尝试使用spring boot框架写了个小web项目,在Intellij IDEA中能正常启动运行.使用maven 运行install,生成war包,发布到本机的tomcat下,出现异常,主要的异常信息是  .......LifeCycleException.经各种搜索,找到答案. spring boot因为内嵌tomcat容器,所以可以通过打包为jar包的方法将项目发布,但是如何将spring boot项目打包成可发布到tomcat中的war包项目呢? 1. 既然需要

  • SpringBoot项目打包war包时无法运行问题的解决方式

    目录 序 SpringBoot项目打包 jar 包 和 tomcat 包 实际问题及解决方式 问题 解决方法 end 序 现实的情况下遇见过该问题刚好记录一下! SpringBoot项目打包 首先默认创建的maven springBoot项目进行代码的clean 和 install进行项目打包的时候默认是使用jar 包的形式进行打包的,如果需要进行war 包打包部署的话就需要修改相应的 数据内容了 jar 包 和 tomcat 包 jar 包打完之后进行部署的时候使用 java -jar 的启动

  • springBoot项目打包idea的多种方法

    War包 1.首先在启动类继承SpringBootServletInitializer @SpringBootApplication public class DemoApplication extends SpringBootServletInitializer { @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { return application.s

  • springboot项目打包成jar包的图文教程

    目录 一.为什么打包 二.如何打包 (1)使用IDEA进行打包 (2)使用maven进行打包 三.运行jar包 四.注意 一.为什么打包 项目开发完毕后会将前后端应用打包,然后部署到服务器上运行.Java Web应用在Spring Boot之前,通常是打包成war包,结合Tomcat来完成部署.而对于SpringBoot,官方的建议是将Spring Boot应用打包成一个fat jar(SpringBoot默认打包方式),即项目的依赖jar包也会被包含在Spring Boot项目的jar包当中,

  • SpringBoot项目打包三方JAR的示例代码

    SpringBoot项目打包成可运行JAR包,但是不是所有JAR包都是MAVEN中央库或者是私有库里面有的,那么要如何把第三方的JAR包通过MAVEN的SpringBoot的打包组件打包进可运行JAR包里呢? 解决方法: 1.所第三方的JAR放到项目下如:/src/lib 2.加入maven依赖: <dependency> <groupId>com.seven</groupId> <artifactId>smssdk</artifactId> &

  • IDEA 将 SpringBoot 项目打包成jar的方法

    新建SpringBoot项目:IDEA 创建 SpringBoot 项目 一.打包配置 1.File -> Project Structure 2.Project Structure 3.设置启动类及META-INF 根据 modules 创建 jar.如图所示,选择项目,入口类等.最后一项 META-INF 默认放到 src\main\java 目录里,如果使用默认值,没有进行其他配置,生成的 jar 有可能不会包含 META-INF 目录,导致运行 jar 出错,正确的是将 META-INF

  • Java项目打包发布到maven私仓常见的几种方式

    前言 在早期没有使用maven之前,我们引用一些公有jar或者api jar,我们可能会采用这样的方式,通过手动导入这些jar到项目的classpath路径进行引用. 有了maven后,我们公司内部可能就会搭建maven私仓比如nexus,然后把这些公有jar或者api jar上传到nexus私仓,在pom.xml配置一下这些jar的坐标就可以引用. 今天我们的话题就是来聊聊项目打包发布到maven私仓常见的几种方式 发布到maven私仓的步骤 1.在maven的settings.xml中< s

  • SpringBoot项目jar发布后如何获取jar包所在目录路径

    目录 SpringBoot项目jar发布获取jar包所在目录路径 SpringBoot打可执行jar运行时输出文件路径问题 SpringBoot项目jar发布获取jar包所在目录路径 ApplicationHome ah = new ApplicationHome(getClass()); File file = ah.getSource(); System.out.println(file.getParentFile().toString()); 说明: 该种方法获取jar包所在路径好处,会根

  • vue项目打包发布上线的方法步骤

    目录 一.开发环境到生产环境的转变 二.设置统一的请求路径 三.运行打包命令 vue项目开发完成后,我们需要将项目打包上线,同时我们希望可以在本地预览生产环境项目 (以vue-cli脚手架生成的项目为例) 一.开发环境到生产环境的转变 项目开发结束之后,首先我们需要通知后端,获取一个线上的路径,之后将之前的开发路径切换为线上路径. 打开项目中config文件夹里面的 dev.env.js 文件,将后端给的线上路径填入. 'use strict' module.exports = { NODE_E

  • 解决Springboot项目打包后的页面丢失问题(thymeleaf报错)

    目录 Springboot项目打包后的页面丢失 遇到的问题目前找到两种 Springboot打包ThymeLeaf报错 原因 解决办法 Springboot项目打包后的页面丢失 遇到的问题目前找到两种 返回视图路径以/开头,例如 /test/hello 在thymeleaf页面中,引入的页面以/开头,例如:<footer th:replace="/index::footer"></footer> 代码书写规范: @GetMapping("/about-

随机推荐