news 2026/9/9 10:09:29

Tomcat 10下载安装全攻略:版本兼容、环境配置与部署避坑指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Tomcat 10下载安装全攻略:版本兼容、环境配置与部署避坑指南

1. 下载Tomcat10之前,你必须先搞清楚的版本问题

很多人下载Tomcat10的时候,第一反应是去搜索引擎找“Tomcat10下载”,然后随便点开一个下载站,把zip包拿下来解压就准备部署项目。这个流程在Tomcat 9及以前基本没问题,但到了Tomcat 10这里,有个非常关键的变化,如果你不知道,项目大概率跑不起来。

Tomcat 10和Tomcat 9之间最本质的区别,不是版本号差了一位,而是整个Java Web的命名空间从javax.*迁移到了jakarta.*。这件事的来龙去脉得从Java EE归属权说起。当年Oracle把Java EE捐给了Eclipse基金会,但“Java”这个商标Oracle还攥在手里,所以Eclipse基金会接手后把Java EE改名成了Jakarta EE,规范里所有的包名也一并调整,javax.servlet变成了jakarta.servletjavax.servlet.http变成了jakarta.servlet.http。Tomcat 9实现的是Java EE 8规范,依然用javax;Tomcat 10实现的是Jakarta EE 9/10规范,全面换成了jakarta

这就带来一个非常现实的后果:你在Tomcat 9上跑得好好的war包,直接丢进Tomcat 10,大概率报java.lang.NoClassDefFoundError: javax/servlet/...或者ClassNotFoundException。不是你的代码出了问题,而是Tomcat 10里根本不存在javax.servlet这个包了。所以,如果你是老项目迁移,第一步不是下载,而是先想清楚:项目里所有依赖Servlet API的代码、第三方库、注解,是否已经适配了jakarta.*命名空间。如果没适配,下载安装完也只是拿到一个跑不起来的环境。

另外,Tomcat 10本身还有细分版本。10.0.x实现的是Servlet 5.0规范,对应Jakarta EE 9;10.1.x实现的是Servlet 6.0规范,对应Jakarta EE 10。官方维护策略里,10.0.x已经进入EOL(停止维护)阶段,新项目直接选10.1.x,别犹豫。至于Tomcat 11,那是后话,需要JDK 17起步,普通项目暂时没必要追。

1.1 JDK版本对应关系,别装完了才发现不兼容

Tomcat是用Java写的,运行它必须依赖JDK。不同Tomcat版本对JDK版本的要求不同,这个在Apache官网每个版本的文档里都有说明,但很多教程从来不提,导致有人用JDK 8去跑Tomcat 10.1,启动直接报UnsupportedClassVersionError。

我把对应关系整理成一张表,下载前先对照一下:

Tomcat版本最低JDK版本对应Servlet规范对应Jakarta EE版本
Tomcat 9.0.xJDK 8Servlet 4.0Java EE 8
Tomcat 10.0.xJDK 8Servlet 5.0Jakarta EE 9
Tomcat 10.1.xJDK 11Servlet 6.0Jakarta EE 10
Tomcat 11.0.xJDK 17Servlet 6.1Jakarta EE 11

注意,Tomcat 10.0虽然官方说最低JDK 8能跑,但10.1.x明确要求JDK 11+。我自己的经验是,既然都上Tomcat 10了,JDK至少用11,有条件直接上17或21。原因不光是版本兼容,JDK 11之后的垃圾回收器选择、ZGC等新特性在长连接高并发场景下表现更好,而且很多现代框架(Spring Boot 3、Spring Framework 6)本身也要求JDK 17起步,你要是还用JDK 8,后面框架版本一升级,全是坑。

检查自己JDK版本的命令很简单:

java -version

输出里如果有“version 1.8.0_xxx”,说明是JDK 8,跑Tomcat 10.1会直接报错。如果输出是“version 11.x”或“version 17.x”,那没问题。另外,JAVA_HOME环境变量也要确认指向的是JDK安装目录,而不是JRE目录。很多Windows机器上装了多个Java版本,系统里java -version显示的是新版本,但JAVA_HOME还指向老版本,Tomcat启动用的是JAVA_HOME,这样就会莫名其妙报错。

1.2 选哪个发行版:zip、tar.gz、Windows Installer还是源码

