当前位置: 首页 > 编程笔记 >

把spring boot项目发布tomcat容器(包含发布到tomcat6的方法)

松鸣
2023-03-14
本文向大家介绍把spring boot项目发布tomcat容器(包含发布到tomcat6的方法),包括了把spring boot项目发布tomcat容器(包含发布到tomcat6的方法)的使用技巧和注意事项,需要的朋友参考一下

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及其以上版本。

但是以上流程改造完spring boot打包war包发布至tomcat6版本之后,浏览器访问项目地址会给出404的错误?为什么呢,一头雾水,经过我一番查阅资料以及实验,得出以下结论,

首先spring boot支持的servlet容器如下,可以看出spring boot最低支持的servlet版本是3.0,但是tomcat6的servlet版本是2.5,这样的话上面的流程是无法支持tomcat6发布spring boot项目的,

但是又google了一番,发现已经有人在解决这个问题了,https://github.com/dsyer/spring-boot-legacy,

标题就表明了它是为了让spring boot支持servlet2.5,刚好解决我们的痛点,使用步骤如下:

1. pom.xml中添加spring-boot-legacy的依赖,

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-legacy</artifactId>
  <version>1.1.0.RELEASE</version>
</dependency>

2.手动替换web.xml文件。但是在发布war包中发现metricFilter提示空指针异常,我就简单粗暴的将filter过滤了,注释如下。 所要替换的web.xml文件的未知如下 : {工程目录}/src/main/webapp/WEB-INF/web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>com.example.DemoApplication</param-value>
  </context-param>
  <listener>
    <listener-class>org.springframework.boot.legacy.context.web.SpringBootContextLoaderListener</listener-class>
  </listener>
<!--
  <filter>
    <filter-name>metricFilter</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>metricFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
-->
  <servlet>
    <servlet-name>appServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
      <param-name>contextAttribute</param-name>
      <param-value>org.springframework.web.context.WebApplicationContext.ROOT</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>appServlet</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>
</web-app>

完成以上两个步骤就可以让spring boot项目支持tomcat6的部署了,解决。

思考:spring boot封装带来了便利性,同时也带来了出问题的解决复杂度,如果不了解原始的spring web开发模式,出现问题很难解决。即使我现在解决了支持tomcat6的spring boot支持问题,但是不太明白解决的原理,filter出现空指针是为什么?所以深入一些原理性的东西,学习技术的基础性的东西非常重要。大家可以明白的可以解释解释2.5支持的原理,以及filter空指针的异常原因。

PS:如何将Spring Boot项目打包部署到外部Tomcat

1.项目打包

    项目开发结束后,需要打包部署到外部服务器的Tomcat上,主要有几种方式。

(1)生成jar包

cd 项目跟目录(和pom.xml同级)
mvn clean package
## 或者执行下面的命令
## 排除测试代码后进行打包
mvn clean package -Dmaven.test.skip=true

打包完成后jar包会生成到target目录下,命名一般是 项目名+版本号.jar

启动jar包命令

java -jar target/spring-boot-scheduler-1.0.0.jar

这种方式,只要控制台关闭,服务就不能访问了。下面我们使用在后台运行的方式来启动:

nohup java -jar target/spring-boot-scheduler-1.0.0.jar &

也可以在启动的时候选择读取不同的配置文件

java -jar app.jar --spring.profiles.active=product

也可以通过IDEA的Maven工具生成,点击Lifecycle-install,生成jar

(2)生成war包

  (1)修改打包类型为war:<packaging>war</packaging> 

 <packaging>war</packaging>

      (2)添加spring-boot-starter-tomcat依赖,scope设置为provided

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

  (3)注册启动类

  创建ServletInitializer.java,继承SpringBootServletInitializer ,覆盖configure(),把启动类Application注册进去。外部web应用服务器构建Web Application Context的时候,会把启动类添加进去。

public class ServletInitializer extends SpringBootServletInitializer {
  @Override
  protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
    return application.sources(BootdemoApplication.class);
  }
}

  同样也是两种方式执行:

  (1)mvn clean package -Dmaven.test.skip=true

  (2)通过IDEA的Maven工具生成,点击Lifecycle-package,生成war

2.项目部署

  无论是用哪种方式生成,最终都是为了进行部署,war可以直接拷到tomcat的webapps目录下,启动Tomcat即可。

总结

以上所述是小编给大家介绍的把spring boot项目发布tomcat容器(包含发布到tomcat6的方法),希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对小牛知识库网站的支持!

 类似资料:
  • 目的 本文档是一个技术指导性文件,用于说明“ ThingJS 项目离线部署包”安装使用的相关问题。 说明 ThingJS 项目离线部署包可由已开通 ThingJS 3D 可视化开发平台(https://www.thingjs.com) VIP商业开发者的账号进行下载。 ThingJS 项目离线部署包的正式部署授权购买者也可获得项目离线部署包。但建议项目离线部署包的正式授权者开通 VIP 商业开发者

  • 默认 Library 只会发布 release variant(变种)版本。该版本将会被所有引用它的项目使用,无论编译出多少个版本。由于 Gradle 的限制,我们正在努力解决这个问题。你可以控制哪一个 Variant 版本作为发行版: android { defaultPublishConfig "debug" } 注意这里的发布配置对应的值是完整的 variant 版本名称。reles

  • 一般情况下一个库只会发布它的release Variant(变种)版本。这个版本将会被所有引用它的项目使用,而不管它们本身自己构建了什么版本。这是由于Gradle的限制,我们正在努力消除这个问题,所以这只是临时的限制。 你可以控制哪一个Variant版本作为发行版: android { defaultPublishConfig "debug" } 注意这里的发布配置名称引用的是完整的Va

  • 我将intelliJ IDEA与grails项目一起使用,我需要将其发布到我的Artifactory服务器。我尝试使用以下命令行:grails publish-plugin--noscm--repository=mediatorbaserelease 在我同事的PC中,它工作得很好,但在我的PC中,它向我显示了以下输出:

  • 本文向大家介绍如何把spring boot项目部署到tomcat容器中,包括了如何把spring boot项目部署到tomcat容器中的使用技巧和注意事项,需要的朋友参考一下 把spring-boot项目按照平常的web项目一样发布到tomcat容器下 一、修改打包形式 在pom.xml里设置 <packaging>war</packaging> 二、移除嵌入式tomcat插件 在pom.xml里

  • 我正在尝试设置CI / CD,但没有太多的运气。我的目标是通过 构建一个 .net 网络项目,并将其部署到 应用程序。 我现在在哪里? 创建了< code>vsts-ci.yml文件,如下所示: 我有一个构建定义,如下所示: 有了这个,我的第一步运行正确。顺便说一下代理池是。 然后,我创建了一个如下发布管道: 作为第1阶段的任务(在工件步骤之后运行的部分),我有以下内容: 我已经将构建与主分支提交