当前位置: 首页 > news >正文

知识点17--如何将spring boot项目布置在外部tomcat中

我们前面的知识点使用spring boot开发了一个用户管理的demo,但是启动的时候我们都使用的是spring-boot-web依赖导入的内置tomcat,这在正式的开发中一般是不提倡的,除非开发的系统在使用上要求不高,而且很多时候网络策略只给了少量的端口,因此你办不到模块都用不同的内置web软件并占用不同的端口,所以单凭内置的tomcat是无法保证系统正常的运行的,这时通常的开发手动就是部署到外置的tomcat上。现在我们一起看一下如何部署。

第一步:首先我们需要在maven的pom中直接修改打包方式为war

<packaging>war</packaging>

第二步:既然使用外部tomcat那就必须保证没有任何的内置web插件,我们前面的知识点教大家使用了undertow内置web插件,同理我们只需要删掉它的依赖,并保持内置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>

第三步:我们需要在项目中准备一个配置类,这个类如果有SSM基础的朋友,应该知道spring容器有一种手动写启动类的方式,作为兄弟的spring-boot当然也有,只是这个类并不是让我们手动运行的,而是默许tomcat这类web链接软件去调用启动spring-boot的一个类

package com.wy.scjg.config;

import com.wy.scjg.ScjgApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;

/**
 * @创建人 wangyang
 * @创建时间 2022/10/1
 * @描述
 *
 * 外部web链接软件 配置类
 * 必须重写configure方法并指定该项目的系统类
 */
public class MySpringBootServletIni extends SpringBootServletInitializer {
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
        return builder.sources(ScjgApplication.class);
    }
}

第四步:在build标签中添加一个打包名,这个名字决定了打包后的包名,这个设置主要是因为正式开发中很少一个项目从根目录开始开发,而是项目根目录下又分为各个子模块,所以需要告诉maven打包后的总包名字是什么

<finalName>scjg</finalName>

第五步:在打包之前,如果你的项目中使用了javax.servlet包下的资源,你会发现项目中报错,是因为上面删除了内置web链接软件因此相关依赖没有了,我们单独导入一下即可

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

第六步:打包,但是打包之前,一定要点击下图这个图标,不让maven进行test不然会报错
在这里插入图片描述
打好包后将war包放在tomcat的webapps文件夹下,并运行bin目录下的startup.bat
在这里插入图片描述
启动的黑窗口不报错就可以了,但在这个时候要知道一个问题,默认情况下:用外部的web链接软件启动后,springboot项目中配置的端口、项目名就失效了,统一按照所使用的的web软件的访问方式,例如此时的tomcat需要使用 “默认8080端口+项目名+请求路径” 进行访问,但是对于springboot项目来说这其中就涉及到一个问题,见特别说明
在这里插入图片描述


特别说明

你要把一个本来是内置web软件的spring boot项目变成外置部署的方式,且这个项目不是前后端分离的开发形式,那么一定要检查你所使用的外部软件的配置,需要检查它的访问方式是否已改成不需要项目名的方式,因为内置web软件时,你的所有请求路径是例如localhost:91:/login的这种springboot内置访问方式,而你外置之后根据不同的外置web软件你需要注意请求路径发生的改变

就像上面截图中的http://localhost:8080/scjg/user/toLogin一样,它在内置web时访问的路径应该是http://localhost:91/user/toLogin,端口号不需要你担心,但是端口号和请求路径中间多了一个项目名,这个就会导致你首次手动输入的路径可以正常访问,但是之后的系统运行都是写好的代码,由于没有项目名导致全是404,到此给大家附上修改tomcat不要项目名访问的配置方式

打开tomcat的server.xml配置文件
在这里插入图片描述
我们需要将配置中的HOST修改一下,修改前是如下值

<Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">

修改后如下,注意把你的项目名改好

<Host name="localhost"  appBase="" unpackWARs="true" autoDeploy="true">
		
<Context docBase="webapps/你的项目名" path="" reloadable="true" source="org.eclipse.jst.jee.server:你的项目名"/>

这样你才可以正常的访问在外置tomcat上的springboot项目