Tomcat官网的Binary Distributions下载区,每个版本都会给出一堆文件格式,新手很容易懵。我逐个说下用途。

  • zip:Windows和通用系统用的压缩包,解压即用,不需要安装程序。这是最推荐的方式,环境干净,不污染系统注册表,删掉文件夹就是卸载。
  • tar.gz:Linux/macOS下的压缩包,解压即用。
  • Windows Installer.exe安装包,会帮你注册Windows服务、写注册表,适合生产环境里要让Tomcat以系统服务方式开机自启的场景。但这也意味着卸载时容易残留,新手不推荐。
  • src开头的:源码包,一般开发者不用下,除非你要自己编译或看源码。

我的建议是,无论Windows还是Linux,一律用解压版。原因很简单:Tomcat本身是绿色软件,解压就能跑,没必要走安装程序那层封装。Windows下如果后面需要注册成服务,可以用bin目录里的tomcat10w.exe或者命令行手动注册,效果一样,还更可控。

2. 官方下载渠道与文件校验,别去第三方站点碰运气

确定好版本和文件格式后,下载地址这个问题,我要多说几句。搜“Tomcat10下载”出来的网站很多都是第三方下载站,有的会捆绑广告,有的会改文件内容,最离谱的是我见过有人从某下载站拿到的所谓“Tomcat 10”,解压出来是Tomcat 7改了后缀。所以,认准官方源是第一步。

Tomcat的官方下载页面是Apache Tomcat官网的/download-10.cgi路径。进去之后你会看到几个Mirror(镜像)链接,随便选一个就行。Apache官方推荐的镜像站会按地区给你自动分配,国内一般推荐清华、阿里云或者华为云的镜像,速度快且稳定。官方下载页的from下拉列表里就能选。

如果你需要下载历史版本,不要去主下载页翻——那里永远只挂当前最新版。历史版本在archive.apache.org/dist/tomcat/tomcat-10/目录下,按版本号一层一层找。

2.1 文件命名里的alpha、beta、RC、GA是什么意思

在下载页你会看到类似apache-tomcat-10.1.39apache-tomcat-10.1.39-deployerapache-tomcat-10.1.39-fulldocs这样的文件,另外还会看到v10.1.39-alphav10.1.39-betav10.1.39-RC1这些目录。这些后缀的意思是:

  • alpha:内部测试版,功能不完整,Bug遍地,千万别用于任何环境。
  • beta:公开测试版,功能基本完成,但还不够稳定。
  • RC(Release Candidate):候选发布版,基本和正式版功能一致,理论上没有大问题了。
  • GA:正式发布版,文件名里通常不写GA,直接写版本号,比如apache-tomcat-10.1.39就是GA版。
  • deployer:Web应用部署工具包,一般不用下载。

实际下载时,认准不带alpha/beta/RC的版本号目录,里面的文件就是GA版。目录结构通常是tomcat-10/v10.1.39/bin/下面放着所有二进制包。

2.2 下载后一定要做SHA512校验

这一点极少有教程提,但实际生产环境中非常重要。Apache所有官方文件都提供了SHA512校验值,就是防止文件在传输过程中被篡改或者下载不完整。你在下载页的bin目录里,每个.tar.gz.zip文件旁边都有一个.sha512后缀的同名文件,里面是一串哈希值。

Windows下校验方法:

certutil -hashfile apache-tomcat-10.1.39.tar.gz SHA512

Linux/macOS下校验方法:

shasum -a 512 apache-tomcat-10.1.39.tar.gz

把输出的哈希值和.sha512文件里的比对,一模一样就是没问题的。这一步其实花不了30秒,但能避免绝大多数“解压后启动报错,怎么查都是文件损坏”的问题。尤其是用浏览器多线程下载器断点续传的文件,很容易出现“表面完整、实际缺字节”的情况。

3. Windows环境安装Tomcat10:从解压到服务注册

Windows下安装Tomcat10,整个流程可以浓缩成四步:解压、配环境变量、启动、验证。但每一步都有细节,我按顺序给你捋一遍,顺便把容易踩的坑指出来。

3.1 前置准备:配置JAVA_HOME和CATALINA_HOME

先确认JDK已安装且JAVA_HOME环境变量已设置。Windows下设置环境变量的路径是:右键“此电脑” -> 属性 -> 高级系统设置 -> 环境变量。

