当前位置: 代码网 > it编程>编程语言>Java > tomcat9使用指定的JDK版本完整步骤记录

tomcat9使用指定的JDK版本完整步骤记录

2026年04月20日 Java 我要评论
前言如果你想把jdk放到tomcat9的根目录(catalina_home)下,通过相对路径配置专属jdk环境(不依赖系统全局jdk,实现tomcat-jdk一体化),核心是利用tomcat官方推荐的

前言

如果你想把jdk放到tomcat9的根目录(catalina_home)下,通过相对路径配置专属jdk环境(不依赖系统全局jdk,实现tomcat-jdk一体化),核心是利用tomcat官方推荐的setenv(setclasspath)脚本配置java_home(基于catalina_home的相对路径,避免修改原生启动脚本)。

第一步:标准化目录结构(关键)

先整理tomcat9的目录,将解压版jdk(绿色版,非安装版)放到tomcat根目录下的jdk子文件夹,结构如下(示例jdk8,tomcat9推荐jdk8/jdk11,兼容最佳):

apache-tomcat-9.0.xx/  # tomcat9根目录(即catalina_home)
├─ bin/                # tomcat启动/停止脚本目录
├─ conf/               # 配置文件
├─ webapps/            # 项目部署目录
├─ jdk/                # 新建的jdk存放目录
│  └─ jdk1.8.0_391/    # 解压后的jdk完整目录(含bin、jre、lib等子文件夹)
├─ logs/               # 日志
└─ temp/               # 临时文件

注意:jdk目录名可自定义(如jdk11),但后续配置要对应,禁止有中文/空格/特殊字符

第二步:核心配置(分windows/linux/mac,二选一)

tomcat启动时会自动加载bin目录下的setenv.bat(windows)/setenv.sh(linux/mac),这是官方推荐的自定义环境变量的专属文件(不会在tomcat升级时被覆盖,比直接改catalina.bat/sh更安全),该文件默认不存在,需要手动新建

配置的核心:基于tomcat内置的catalina_home(已自动指向tomcat根目录)写相对路径,而非./../(避免启动目录不同导致路径失效)。

场景1:windows系统(.bat脚本)

  1. 在tomcat的bin目录下,新建文本文件,重命名为setenv.bat后缀必须是.bat,无txt后缀);
  2. 编辑setenv.bat,写入以下内容(仅配置java_home即可,tomcat会自动识别jdk内的jre):
@echo off
:: 基于catalina_home(tomcat根目录)配置相对路径的java_home,指向jdk子目录下的jdk解压包
set "java_home=%catalina_home%\jdk\jdk1.8.0_391"
:: 可选:设置jvm运行参数(如堆内存),按需添加
set "java_opts=-xms512m -xmx1024m -xx:metaspacesize=128m -xx:maxmetaspacesize=256m"

替换jdk1.8.0_391为你实际的jdk目录名,%catalina_home%是tomcat内置变量,无需手动定义。

场景2:linux/mac系统(.sh脚本)

  1. 在tomcat的bin目录下,新建setenv.sh文件:
touch tomcat_home/bin/setenv.sh
  1. 编辑setenv.sh,写入以下内容(语法与windows不同,注意空格和引号):
#!/bin/sh
# 基于catalina_home配置相对路径的java_home
export java_home=$catalina_home/jdk/jdk1.8.0_391
# 可选:jvm运行参数
export java_opts="-xms512m -xmx1024m -xx:metaspacesize=128m -xx:maxmetaspacesize=256m"
  1. setenv.sh添加执行权限(linux/mac必须,否则tomcat无法加载):
chmod +x tomcat_home/bin/setenv.sh

第三步:测试启动,验证jdk配置

无需配置系统全局的java_home/jre_home,直接用tomcat原生启动脚本启动,会自动加载setenv中的专属jdk:

windows

双击tomcatbin目录下的startup.bat,或在cmd中执行:

cd tomcat_home/bin
startup.bat

启动窗口会显示jvm版本,且日志中会标注使用的jdk路径为tomcat下的专属jdk。

linux/mac

在终端执行启动脚本:

cd tomcat_home/bin
./startup.sh

通过tomcat日志验证jdk是否生效(核心看java home路径):

# 查看启动日志,搜索java home
grep "java home" tomcat_home/logs/catalina.out

正确输出示例(路径指向tomcat下的jdk):

java home:         /opt/apache-tomcat-9.0.90/jdk/jdk1.8.0_391/jre