这个时候或许有人会想到和SSM那样使用试图解析器解决项目名的问题,但是根据本作者实操发现这个方法行不通,首先面临的第一个问题就是springboot前端页面开发方式中相对成体系的不再和SSM一样只有jsp了,这就导致不同的前端技术所用的配置试图解析方式是不同的,就比如本系列知识点中用的是freemaker,它的视图解析配置是spring.freemarker.prefix和spring.freemarker.suffix。同时实操的时候使用了这个的配置,可是在tomcat运行后发现请求路径是没有错,但是前端所有的返回都是问号未知错误。

而且springboot是一个倾向于前后端分离模块化开发方式的框架,同时正式开发中后端大多都是API接口而不是单纯的跳转。就算你人为干预开发成只跳转的项目,可是对后端控制解析器路径来说有多少个前端模块和前端模块的路径是什么,这些均是未知数。并且改tomcat的好处还有一点,你可以将多个模块的项目结合成一个总项目打包,并放到tamcat上,不用费劲的区分项目名了。

相关文章:

  • 面向对象——抽象类
  • C++ 异常处理机制讲解
  • 【软考 - 高级系统架构设计师】考前冲刺计划 及 国庆作息时间
  • Typescript的数组类型
  • 【分治法】第k个数(快速选择算法,结合快速排序)
  • 西瓜书研读——第四章 决策树:ID3、C4.2、CSRT算法
  • aistudio 常规赛:钢铁缺陷检测挑战赛 经验总结,轻松复现map 47排名再度提升
  • 学习小发现-04-如何从字符串中提取数字并转换为整型输出、如何在%d输入内容中判断整型并只读取数字以整型输出、scanf的各种用法
  • Python中的闭包
  • Java知识【继承中的成员访问特点】
  • <Linux进程控制(2)>——《Linux》
  • 嵌入式软件编程模式
  • VL8 使用generate_for语句简化代码
  • 从零开始搭建uni-app框架的小程序开发环境
  • 【web】TCP/UDP协议详解(字节二面:TCP三次握手、四次挥手)
  • 【140天】尚学堂高淇Java300集视频精华笔记(86-87)
  • 【每日笔记】【Go学习笔记】2019-01-10 codis proxy处理流程
  • es6
  • EventListener原理
  • Python3爬取英雄联盟英雄皮肤大图
  • 创建一种深思熟虑的文化
  • 飞驰在Mesos的涡轮引擎上
  • 极限编程 (Extreme Programming) - 发布计划 (Release Planning)
  • 嵌入式文件系统
  • 想写好前端,先练好内功
  • - 转 Ext2.0 form使用实例
  • 看到一个关于网页设计的文章分享过来!大家看看!
  • LIGO、Virgo第三轮探测告捷,同时探测到一对黑洞合并产生的引力波事件 ...
  • RDS-Mysql 物理备份恢复到本地数据库上
  • 阿里云服务器购买完整流程
  • #{}和${}的区别是什么 -- java面试
  • (10)STL算法之搜索(二) 二分查找
  • (20050108)又读《平凡的世界》
  • (poj1.2.1)1970(筛选法模拟)
  • (定时器/计数器)中断系统(详解与使用)
  • (个人笔记质量不佳)SQL 左连接、右连接、内连接的区别
  • (九十四)函数和二维数组
  • (三分钟了解debug)SLAM研究方向-Debug总结
  • (转)c++ std::pair 与 std::make
  • (转)eclipse内存溢出设置 -Xms212m -Xmx804m -XX:PermSize=250M -XX:MaxPermSize=356m
  • .net oracle 连接超时_Mysql连接数据库异常汇总【必收藏】
  • .NET/C# 使用 SpanT 为字符串处理提升性能
  • //解决validator验证插件多个name相同只验证第一的问题
  • @Conditional注解详解
  • @KafkaListener注解详解(一)| 常用参数详解
  • [ 2222 ]http://e.eqxiu.com/s/wJMf15Ku
  • [ solr入门 ] - 利用solrJ进行检索
  • [ 蓝桥杯Web真题 ]-Markdown 文档解析
  • []error LNK2001: unresolved external symbol _m
  • [100天算法】-目标和(day 79)
  • [ASP.NET MVC]Ajax与CustomErrors的尴尬
  • [bug总结]: Feign调用GET请求找不到请求体实体类
  • [C#] 基于 yield 语句的迭代器逻辑懒执行
  • [CareerCup] 12.3 Test Move Method in a Chess Game 测试象棋游戏中的移动方法
  • [C语言]——函数递归