这里有个隐藏的坑:JAVA_HOME到底是配到“用户变量”还是“系统变量”。如果你这台机器只有你一个人用Java,配到用户变量就够,Tomcat启动时会读取当前用户的JAVA_HOME。但如果你的Windows服务是以Local System账户运行的,它读不到用户变量,只能读系统变量。所以,为了少踩坑,JAVA_HOMECATALINA_HOME统一配到系统变量。

CATALINA_HOME指的就是你解压Tomcat后那层目录的完整路径。举个例子,我把Tomcat解压到了D:\dev\apache-tomcat-10.1.39,那么CATALINA_HOME就是D:\dev\apache-tomcat-10.1.39,不是D:\dev,也不是里面的bin目录。很多教程不解释清楚,有人直接把CATALINA_HOME配到了D:\dev\apache-tomcat-10.1.39\bin,结果startup.bat一执行就报找不到catalina.bat

配置好后,在Path变量里加上%CATALINA_HOME%\bin,这样后续可以直接在命令行输入startup启动,不用每次cd到tomcat目录。

3.2 目录结构速览,搞清楚每个文件夹是干嘛的

解压完成后的目录结构大致是:

apache-tomcat-10.1.39/ ├── bin/ # 启动、关闭、配置脚本 ├── conf/ # 核心配置文件 ├── lib/ # Tomcat及Web应用共用的Jar包 ├── logs/ # 日志输出目录 ├── temp/ # 临时文件 ├── webapps/ # 放置Web应用war包或目录 └── work/ # JSP编译后的class文件

bin里最常用的几个文件:

  • startup.bat:Windows启动脚本
  • shutdown.bat:Windows关闭脚本
  • catalina.bat run:前台启动,日志直接打印在窗口里,排查问题更方便
  • tomcat10w.exe:Tomcat服务管理器(图形界面)
  • service.bat:注册/卸载Windows服务的命令行工具

conf目录里最重要的文件是server.xml,端口配置、连接器参数、Host配置都在里面。刚装好的Tomcat不需要改它也能跑起来,当你需要部署实际项目时再研究。

3.3 启动Tomcat,闪退问题排查

双击bin\startup.bat,正常情况下会弹出一个新的命令窗口,输出类似:

Tomcat started.

然后你打开浏览器访问http://localhost:8080,能看到默认首页,说明成功。但Windows上最常见的现象是:双击startup.bat后窗口一闪而过,什么都没看到。这不是Tomcat启动成功又自动关闭了,而是脚本执行出错,但窗口在你看到错误信息之前就关了。

解决办法是,先打开一个命令行窗口,手动cd到Tomcat的bin目录,直接执行startup.bat。这样命令窗口不会自动关,错误信息就留在屏幕上了。绝大多数闪退的原因是JAVA_HOME没配好,或者JAVA_HOME指向了不存在的路径。脚本第一件事就是去找JAVA_HOME,找不到就直接退出。

如果日志显示UnsupportedClassVersionError,说明JDK版本不匹配,回看第一节的版本对照表。如果显示“端口8080被占用”,那得先找到占用端口的进程并处理掉,方法我在后面专门讲。

另一个排查技巧:用catalina.bat run代替startup.bat启动。run模式是前台运行,控制台会实时打印Tomcat的启动日志,包括每个LifecycleListener初始化的信息,哪里出错一目了然。我在Windows上调试Tomcat问题时,几乎都会用这个命令。

3.4 把Tomcat注册成Windows服务

开发环境里双击startup.bat没问题,但生产环境如果跑在Windows Server上,你得让Tomcat开机自启、崩溃后自动重启,这时候就要注册成Windows服务。Tomcat自带了service.bat脚本。

管理员权限打开命令行,cd到bin目录,执行:

service.bat install Tomcat10

服务名称你可以自己取,默认叫Tomcat10。注册成功后,打开“服务”管理窗口(services.msc),能看到这个服务。启动方式建议改成“自动(延迟启动)”,避免开机时和其他服务抢资源。

Tomcat注册成服务后,默认用Local System账户运行,此时它会读取系统变量里的JAVA_HOMECATALINA_HOME,如果在系统变量里没配,服务启动时就会报错。这也是为什么前面我强调要配到系统变量而不是用户变量。

