从零构建tomcat环境

一、官网构建

1.1 下载

一般来说对于开源软件都有自己的官方网站,并且会附上使用文档以及一些特性和二次构建的方法,那么我们首先的话需要从官网或者tomcat上下载到我们需要的源码包。下载地址:官网、Github。
官网方式
github方式
这里需要声明一下,我们是通过源码来进行编译的,所以我们需要下载src下的源码包,然后才能进行构建,而对于bin包下的是官网已经构建好的软件。

1.2 搭建ant环境

因为tomcat是JAVA语言编写的,所以在这里默认我们已经有了JAVA环境,然后我们直接进行安装ant。安装地址

因为在tomcat的官方网站上,明确的指出官方所支持的构建方式是ant构建,所以我们在这采用ant的方式来构建环境。
然后我们需要像安装JDK一样来进行配置环境变量,创建环境变量ANT_HOME=解压路径的根路径,再向PATH中添加%ANT_HOME%\bin,在控制台输入ant -version,观察到ANT的版本后就说明ant已经安装成功。
ant安装结果

1.3 执行构建

我们首先需要配置一下构建的一些配置文件,先新建build.properties文件在主目录,并输入下面的几行配置。

#依赖下载的位置
base.path=D:\\Programe\\apache-tomcat-9.0.68-src\\dependency
#代理
proxy.host=127.0.0.1
proxy.port=7890
#是否使用代理
proxy.use=on

在执行构建的过程中,我们需要下载依赖包,所以会比较的缓慢。
我们直接在tomcat的主目录执行 ant 这个命令。然后就可以开启构建的流程了。
构建成功
在看到上述的图片后就说明我们已经构建完成,到这里或许你会有疑问,为什么我们要构建一个tomcat,直接使用官方的不好吗。其实对于我们来说tomcat在使用的过程中更像是一个黑盒的容器,我们不知道它的内部具体实现,一般也只是在使用。构建tomcat能够帮助我们来二次开发和构建适合我们自己业务的软件,也可以让我们自己写的代码打入tomcat容器中。
上述的话便是官方方式推荐的构建tomcat,而我们的学习需要在编译器中把tomcat给跑起来,然后方便我们调试和学习,下来我们将进行IDEA版本的构建。

二、IDEA构建运行环境

2.1 构建环境

众所周知Tomcat实际上是一个JAVA的项目,而对于JAVA项目来说我们可以通过maven的方式来构建一个具有很方便的依赖管理方式的项目,就不再需要我们去下载依赖,而是直接通过maven仓库的方式进行管理,有效的规范了我们的依赖存放方式。
首先,我们需要将tomcat的源码通过IDEA打开,然后我们在根目录中进行新建一个pom.xml,并把此项目标记为maven项目。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.apache.tomcat</groupId><artifactId>Tomcat8.0</artifactId><name>Tomcat8.0</name><version>8.0</version><build><finalName>Tomcat8.0</finalName><!--声明JAVA源代码路径--><sourceDirectory>java</sourceDirectory><!--声明JAVA测试代码路径--><testSourceDirectory>test</testSourceDirectory><resources><resource><directory>java</directory></resource></resources><testResources><testResource><directory>test</directory></testResource></testResources><!--编译插件--><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.5.1</version><configuration><encoding>UTF-8</encoding><source>1.8</source><target>1.8</target></configuration></plugin></plugins></build><dependencies><!--单元测试--><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency><!--mock对象--><dependency><groupId>org.easymock</groupId><artifactId>easymock</artifactId><version>3.4</version></dependency><!--构建工具--><dependency><groupId>org.apache.ant</groupId><artifactId>ant</artifactId><version>1.10.14</version></dependency><!--解析WSDL文本的常用工具--><dependency><groupId>wsdl4j</groupId><artifactId>wsdl4j</artifactId><version>1.6.3</version></dependency><!--Java Web服务开发包(WSDP)的应用程序接口(API)--><dependency><groupId>javax.xml</groupId><artifactId>jaxrpc</artifactId><version>1.1</version></dependency><!--JavaTM 认可的Java 编译工具--><dependency><groupId>org.eclipse.jdt.core.compiler</groupId><artifactId>ecj</artifactId><version>4.6.1</version></dependency><dependency><groupId>biz.aQute.bnd</groupId><artifactId>biz.aQute.bndlib</artifactId><version>6.3.1</version></dependency></dependencies>
</project>