关键避坑点

  1. jdk必须是解压版:不能用安装版jdk(安装版会写入系统注册表,无法通过相对路径独立使用),直接从oracle/openjdk官网下载解压版jdk即可;
  2. 禁止修改原生脚本:不要直接改catalina.bat/sh/startup.bat/sh,这些是tomcat原生文件,升级时会被覆盖,setenv是官方预留的自定义入口;
  3. 无中文/空格路径:tomcat根目录、jdk目录全程禁止中文、空格、特殊字符(如*#),否则会报“路径找不到”错误;
  4. 相对路径基于catalina_home:不要用./jdk/xxx../jdk/xxx,因为如果在非tomcat目录启动脚本,这类相对路径会失效,而%catalina_home%/$catalina_home是tomcat内置的绝对路径变量,永远指向根目录;
  5. tomcat9的jdk兼容:最低支持jdk8,推荐jdk8/jdk11,不建议用jdk17+(部分特性兼容不佳)。

第四步:停止tomcat(原生脚本即可)

无需额外配置,直接用tomcatbin目录下的停止脚本,会自动使用同一jdk环境:

  • windows:shutdown.bat
  • linux/mac:./shutdown.sh

总结

  1. 核心目录结构:tomcat根目录下新建jdk文件夹,放入解压版jdk,实现一体化;
  2. 专属配置文件:在bin目录新建setenv.bat/sh,利用tomcat内置的catalina_home配置相对路径的java_home,无需系统全局jdk;
  3. 跨目录启动无忧:基于catalina_home的相对路径,无论在哪个目录执行tomcat启动脚本,jdk路径都不会失效;
  4. 升级友好:setenv文件不会被tomcat升级覆盖,后续换jdk只需修改该文件的jdk目录名即可。

这种配置方式的优势是tomcat-jdk一体化,可直接拷贝整个tomcat目录到其他同系统服务器,无需重新配置jdk环境,直接启动即可使用。

另外如果你发现tomcat9的bin目录里有setclasspath.sh(linux/mac)/setclasspath.bat(windows),这个文件是tomcat原生的核心脚本,启动时会被catalina.sh/bat自动加载,作用是检测并设置jdk/jre的类路径、验证java_home/jre_home的有效性——这和我们之前配置setenv.sh的方案完全兼容,甚至可以说setclasspath.sh正是我们用setenv.sh配置相对路径jdk的“底层支撑”,不用修改这个原生文件,继续按之前的方法配置即可。

下面给你讲清楚这个文件的核心逻辑、和setenv.sh的加载顺序,以及为什么绝对不要修改它,同时补充验证细节,让你彻底放心配置。

一、setclasspath.sh 核心作用(tomcat原生,无需改动)

这个文件是tomcat官方写的jdk路径检测脚本,核心逻辑只有2点:

  1. 优先读取已设置的java_home/jre_home:如果我们在setenv.sh里提前设置了java_home(tomcat下的专属jdk),setclasspath.sh会直接复用这个变量,不会再去检测系统全局的jdk;
  2. 若未设置,则自动查找系统jdk:如果没配java_home,它会遍历系统路径找jdk/jre,找不到就直接报错启动失败(这也是tomcat默认需要系统全局jdk的原因)。

简单说:setclasspath.sh是“jdk路径检测器”,而setenv.sh是“jdk路径配置器”,我们的配置会被检测器优先读取,完美契合tomcat的原生启动逻辑。

二、tomcat启动脚本的加载顺序(关键,解释为什么setenv.sh生效)

tomcat9的启动脚本执行流程是层层加载的,setenv.sh的配置会提前于setclasspath.sh生效,确保jdk路径被优先设置,顺序如下(linux/mac为例,windows逻辑完全一致):

startup.sh → catalina.sh → setenv.sh(自定义,优先加载)→ setclasspath.sh(原生,检测jdk)→ 启动tomcat

✅ 结论:你之前按我给的方法新建setenv.sh配置相对路径java_home,完全不会和setclasspath.sh冲突,反而会被它优先使用,无需对这个原生文件做任何修改(改了会被tomcat升级覆盖,还可能导致启动逻辑出错)。

三、补充:利用setclasspath.sh验证jdk配置(可选)

如果想快速验证setenv.sh里的java_home是否被正确读取,可以直接执行setclasspath.sh,它会输出jdk检测结果:

linux/mac执行命令

# 进入tomcat的bin目录
cd catalina_home/bin
# 执行setclasspath.sh(会输出jdk检测日志,无报错即配置成功)
./setclasspath.sh
  • 配置成功:无任何报错,直接返回命令行;
  • 配置失败(如jdk目录写错):会明确报错java_home is not defined correctly,提示找不到jdk,此时检查setenv.sh里的jdk相对路径即可。

windows(对应setclasspath.bat)

cd catalina_home\bin
setclasspath.bat

同理,无报错即成功,报错则检查setenv.bat的路径。

四、再次强调:绝对不要修改setclasspath.sh/bat的3个原因

  1. 原生文件,升级会覆盖:tomcat升级时,bin目录下的原生脚本(包括setclasspath.sh)会被新版本替换,你的修改会全部丢失;
  2. 逻辑复杂,易改崩:这个文件包含跨平台的jdk检测逻辑(兼容不同jdk版本、不同系统),新手修改容易破坏原有逻辑,导致tomcat无法启动;
  3. 官方有预留入口:tomcat官方明确推荐用setenv.sh/bat做自定义环境配置,这是专门为用户预留的“安全入口”,完全能满足jdk、jvm参数的配置需求。

总结

  1. bin目录下的setclasspath.sh是tomcat原生的jdk路径检测脚本,无需修改、无需删除,我们的配置会被它优先读取;
  2. 继续按之前的方法在bin目录新建setenv.sh(linux/mac),用$catalina_home/jdk/你的jdk目录配置相对路径java_home即可,完全兼容;
  3. tomcat启动脚本的加载顺序是setenv.sh → setclasspath.sh,确保自定义jdk路径优先生效,实现tomcat-jdk一体化(无需系统全局jdk);
  4. 可直接执行setclasspath.sh快速验证jdk配置是否正确,无报错即代表路径有效。

你现在直接按之前的步骤配置setenv.sh就行,这个原生的setclasspath.sh只会帮你“验证并使用”配置的jdk,不会有任何冲突~

到此这篇关于tomcat9使用指定的jdk版本的文章就介绍到这了,更多相关tomcat9使用指定jdk版本内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com