卸载服务用:

service.bat remove Tomcat10

还有个图形化的服务配置工具tomcat10w.exe,可以调整JVM内存参数、配置日志、设置启动模式。双击运行,在“Java”选项卡里可以设置初始堆大小(Initial memory pool)和最大堆大小(Maximum memory pool),生产环境建议初始堆和最大堆设为相同值,避免JVM运行时频繁扩容。

4. Linux环境安装Tomcat10:命令行完整实操

Linux服务器上安装Tomcat10,比Windows简单,但不讲究的话也会踩坑。尤其是权限问题,这里多说一句:永远不要用root直接跑Tomcat。生产规范里这是大忌,root启动的Tomcat一旦被入侵,整个服务器都会被控制。正确做法是单独建一个系统用户运行Tomcat。

4.1 下载、解压、创建独立用户

以CentOS/RHEL系和Ubuntu/Debian系为例,通用的操作流程如下。先下载官方tar.gz包:

wget https://dlcdn.apache.org/tomcat/tomcat-10/v10.1.39/bin/apache-tomcat-10.1.39.tar.gz

如果dlcdn这个CDN在你网络环境下速度很慢,可以用清华镜像站:

wget https://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-10/v10.1.39/bin/apache-tomcat-10.1.39.tar.gz

下载后解压到指定目录。我习惯放在/opt/tomcat下,但为了方便将来升级,会先解压到/opt/tomcat-10.1.39,再把/opt/tomcat软链到它:

mkdir -p /opt tar -zxvf apache-tomcat-10.1.39.tar.gz -C /opt ln -s /opt/apache-tomcat-10.1.39 /opt/tomcat

创建独立系统用户:

useradd -r -s /sbin/nologin tomcat

-r表示创建系统账户,-s /sbin/nologin表示该账户不能登录shell,只能用于运行进程,这是安全基线要求。然后赋予Tomcat目录权限给这个用户:

chown -R tomcat:tomcat /opt/apache-tomcat-10.1.39 chmod -R 755 /opt/apache-tomcat-10.1.39

4.2 配置JAVA_HOME与环境变量

Linux下JAVA_HOME一般写在/etc/profile/etc/profile.d/tomcat.sh里。如果你用默认JDK路径,先确认一下Java安装在哪:

readlink -f $(which java)

比如输出是/usr/lib/jvm/java-17-openjdk-amd64/bin/java,那JAVA_HOME就是/usr/lib/jvm/java-17-openjdk-amd64。但Tomcat启动脚本本身不强制读系统的JAVA_HOME环境变量,它更推荐你把JAVA_HOME写到bin/setenv.sh里。如果存在bin/setenv.sh,Tomcat启动脚本会自动加载它。这样每个Tomcat实例可以独立指定JDK路径,不会影响机器上其他Java程序。

创建/opt/tomcat/bin/setenv.sh

#!/bin/bash export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64 export CATALINA_HOME=/opt/tomcat export CATALINA_BASE=/opt/tomcat

注意,写完后要给执行权限:

chmod +x /opt/tomcat/bin/setenv.sh

还有一个容易忽视的点:Tomcat默认的JVM内存参数,生产环境一定要在setenv.sh里覆盖,千万不要改catalina.sh——因为每次升级Tomcat,catalina.sh会被新版覆盖,你的自定义配置就丢了。setenv.sh不会被覆盖,它是官方预留的自定义入口。我通常会加:

export CATALINA_OPTS="-Xms1g -Xmx2g -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m"

这里的CATALINA_OPTS只影响Tomcat本身的JVM参数,不会影响部署在里面的Web应用通过JAVA_OPTS读取的内容,区分清楚。

4.3 用systemd管理Tomcat,实现开机自启

现代Linux发行版普遍使用systemd。创建/etc/systemd/system/tomcat.service

[Unit] Description=Apache Tomcat 10 Web Application Container After=network.target [Service] Type=forking User=tomcat Group=tomcat Environment=JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64 Environment=CATALINA_HOME=/opt/tomcat Environment=CATALINA_BASE=/opt/tomcat Environment=CATALINA_PID=/opt/tomcat/temp/tomcat.pid ExecStart=/opt/tomcat/bin/startup.sh ExecStop=/opt/tomcat/bin/shutdown.sh Restart=on-failure RestartSec=10 [Install] WantedBy=multi-user.target