添加maven项目
我们点击add as maven project,并刷新依赖关系,等待具体的依赖包下载完毕后就可以了。

2.2 运行

我们一般的启动方式是通过tomcat的bin目录下的start.bat或者是start.sh来进行启动,那么我们心中是否会有这样一个疑问?tomcat是否是有main函数的。这个回答是当然,对于JAVA程序来说main函数是方法执行的入口,如果没有入口函数,那么tomcat容器就不可能会进行启动,接下来我们就来通过启动脚本来探索一下tomcat启动的具体步骤。

setlocal
set "CURRENT_DIR=%cd%"
if not "%CATALINA_HOME%" == "" goto gotHome
set "CATALINA_HOME=%CURRENT_DIR%"
if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome
cd ..
set "CATALINA_HOME=%cd%"
cd "%CURRENT_DIR%"
:gotHome
if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome
echo The CATALINA_HOME environment variable is not defined correctly
echo This environment variable is needed to run this program
goto end
:okHomeset "EXECUTABLE=%CATALINA_HOME%\bin\catalina.bat"rem Check that target executable exists
if exist "%EXECUTABLE%" goto okExec
echo Cannot find "%EXECUTABLE%"
echo This file is needed to run this program
goto end
:okExecrem Get remaining unshifted command line arguments and save them in the
set CMD_LINE_ARGS=
:setArgs
if ""%1""=="""" goto doneSetArgs
set CMD_LINE_ARGS=%CMD_LINE_ARGS% %1
shift
goto setArgs
:doneSetArgscall "%EXECUTABLE%" start %CMD_LINE_ARGS%:end

主要的就是找到catalina.bat,然后调用这个批处理命令,我们继续来看catalina.bat,这里就不进行贴出代码了,主要讲一下逻辑。
catalina.bat设置了几个环境变量,CATALINA_HOME和CATALINA_BASE,获取了安装的JAVA虚拟机的路径和参数,设置了日志文件的配置。
在这里面我们可以看到所指定的MAINCLASS,然后这个文件就是我们启动的main函数的所在类。
catalina
bootstrap.java
这样我们就知道了,在启动主类的时候我们要向虚拟机指定一些环境变量,不然的话导致main函数中的部分代码找不到资源文件,这里我们只指定必要的几个变量。

-Dcatalina.home=D:\apache-tomcat-9.0.68-src\apache-tomcat-9.0.68-src
-Dcatalina.base=D:\apache-tomcat-9.0.68-src\apache-tomcat-9.0.68-src
-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
-Djava.util.logging.config.file=D:\apache-tomcat-9.0.68-src\apache-tomcat-9.0.68-src\conf\logging.properties

我们来在IDEA里面新添加一个应用配置
添加配置
选择主类为我们刚才找到的Bootstrap.java文件,并将上述的几个参数添加进虚拟机的运行时的参数列表。(这里请注意不是项目参数是虚拟机参数)
最后我们来进行启动项目。
这里可能会遇到编译错误,我们只需要将JDT的所有爆红的改为自己的版本即可,例如我是CompilerOptions.VERSION_1_8。
编译失败
我们发现启动成功了,但是会有乱码的问题。
乱码
在我们自己安装的时候我们是通过配置文件解决的乱码,就是将所有的编码方式设置为GBK实现的,在这里呢我们来通过修改代码来实现。
修改org.apache.tomcat.util.res#getString(final String key, final Object… args)
在这里插入图片描述

  try {value = new String(value.getBytes("ISO-8859-1"), "UTF-8");} catch (UnsupportedEncodingException e) {e.printStackTrace();}

修改org.apache.jasper.compiler.Localizer#getMessage()

        try {if (bundle != null) {errMsg = bundle.getString(errCode);}errMsg = new String(errMsg.getBytes("ISO-8859-1"), "UTF-8");} catch (MissingResourceException | UnsupportedEncodingException e) {}

然后我们再进行启动,就可以看到如下图的启动结果。
启动成功
然后我们来进行访问我们我们熟悉的8080端口。
空指针异常
发生了空指针异常,这是因为我们没有添加jsp的解析类,导致了解析jsp时出现了异常,我们需要在ContextConfig.java中载入jsp的解析类。
添加JSP解析
最终在这里插入图片描述
我们再进行启动就可以获得我们的主页了。

三、总结

今天我们通过了官网和编译器的方式构建了tomcat环境,之后我们可以很方便的对于我们自己的tomcat进行调试开发,然后通过官网的方式进行构建我们自己的二次开发的tomcat容器。
技术无难事,只是走的人少便成了难事,让我们共同学习,一起进步。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/578518.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机毕业设计------SSM水果蔬菜商城批发网站

项目介绍 本项目分为前后台&#xff0c;前台为普通用户登录&#xff0c;后台为管理员登录&#xff1b; 管理员角色包含以下功能&#xff1a; 管理员登录,管理员管理,网站用户管理,新闻公告管理,果蔬类型管理,城市信息管理,配货点管理,果蔬商品管理,果蔬订单管理,果蔬评价管理…

vivo手机怎样录屏?轻松录制精彩瞬间

“vivo手机怎样录屏呀&#xff1f;买了最新款的vivo手机&#xff0c;感觉功能挺齐全的&#xff0c;最近玩游戏的时候&#xff0c;突然想要录屏&#xff0c;但是怎么都找不到&#xff0c;就想问问大家&#xff0c;vivo手机录屏在哪里呀&#xff1f;” 智能手机已经成为我们生活…

【Java动态代理如何实现】

✅Java动态代理如何实现 ✅JDK动态代理和Cglib动态代理的区别 ✅拓展知识仓✅静态代理和动态代理的区别✅动态代理的用途✅Spring AOP的实现方式&#x1f4d1;JDK 动态代理的代码段&#x1f4d1;Cglib动态代理的代码块 ✅注意事项&#xff1a; 在Java中&#xff0c;实现动态代理…

从git上拉取代码---步骤

1、先进入gitlab地址 2、git clone 地址.git 3、cd 路径 4、git checkout dev 5、git checkout -b 自己的分支 &#xff08;创建自己的分支&#xff09;

Visual Studio2022配置ReSharper C++ 常用设置

如需安装免费的可以在下面留言&#xff0c;看到即回复 文章目录 Visual Studio2022配置ReSharper C 常用设置配置Visual Studio2022&#xff0c;使其能够按回车进行补全配置ReSharper C 设置自动弹出配置ReSharper C 的快捷键ReSharper C 去掉注释拼写使用中文注释 如何关闭新版…

SpringBoot整合jwt(小白入门)

本文项目所用版本为&#xff1a; https://blog.csdn.net/weixin_39570751/article/details/133386557 代码仓库: https://gitee.com/skyblue0678/springboot-demo 目录 什么是JWT JWT依赖 写一个jwt工具类 测试一下jwt 优化&#xff1a;将过期时间配置在文件中 答疑&…

Unitree H1,国内第一台能跑的全尺寸通用人形机器人

原创 | 文 BFT机器人 随着科技的不断发展&#xff0c;机器人技术已经逐渐渗透到各个领域&#xff0c;为人类的生产和生活带来了极大的便利。2023年可以说是通用人形机器人的高光之年&#xff0c;国内外不少机器人和科技团队纷纷发布了人形机器人原型机或产品规划&#xff0c;甚…

外贸中的很多跟想的不一样的事情

说说最近遇到的几个客户情况&#xff0c;以及对一些事情刷新的认知。 第一个客户姑且称为A吧&#xff0c;这个客户在询价的时候&#xff0c;产品的名称以及数量以还有走货的方式写的很清楚&#xff0c;客户A要的产品不是很多&#xff0c; 顶多算是个样品单。 一般情况下&…

PostgreSQL 可观测性最佳实践

简介 软件简述 PostgreSQL 是一种开源的关系型数据库管理系统 (RDBMS)&#xff0c;它提供了许多可观测性选项&#xff0c;以确保数据库的稳定性和可靠性。 可观测性 可观测性&#xff08;Observability&#xff09;是指对数据库状态和操作进行监控和记录&#xff0c;以便在…

Linux操作系统——进程(四)进程切换与命令行参数

进程切换 概念引入 下面我们先了解几个概念&#xff1a; 竞争性: 系统进程数目众多&#xff0c;而CPU资源只有少量&#xff0c;甚至1个&#xff0c;所以进程之间是具有竞争属性的。为了高效完成任务&#xff0c;更合理竞争相关资源&#xff0c;便具有了优先级 独立性: 多进程…

[论文阅读笔记28] 对比学习在多目标跟踪中的应用

这次做一篇2D多目标跟踪中使用对比学习的一些方法. 对比学习通过以最大化正负样本特征距离, 最小化正样本特征距离的方式来实现半监督或无监督训练. 这可以给训练MOT的外观特征网络提供一些启示. 使用对比学习做MOT的鼻祖应该是QDTrack, 本篇博客对QDTrack及其后续工作做一个总…

Linux OpenEuler(欧拉系统)无公网ip实现SSH远程连接

&#x1f525;博客主页&#xff1a; 小羊失眠啦. &#x1f3a5;系列专栏&#xff1a;《C语言》 《数据结构》 《Linux》《Cpolar》 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;…

研究生可以直接当教师吗

在教育领域&#xff0c;教师岗位的竞争日益激烈。许多即将毕业的研究生&#xff0c;尤其是教育学专业的&#xff0c;都怀揣着一个共同的疑问&#xff1a;我能不能一出校门就直接当教师&#xff1f; 成为教师并不只是有个学历那么简单。它需要具备扎实的教育学基础、良好的教学技…

Matlab:解非线性方程组

1、基于问题求解非线性方程组 例&#xff1a; xoptimvar(x,2); %将x定义为一个二元素优化变量 eq1exp(-exp(-(x(1)x(2))))x(2)*(1x(1)^2); %创建第一个方程作为优化等式表达式 eq2x(1)*cos(x(2))x(2)*sin(x(1))1/2; %创建第二个方程作为优化等式表达式 probe…

【数据结构和算法】找到最高海拔

其他系列文章导航 Java基础合集数据结构与算法合集 设计模式合集 多线程合集 分布式合集 ES合集 文章目录 其他系列文章导航 文章目录 前言 一、题目描述 二、题解 2.1 前缀和的解题模板 2.1.1 最长递增子序列长度 2.1.2 寻找数组中第 k 大的元素 2.1.3 最长公共子序列…

fpga verilog rs232 发送模块实现

RS-232是一种串行通信协议&#xff0c;用于在计算机和其他外部设备之间进行数据传输。RS-232定义了电气特性、信号级别、机械特性和传输速率等规范&#xff0c;为串行通信提供了一种标准化的接口。 RS-232通常使用DB9连接器&#xff0c;用于传输和接收数据、控制信号以及地线连…

12月25日作业

串口发送控制命令&#xff0c;实现一些外设LED 风扇 uart4.c #include "uart4.h"void uart4_config() {//1.使能GPIOB\GPIOG\UART4外设时钟RCC->MP_AHB4ENSETR | (0x1 << 1);RCC->MP_AHB4ENSETR | (0x1 << 6);RCC->MP_APB1ENSETR | (0x1 <…

边缘计算云边端全览—边缘计算系统设计与实践【文末送书-10】

文章目录 一.边缘计算1.1边缘计算的典型应用 二.边缘计算 VS 云计算三.边缘计算系统设计与实践【文末送书-10】3.1 粉丝福利&#xff1a;文末推荐与福利免费包邮送书&#xff01; 一.边缘计算 边缘计算是指在靠近物或数据源头的一侧&#xff0c;采用网络、计算、存储、应用核心…

STM32CubeIDE在使用freertos的情况下空间占用情况

因为STM32F103C8T6芯片的存储空间太小了&#xff0c;只有64K&#xff0c;在使用STM32CubeIDE的freertos情况下空间占用情况做个简单的测试&#xff1a; 不使用程序优化&#xff1a; 空间占用情况&#xff1a; 如果使用浮点运算功能的printf&#xff1a; 这个使用空间占用更大…