我要提问
ARTICLE DETAIL

资讯详情

前沿编程新知与开发实战干货的深度解读。

Tomcat下载安装配置指南:JDK版本搭配与常见问题排查

Tomcat下载安装配置指南:JDK版本搭配与常见问题排查 如果你正在搜tomcat下载安装及配置教程多半是第一次接触 Java Web 开发要么是作业要用要么是公司要让一个老项目重新跑起来。这个任务本身不复杂但很多人在第一步就卡住不是下载错了版本就是环境变量没配明白再要么是双击启动一闪而过最后只能在评论区到处翻答案。我这些年折腾 Tomcat 帮别人排了不少错把下载、安装、配置这条线完整理一遍顺带把启动闪退、端口占用、乱码、404 这些高频问题也一起讲掉省得你走了弯路再回来翻。1. 安装前先把版本账算清楚JDK 和 Tomcat 怎么搭配1.1 检查本机有没有 JDK先别急着下载 Tomcat。Tomcat 本身是一个 Java 程序它启动时必须依赖 JDK 提供的 JVM所以机器的 Java 环境决定了后面的一切。打开命令行Windows 在开始菜单输入 cmd 回车macOS/Linux 打开终端先执行三条命令java -version javac -version echo $JAVA_HOME如果java -version能打印出版本号比如java version 1.8.0_361说明 JDK 基本可用。如果echo $JAVA_HOME打出来是空内容或者提示“不是内部或外部命令”说明JAVA_HOME环境变量没配置。Tomcat 的启动脚本就靠JAVA_HOME去找 JVM这一步缺失是后面“闪退”的头号原因。没有 JDK 的话先去装一个。Oracle JDK 和 OpenJDK 都可以本地学习优先选 OpenJDK 或者拿到什么顺手的版本就用什么。安装时注意路径别带中文装完在系统环境变量里新建JAVA_HOME指向 JDK 安装根目录再往Path里加%JAVA_HOME%\bin然后重开命令行验证。1.2 Tomcat 版本和 JDK 的对应关系很多教程上来就让你下载最新的 Tomcat这其实有个隐患。Tomcat 版本不是越新越好新版对应的 Servlet/JSP 规范、包名都变了老项目直接扔进去会一连串报错。下面这张表是我在实际项目里验证过的对应关系可以直接对照着选Tomcat 版本对应 Servlet 规范最低 JDK 要求适合场景7.0.xServlet 3.0JDK 6很老的项目8.5.xServlet 3.1JDK 7兼容老项目9.0.xServlet 4.0JDK 8Java 8 时代最常见的生产版本10.0.xServlet 5.0JDK 8过渡版本已停止维护10.1.xServlet 6.0JDK 11主流新项目推荐 JDK 1711.0.xServlet 6.1JDK 17最新版本适合新项目尝鲜还有一个非常关键的变化Tomcat 10 开始Java 的包名从javax.servlet换成了jakarta.servlet。这意味着很多基于 Tomcat 9 甚至更早版本写的老项目直接放到 Tomcat 10 上会报ClassNotFoundException或者NoClassDefFoundError不是代码写错了是包名迁移导致的。所以我的建议很简单如果教材、视频课用的是老技术栈选 Tomcat 9 JDK 8如果自己写新项目选 Tomcat 10.1 JDK 17。别看到官网首页推荐 11 就直接下载版本不匹配的问题比安装本身更难搞。2. 官网下载这一步别选错zip、tar.gz 和 Windows Installer 的区别2.1 下载路径和文件选择下载 Tomcat 尽量去官网搜“Tomcat download”然后认准tomcat.apache.org。进到下载页后根据你选的版本进入对应的 download-9、download-10 或 download-11 页面找到Core这一栏。Core 下面放的是核心二进制发行版一般学习、开发、生产部署都够用了。Windows 用户直接下载64-bit Windows zip。注意别手滑点到Full distribution那是带完整源码的包新手用不上解压后体积大不说还要自己编译。还有一个Windows Service Installer它会把 Tomcat 装成 Windows 系统服务本地学习没必要装成服务之后开机自启、端口占用都是麻烦事我更建议下载 zip 免安装版。Linux 和 macOS 用户下载tar.gz即可。下载完成后看下文件大小是否和官网展示的差不多通常几十 MB 内浮动如果差太多就要怀疑下载是否完整。公司内网有安全规范的话再做一下 SHA512 校验Windows 下用certutil -hashfile 文件名 SHA512Linux 下用sha512sum 文件名。本地个人学习的话直接从官网下载一般不会出问题这一步可以跳过。2.2 拿到压缩包后的检查和目录说明解压时建议放到D:\dev\apache-tomcat-9.0.98这种简洁、无空格、无中文的路径不要放C:\Program Files也不要放D:\软件下载\Tomcat终版v2这种目录。虽然新版 Tomcat 对空格路径的容忍度已经好很多但脚本和 IDE 一旦碰到带空格的路径花半小时排查是常事。解压后你会看到几个核心目录我整理了一个表格目录作用bin启动、关闭脚本startup.sh/startup.bat 等conf核心配置文件server.xml、web.xml、tomcat-users.xml 都在这里libTomcat 运行依赖的 jar 包logs运行日志按天生成 catalina.yyyy-MM-dd.logtemp临时文件目录webapps放 Web 应用的地方ROOT 目录是默认首页workJSP 编译后的 class 文件目录顺便说一下work 目录里如果出现一堆编译产物别慌那是 JSP 第一次被访问时自动生成的。你把它删掉下次请求时 Tomcat 会重新编译属于正常现象。很多人第一次看到 work 目录一堆文件以为中毒了其实不是。3. 解压安装与环境变量让 Tomcat 在命令行里被找到3.1 环境变量到底要配哪几个虽然直接双击bin/startup.bat也能启动但配置环境变量的意义在于Tomcat 脚本能稳定找到JAVA_HOMEIDE 集成时能识别CATALINA_HOME命令行里能全局执行catalina、shutdown这些命令。很多教程只让你配CATALINA_HOME但往往隐藏了一个前提JAVA_HOME也得先配好。Windows 上的配置流程是右键“此电脑” → 属性 → 高级系统设置 → 环境变量然后执行这几步在系统变量里新建CATALINA_HOME值填 Tomcat 解压目录比如D:\dev\apache-tomcat-9.0.98。如果还没有JAVA_HOME新建一个值填 JDK 安装根目录比如C:\Program Files\Java\jdk-17.0.11。注意不要精确到 bin 子目录。在Path变量末尾追加一行%CATALINA_HOME%\bin。点击确定保存然后重新打开一个命令行窗口。我见过很多教程写TOMCAT_HOME但 Tomcat 官方脚本在判断目录时用的是CATALINA_HOMETOMCAT_HOME不是所有版本都认。为了稳统一用CATALINA_HOME别给自己埋坑。为什么非要重开命令行因为 cmd 只会读取启动时的环境变量快照。你配完变量不重开窗口直接敲echo %CATALINA_HOME%结果还是空这个细节坑过不少初学者。重开后先执行echo %CATALINA_HOME%确认路径再执行catalina version能看到 Tomcat 版本信息就说明环境变量全部生效了。3.2 启动验证与管理员账号配置环境变量配好后在命令行切到 Tomcat 的 bin 目录执行startup.batWindows或./startup.shLinux/macOS。看到类似Tomcat started的输出后打开浏览器访问http://localhost:8080能看到默认的 Apache Tomcat 欢迎页说明安装成功。如果双击startup.bat窗口一闪而过别急着百度先在命令行里执行catalina.bat run让 Tomcat 前台运行。这样所有错误日志会直接打在屏幕上比黑窗口闪退的信息好找得多。这个问题后面专门讲。想用 Tomcat 的管理界面管理应用可以顺手在conf/tomcat-users.xml里加一个管理员账号。在tomcat-users标签内加入role rolenamemanager-gui/ role rolenameadmin-gui/ user usernameadmin passwordadmin123 rolesmanager-gui,admin-gui/保存后重启 Tomcat访问http://localhost:8080/manager/html输入账号密码就能进入可视化部署页面。manager-gui是管理应用界面的角色admin-gui是管理 host 界面的角色。生产环境千万别用这种弱密码更不要把带密码的 tomcat-users.xml 提交到 Git 仓库。4. 第一次启动最容易摔跤的地方闪退、端口占用、乱码、4044.1 启动闪退用前台模式找真正的错误闪退在 Tomcat 新手这里出现频率极高但根因就那么几个按顺序排查就好。第一步确认JAVA_HOME。在命令行执行echo %JAVA_HOME%如果路径为空或者指向的是 JRE 目录Tomcat 就找不到完整的 JDK脚本会直接退出。注意JAVA_HOME要指向 JDK 根目录不是 JDK 里的bin也不是什么jre目录。第二步用catalina.bat run在前台跑一遍。如果报Unsupported major.minor version说明 JDK 版本和 Tomcat 不兼容。比如用 Java 21 跑 Tomcat 7字节码版本对不上用 Java 8 跑 Tomcat 11则直接启动失败。解决方案就是回到第 1 节的版本对照表换一个匹配的组合。第三步看日志。即使run模式信息不够logs/catalina.日期.log也会把标准错误输出记录下来。日志里搜SEVERE或者Caused by大概率能定位到真正原因。另外还要考虑一种情况某些安全软件会把 Tomcat 的部分文件隔离或拦截。表现是双击没反应、启动到一半消失遇到时把 Tomcat 目录加入信任区再试。4.2 端口被占用netstat 定位与改端口Tomcat 默认监听 8080 端口。如果端口被别的程序占用控制台或日志里会出现java.net.BindException: Address already in use: JVM_Bind。Windows 下定位占用进程的命令netstat -ano | findstr :8080输出结果最后一列是 PID也就是进程编号。打开任务管理器切到“详细信息”标签页找到这个 PID先看清进程名再决定是否结束。不要看到 PID 就直接杀万一那个进程是数据库或者其他 HTTP 服务误杀会影响业务。如果不想杀进程也可以直接改 Tomcat 端口。打开conf/server.xml找到这一段Connector port8080 protocolHTTP/1.1 connectionTimeout20000 redirectPort8443 /把port改成 8081 或者其他没被占用的端口重启 Tomcat之后访问http://localhost:8081。这里要注意redirectPort是 HTTPS 重定向端口不需要动它。还有一个容易被忽略的细节conf/server.xml里还有一个Server port8005 shutdownSHUTDOWN以及默认注释的 AJP 1.3 连接器端口 8009。新手改端口经常只改 8080结果 8005 或 8009 被占用时照样启动失败。如果不需要和 Apache HTTP Server 整合直接把 AJP 的Connector注释掉最省心。4.3 控制台中文乱码编码问题的根源和处理Windows 下运行startup.bat日志里的中文变成乱码大概率是编码不一致。Tomcat 8.5 之后日志输出默认使用 UTF-8而 Windows 的命令行窗口默认使用 GBK代码页 936。Tomcat 往控制台写入 UTF-8 字节流控制台按 GBK 去解码中文自然就乱了。处理方法取决于你用什么工具看日志直接用 cmd 窗口看 Tomcat 日志就编辑conf/logging.properties把java.util.logging.ConsoleHandler.encoding UTF-8改成GBK保存后重启。用 IDEA 控制台看日志IDEA 默认按 UTF-8 处理那就保持UTF-8不动并在 IDEA 的 File Encoding 设置为 UTF-8。远程连接 Linux 服务器看日志保持 UTF-8 就好别改 GBK否则 Linux 侧的中文反而会乱。这里要区分两个概念一个是日志输出乱码也就是上面说的控制台乱码另一个是页面请求参数乱码。页面乱码通常要去检查页面本身的Content-Type、过滤器里的编码设置以及 server.xml 的 Connector 上有没有加URIEncodingUTF-8不是改logging.properties能解决的。新手容易把这两种乱码混为一谈排查方向错了半天找不出原因。4.4 启动成功但访问 404从默认首页和项目路径查起Tomcat 启动成功后浏览器访问http://localhost:8080出现 404先分清情况再动手。如果访问的是默认首页但webapps/ROOT目录被删过那必定 404。最简单的办法是重新解压一份 Tomcat把原来的conf和webapps备份好再换过去。如果访问的是http://localhost:8080/myapp返回 404说明应用要么没部署成功要么 URL 写错了。打开webapps目录看看是myapp.war还是myapp文件夹。war 包部署后 Tomcat 会自动解压成同名目录如果只有 war 没有目录可能是自动部署没触发或者解压失败去logs里看异常。还要注意一个容易忽略的点Linux 服务器对路径大小写敏感。项目在 Windows 下开发时URL 里的/User和/user都能访问部署到 Linux 后一个正常、一个 404遇到这类问题先检查大小写再怀疑其他。另外点击 Tomcat 首页的Manager App出现 403 Access Denied不是 404但也非常常见。原因大多是tomcat-users.xml里没有配置manager-gui角色或者账号密码不对。回到第 3.2 节补上角色并重启即可。5. 把项目塞进 Tomcatwar 包部署与 IDEA/Eclipse 配置5.1 war 包部署和自动解压机制拿到一个 Web 项目的 war 包最直接的部署方式就是把它复制到webapps目录。Tomcat 默认会定期扫描webapps发现新的 war 包后自动解压并部署。默认情况下应用访问路径等于 war 包文件名。比如你放的是myblog.war访问地址就是http://localhost:8080/myblog/。更新版本时建议按这个顺序操作先把旧的应用目录和旧 war 包删掉再放新的 war 包。如果直接把同名 war 覆盖进去自动部署逻辑有时候会保留旧目录里的资源或者因为文件被占用导致解压失败最后出现一些莫名其妙的缓存问题。干净目录比什么花活都稳。如果想让应用通过根路径直接访问不想带项目名做法有两种把应用命名为ROOT.war放到webapps或者在 Host 里配置 context。新手用第一种最省事。不过如果你已经有一个默认的 ROOT 目录先备份或删掉再放 ROOT.war否则默认首页会覆盖你的应用入口。5.2 IDEA 里配置 Tomcat ServerIDEA 配置 Tomcat 有个前提社区版Community不带 Java EE 应用服务器集成功能必须用旗舰版Ultimate才能直接在 Run 配置里加 Tomcat。如果只有社区版暂时用不了这个功能可以选择 Maven 插件来跑 Web 项目比如tomcat7-maven-plugin但那是另一个话题了。旗舰版的具体步骤比较简单打开Settings/Preferences→Build, Execution, Deployment→Application Servers点加号选Tomcat Server在弹出框里填 Tomcat 安装目录也就是包含conf、bin的那一层目录IDEA 会自动识别版本。打开Run→Edit Configurations点左上角加号找到Tomcat Server→Local。在 Server 选项卡里把Application server选成刚添加的 Tomcat。切到Deployment选项卡点加号选Artifact选择项目的war exploded。开发时推荐选 exploded 版本因为它是解压后的目录结构IDEA 可以直接把改过的 class、jsp 推送到部署目录不用每次重新打 war 包。在Application context里设置访问路径比如/myblog或者设成/用根路径访问。保存后点绿色运行按钮IDEA 会启动 Tomcat 并打开浏览器。开发中遇到改 JSP 不生效的情况别急着骂 Tomcat。先看 IDEA 底部有没有Update按钮如果配置了On frame deactivation为Update resources切出 IDEA 窗口时资源会自动更新否则就手动点 Update或者点 Redeploy 重启上下文。这个习惯能省掉很多不必要的重启时间。5.3 Eclipse 里配置 Tomcat 和常见坑Eclipse 的配置路径和 IDEA 不一样但逻辑更接近传统方式打开Window→Preferences→Server→Runtime Environments→Add选择你的 Tomcat 版本比如 Apache Tomcat v9.0指定 Tomcat 安装目录和 JDK 版本。打开Servers视图右键New→Server选择刚才配置的 Runtime把项目 Add 到右侧配置里。启动 Server 后Eclipse 会把项目发布到它自己的工作目录而不是 Tomcat 安装目录下的webapps。很多新手在这步就懵了明明 Tomcat 目录里什么都没有项目却能访问这就是原因。如果你希望 Eclipse 直接使用 Tomcat 安装目录下的配置有一个配置项要改在 Servers 视图中双击 Server打开后找Server Path和Deploy Path默认是Use workspace metadata改成Use Tomcat installationDeploy Path填webapps。这样 Eclipse 会把项目发布到真正的webapps目录conf/server.xml的端口修改也会直接生效。改完记得重启 Eclipse Server别只重启 Tomcat 进程。还有一个常见坑Eclipse 工作空间里那个Servers项目会生成一份server.xml副本Eclipse 启动时用的其实是这份副本不是 Tomcat 安装目录下的conf/server.xml。所以你改了安装目录里的端口却发现没变化基本就是这个原因。6. 配置完之后还能优化的几个点内存参数、端口调整和日志6.1 用 setenv 脚本设置内存参数Tomcat 默认的 JVM 内存参数对开发够用对生产环境往往偏小。网上很多教程让你去改catalina.bat或catalina.sh我更建议在 bin 目录下新建setenv.bat或setenv.sh。Tomcat 的启动脚本会自动加载 setenv 文件而且它不属于 Tomcat 原版文件之后升级 Tomcat 时不容易被覆盖这个习惯在出过几次升级事故后你会深有体会。Windows 下的setenv.bat内容set CATALINA_OPTS-Xms512m -Xmx1024m -XX:MetaspaceSize128m -XX:MaxMetaspaceSize256mLinux/macOS 下的setenv.sh内容export CATALINA_OPTS-Xms512m -Xmx1024m -XX:MetaspaceSize128m -XX:MaxMetaspaceSize256m参数含义解释一下-Xms是堆内存初始值-Xmx是堆内存最大值后面两个是 JDK 8 以后的元空间参数。老教程里的PermSize在 JDK 8 中已经改名成 Metaspace照抄老参数会报错。数值要结合机器内存和应用规模来定不是越大越好。堆设太大会导致 GC 停顿一般给实例分配机器内存的四分之一到二分之一比较常见。顺便说一下CATALINA_OPTS和JAVA_OPTS的区别CATALINA_OPTS只在启动 Tomcat 时作为 JVM 参数传入JAVA_OPTS则会被启动、关闭等脚本共用。JVM 内存这类参数放CATALINA_OPTS更精确避免关闭脚本也加载一套不必要的参数。6.2 修改端口和 context 路径第 4.2 节讲了 HTTP 端口怎么改这里补充两个新手不太能注意到的端口Server port8005 shutdownSHUTDOWN是 Tomcat 管理端口负责接收关闭命令8009是 AJP 端口早期用于和 Apache HTTP Server 整合现在用得越来越少。你只改 8080但 8005 或 8009 被别的服务占用启动照样失败。不需要 AJP 时直接注释掉 8009 的 Connector。关于 context path我个人建议是不要为了去项目名就在server.xml里硬写一堆Context标签。Tomcat 9 之后官方更推荐把 context 配置写在应用的META-INF/context.xml里或者直接把 war 包命名为 ROOT.war 来达到根路径访问的效果。在 server.xml 里写死的 context 在部署多实例和升级时非常容易留坑。6.3 日志与日常维护经验日志是排错的第一信源。Tomcat 的主要日志在logs目录默认按天生成。catalina.日期.log记录 Tomcat 自身启动信息和应用的System.out输出localhost.日期.log记录 Web 应用启动时的细节。启动失败时先翻localhost.日期.log里面的异常栈通常比 catalina 日志更直接。Linux 上我习惯用catalina.sh run前台启动来调试确认没问题再catalina.sh start放到后台。如果想让 Tomcat 开机自启可以写 systemd service或者用启动脚本配合 rc.local这些属于运维范畴本地开发不用强行上。还有一个被反复使用的命令catalina configtestWindows 下是catalina.bat configtestLinux 下是catalina.sh configtest。它可以校验配置文件里有没有 XML 语法错误、端口引用问题在重启前跑一遍能省掉不少“改完配置起不来”的尴尬。最后说一个我自己养成的习惯拿到新版本 Tomcat我从不直接覆盖旧目录。我会把旧实例整体复制一份到新目录保留原来的conf和webapps改个端口启动确认没问题后再处理切换。这么做看起来多花几分钟但生产换版本时能少踩很多坑。Tomcat 的安装配置本身不难难的是出了问题你能一眼看出是版本、端口、编码还是路径的问题。希望这篇把这条线串清楚的教程能让你在下一次部署时少走弯路。
返回列表