这里Type=forking很关键,因为startup.sh启动后父进程会退出,子进程继续在后台运行,systemd必须知道这个特性才能正确管理Tomcat进程。CATALINA_PID用来记录进程ID,供shutdown时判断要结束谁。

配置好之后执行:

systemctl daemon-reload systemctl start tomcat systemctl enable tomcat

enable就是设置开机自启。查看运行状态:

systemctl status tomcat

4.4 防火墙与远程访问配置

Linux上装完Tomcat,本机能访问curl localhost:8080,但外面访问不了,九成是防火墙拦了。开放端口:

CentOS/RHEL系:

firewall-cmd --permanent --add-port=8080/tcp firewall-cmd --reload

Ubuntu/Debian系(使用ufw):

ufw allow 8080/tcp

另外还要确认你的云服务器安全组策略里,入方向放行了8080端口,这个问题在云上部署时非常容易忽略,本地防火墙开了,云平台控制台没放行,照样连不上。

5. 启动验证与首轮检查:确定Tomcat真的在干活

装好Tomcat只是起点,能启动、能访问、能部署应用才是终点。这一节讲讲启动后的验证路径和几个高频检查项。

5.1 验证Tomcat是否真正可用

启动成功后,浏览器访问http://localhost:8080,能看到Apache Tomcat默认首页。如果你在远程服务器上,把localhost换成服务器IP。默认首页上有几个链接:Server Status、Manager App、Host Manager,点击它们都会弹出一个登录框,这是Tomcat自带的Web管理界面。

先别急着登录,默认配置下你是进不去的,因为管理界面默认只允许本地访问并且没有任何可用的用户。所以,如果你只是想确认Tomcat装了没,看到首页就够了。

更彻底的验证方法是用curl走一遍HTTP请求:

curl -I http://localhost:8080

能看到类似HTTP/1.1 200的响应头,说明Tomcat的HTTP连接器正常工作。如果返回404,可能是端口配错或者应用没部署对;如果拒绝连接,说明Tomcat进程可能没起来,去查日志。

5.2 日志是最好的老师:静态看这三个文件

很多人不爱看日志,遇到问题就百度,但Tomcat的日志其实是最好懂的,路径就在logs目录下。

  • catalina.out:Tomcat启动和运行的核心日志,包含JVM、连接器、生命周期事件。启动报错基本都在这里。
  • localhost.log:每个Web应用在启动和停止时的详细日志。如果某个应用部署失败,信息会出现在这个文件里。
  • manager.log:通过管理界面部署应用相关操作的日志。

排查问题的标准流程是:先看catalina.out有没有Exception,再看localhost.log里有没有Deployment of web application ... has finished这行,如果没看到这行,说明应用启动过程中出错了。日志文件默认按天滚动,老日志会带日期后缀保留在logs目录里,别找错文件。

5.3 修改默认端口与JVM内存参数

默认8080端口在生产环境很可能要改成别的端口。改端口在conf/server.xml里,找到Connector节点:

<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />

port改成你想要的,比如80。但Linux下1024以内的端口需要root权限才能绑定,而Tomcat又不建议用root跑,所以要么把端口改成8081以上的高位端口,要么用nginx做反向代理转发到8080,后者是生产环境更常见的做法。

改完端口记得重启:

bin/shutdown.sh bin/startup.sh

JVM内存参数按4.2节说的,写在setenv.sh里。

5.4 部署第一个应用,实战一下

部署Web应用到Tomcat有三种方式:

  1. 直接把war包扔进webapps目录,Tomcat会自动解压并部署。
  2. 解压成目录,把整个目录放进webapps
  3. conf/server.xml里的Host节点添加Context标签,指定docBase指向应用目录,这种方式不推荐,因为修改server.xml需要重启Tomcat,而前两种方式可以热部署。

第一个方式最常用。把编译好的war包复制到webapps目录:

cp myapp.war /opt/tomcat/webapps/

Tomcat会在几秒内自动解压并部署。观测localhost.log,如果出现:

Deployment of web application archive [myapp.war] has finished

说明部署成功。然后访问http://server-ip:8080/myapp/就能看到应用了。注意war包的文件名就是访问路径的上下文根(Context Path),myapp.war对应的访问路径是/myapp,不是根路径。如果你想让它直接映射到根路径(http://server-ip:8080/),把war包改名为ROOT.war覆盖默认的ROOT应用即可。

6. 安装过程中最常见的坑与排查思路

最后这部分,我把这几年帮别人排查Tomcat安装问题时遇到的高频坑做一个集中梳理。每一条都是真实案例,不是空谈。

6.1 端口被占用:启动报错却不知道谁占了8080

报错信息通常长这样:

SEVERE [main] org.apache.catalina.core.StandardService.initInternal Failed to initialize connector [Connector[HTTP/1.1-8080]] java.net.BindException: Address already in use

Windows下找出占用8080的进程:

netstat -ano | findstr 8080

最后一列是PID,然后:

tasklist | findstr 1234

确认进程身份后,如果是僵尸Java进程,可以:

taskkill /F /PID 1234

Linux下用:

ss -lntp | grep 8080

或者老牌的netstat -lntp | grep 8080,会显示进程名和PID。如果是你自己之前启动的Tomcat没关干净,直接:

pkill -f 'catalina.*start'

但如果8080被一个不认识的进程占用,千万别乱kill,先确认它是什么再处理。另外还有个常见场景:Nginx或其他Web服务占用了8080。这时你不想停掉已有服务,还不如给Tomcat换个端口,见5.3节。

6.2 启动闪退但没看到任何报错信息

Windows下双击startup.bat闪退,但命令行执行却不报错,这种诡异情况我遇到过好几次。原因通常是:JAVA_HOME配置里带了多余的空格或引号。比如:

JAVA_HOME="C:\Program Files\Java\jdk-17" # 错误示范

正确写法是不带引号:

JAVA_HOME=C:\Program Files\Java\jdk-17

路径里含空格没问题,关键是环境变量值不要加引号。Tomcat的脚本会在内部自己处理带空格的路径,你加了引号反而会让它拼接出错误的路径。

另一个闪退原因是CATALINA_HOME配错了层。有人把CATALINA_HOME直接指向了bin目录,导致startup.batbin\bin里找catalina.bat,找不到就秒退。检查方式很简单,命令行输入:

echo %CATALINA_HOME% echo %JAVA_HOME%

看看分别输出什么,一眼就能发现问题。

6.3 远程访问Tomcat管理界面总是403

访问https://server:8443/manager/html时提示403 Access Denied,很多人的第一反应是没配用户。其实Tomcat默认有双重保护:一是在conf/tomcat-users.xml里必须配置manager-gui角色和用户;二是conf/Catalina/localhost/manager.xml里默认限制了访问IP,只允许127.0.0.1::1本机地址访问。

排查办法:先改tomcat-users.xml,在<tomcat-users>节点里加:

<role rolename="manager-gui"/> <user username="admin" password="your-strong-password" roles="manager-gui"/>

然后重启Tomcat。如果还是403,去看manager应用的META-INF/context.xml文件(在webapps/manager/META-INF/context.xml里),里面有类似:

<Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" />

这段配置只允许本地访问。把它注释掉或者把allow改成你办公网的IP段,比如192\.168\.1\.\d+。改完重启才能生效。

6.4 Tomcat 10应用迁移的通用报错处理

前面反复强调过javaxjakarta的差异。如果你确实需要把老项目迁到Tomcat 10,最快速不是手动改代码,而是用官方提供的迁移工具。

Apache Tomcat官方维护了一个叫tomcat-jakartaee-migration的工具,它可以自动把war包或jar包里的javax.servlet等包名批量改写为jakarta.servlet。下载地址在Apache官网的/tomcat/jakartaee-migration/页面。基本用法:

java -jar tomcat-jakartaee-migration-*.jar 旧应用.war 迁移后.war

工具会扫描class文件里的字节码引用、配置文件、JSP标签库描述符等,替换成对应的jakarta.*命名空间。它处理完的war包再丢到Tomcat 10里,基本能跑通。

但要注意,迁移工具不是万能的。如果你的应用里有自己硬编码的字符串去反射加载javax.servlet.Filter之类的类,工具改不到字符串常量,需要自己全局搜一遍。另外,第三方库(比如老的JSTL实现、老的Shiro、老版本Spring)如果没有适配Jakarta EE 9,迁移工具也无能为力,这种只能升级第三方库版本。

我的建议是,迁移前先用工具处理war包,放Tomcat 10跑起来,看localhost.logcatalina.out报错,把失败的第三方库一个个升级。实际迁移一个中等规模项目,如果第三方库版本都比较新,大半天能搞定;如果依赖了大量老库,可能得按天计。

6.5 频繁重启后端口有时钟偏差导致的启动失败

这个坑相对小众,但在云服务器上遇到过。Tomcat启动时会校验Session ID生成的随机数种子,如果服务器时钟跳变导致熵不足,SecureRandom初始化会非常慢甚至超时,启动日志里表现为卡在Creation of SecureRandom instance很久。

解决办法是在setenv.sh里加:

export CATALINA_OPTS="$CATALINA_OPTS -Djava.security.egd=file:/dev/./urandom"

在Linux上可以显著加快Tomcat启动速度。Windows下如果遇到启动奇慢,也可以加上对应的系统属性。这个参数不会影响安全性,只是换一个更高效的随机数生成源。

结语

最后说点实际的。我在部署Tomcat时的习惯是,下载完先不改任何配置,直接启动看默认首页,确认环境没问题,再去做端口修改、内存参数调整、应用部署,这样能最大程度减少“一上来就改了一堆配置,最后不知道哪步改错了”的情况。安装Tomcat本身不难,但下载前版本选错、环境变量配错、端口被占这种问题,遇到一次就得折腾半天。希望这篇教程能帮你把每一步都走得明明白白,少踩几个坑。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/9 10:08:07

AI搜索时代,官网如何成为企业真正的护城河?

做海外市场这几年&#xff0c;我最大的感受是&#xff1a;很多人对SEO的理解还停留在Google关键词排名那一套&#xff0c;张口闭口都是“把某某词做到首页”。但2024下半年到2025年&#xff0c;这个逻辑明显在失灵。AI搜索正在改写用户获取信息的路径&#xff0c;而大量出海企业…

作者头像 李华
网站建设 2026/9/9 10:07:55

ARM交叉编译实战:从x86开发机生成可运行的aarch64程序

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/9 10:06:24

15个网络抓包工具全解析:Wireshark、tcpdump到Charles选型指南

搞研发快十年&#xff0c;前前后后摸过几十个抓包工具。平时总有同事问我&#xff1a;做接口联调、APP调试、网络排障&#xff0c;到底用什么工具比较靠谱&#xff1f;这次干脆把我团队里真正用过的15个网络抓包工具整理出来&#xff0c;按照使用场景分类&#xff0c;每个都聊它…

作者头像 李华
网站建设 2026/9/9 10:06:14

PC端PDF软件横向测评:阅读、编辑、转换与批量处理全解析

前阵子帮朋友整理一整年的合同电子档&#xff0c;又遇到同事让我把几十份PDF报告批量转成Word&#xff0c;我意识到一个很现实的问题&#xff1a;PC端PDF软件这件事&#xff0c;平时不起眼&#xff0c;真到用的时候&#xff0c;选错工具能把人逼疯。市面上叫得上名字的PDF软件少…

作者头像 李华
网站建设 2026/9/9 10:06:03

MyBatisPlus分页拦截器原理与优化:从count不准到深分页避坑指南

先抛个我踩过的场景&#xff1a;项目从零搭起来&#xff0c;DAO层用的是MyBatisPlus&#xff0c;列表查询本来想省事直接 selectList 一把梭&#xff0c;结果数据量过了十万之后接口肉眼可见地变慢&#xff0c;前端表格滚动起来直接卡成PPT。后来接上了MyBatisPlus的分页插件…

作者头像 李华
网站建设 2026/9/9 10:06:00

深入拆解G1垃圾回收器:从原理到调优实践

G1垃圾回收器从JDK 7u4开始进入实验状态&#xff0c;到JDK 9正式成为默认回收器&#xff0c;再到如今几乎成为Java服务端的标配。整个过程我算是全程经历过&#xff0c;早期用户怕它不稳定&#xff0c;后来是怕它不会调&#xff0c;现在大部分人其实是既没完全搞懂它怎么工作&a…

作者头像 李华