tomcat9使用指定的JDK版本完整步驟記錄
前言
如果你想把JDK放到Tomcat9的根目錄(CATALINA_HOME)下,通過(guò)相對(duì)路徑配置專(zhuān)屬JDK環(huán)境(不依賴(lài)系統(tǒng)全局JDK,實(shí)現(xiàn)Tomcat-JDK一體化),核心是利用Tomcat官方推薦的setenv(setclasspath)腳本配置JAVA_HOME(基于CATALINA_HOME的相對(duì)路徑,避免修改原生啟動(dòng)腳本)。
第一步:標(biāo)準(zhǔn)化目錄結(jié)構(gòu)(關(guān)鍵)
先整理Tomcat9的目錄,將解壓版JDK(綠色版,非安裝版)放到Tomcat根目錄下的jdk子文件夾,結(jié)構(gòu)如下(示例JDK8,Tomcat9推薦JDK8/JDK11,兼容最佳):
apache-tomcat-9.0.XX/ # Tomcat9根目錄(即CATALINA_HOME) ├─ bin/ # Tomcat啟動(dòng)/停止腳本目錄 ├─ conf/ # 配置文件 ├─ webapps/ # 項(xiàng)目部署目錄 ├─ jdk/ # 新建的JDK存放目錄 │ └─ jdk1.8.0_391/ # 解壓后的JDK完整目錄(含bin、jre、lib等子文件夾) ├─ logs/ # 日志 └─ temp/ # 臨時(shí)文件
注意:JDK目錄名可自定義(如
jdk11),但后續(xù)配置要對(duì)應(yīng),禁止有中文/空格/特殊字符。
第二步:核心配置(分Windows/Linux/Mac,二選一)
Tomcat啟動(dòng)時(shí)會(huì)自動(dòng)加載bin目錄下的setenv.bat(Windows)/setenv.sh(Linux/Mac),這是官方推薦的自定義環(huán)境變量的專(zhuān)屬文件(不會(huì)在Tomcat升級(jí)時(shí)被覆蓋,比直接改catalina.bat/sh更安全),該文件默認(rèn)不存在,需要手動(dòng)新建。
配置的核心:基于Tomcat內(nèi)置的CATALINA_HOME(已自動(dòng)指向Tomcat根目錄)寫(xiě)相對(duì)路徑,而非./或../(避免啟動(dòng)目錄不同導(dǎo)致路徑失效)。
場(chǎng)景1:Windows系統(tǒng)(.bat腳本)
- 在Tomcat的
bin目錄下,新建文本文件,重命名為setenv.bat(后綴必須是.bat,無(wú)txt后綴); - 編輯
setenv.bat,寫(xiě)入以下內(nèi)容(僅配置JAVA_HOME即可,Tomcat會(huì)自動(dòng)識(shí)別JDK內(nèi)的JRE):
@echo off :: 基于CATALINA_HOME(Tomcat根目錄)配置相對(duì)路徑的JAVA_HOME,指向jdk子目錄下的JDK解壓包 set "JAVA_HOME=%CATALINA_HOME%\jdk\jdk1.8.0_391" :: 可選:設(shè)置JVM運(yùn)行參數(shù)(如堆內(nèi)存),按需添加 set "JAVA_OPTS=-Xms512m -Xmx1024m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=256m"
替換
jdk1.8.0_391為你實(shí)際的JDK目錄名,%CATALINA_HOME%是Tomcat內(nèi)置變量,無(wú)需手動(dòng)定義。
場(chǎng)景2:Linux/Mac系統(tǒng)(.sh腳本)
- 在Tomcat的
bin目錄下,新建setenv.sh文件:
touch TOMCAT_HOME/bin/setenv.sh
- 編輯
setenv.sh,寫(xiě)入以下內(nèi)容(語(yǔ)法與Windows不同,注意空格和引號(hào)):
#!/bin/sh # 基于CATALINA_HOME配置相對(duì)路徑的JAVA_HOME export JAVA_HOME=$CATALINA_HOME/jdk/jdk1.8.0_391 # 可選:JVM運(yùn)行參數(shù) export JAVA_OPTS="-Xms512m -Xmx1024m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=256m"
- 給
setenv.sh添加執(zhí)行權(quán)限(Linux/Mac必須,否則Tomcat無(wú)法加載):
chmod +x TOMCAT_HOME/bin/setenv.sh
第三步:測(cè)試啟動(dòng),驗(yàn)證JDK配置
無(wú)需配置系統(tǒng)全局的JAVA_HOME/JRE_HOME,直接用Tomcat原生啟動(dòng)腳本啟動(dòng),會(huì)自動(dòng)加載setenv中的專(zhuān)屬JDK:
Windows
雙擊Tomcatbin目錄下的startup.bat,或在CMD中執(zhí)行:
cd TOMCAT_HOME/bin startup.bat
啟動(dòng)窗口會(huì)顯示JVM版本,且日志中會(huì)標(biāo)注使用的JDK路徑為T(mén)omcat下的專(zhuān)屬JDK。
Linux/Mac
在終端執(zhí)行啟動(dòng)腳本:
cd TOMCAT_HOME/bin ./startup.sh
通過(guò)Tomcat日志驗(yàn)證JDK是否生效(核心看Java Home路徑):
# 查看啟動(dòng)日志,搜索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
關(guān)鍵避坑點(diǎn)
- JDK必須是解壓版:不能用安裝版JDK(安裝版會(huì)寫(xiě)入系統(tǒng)注冊(cè)表,無(wú)法通過(guò)相對(duì)路徑獨(dú)立使用),直接從Oracle/OpenJDK官網(wǎng)下載解壓版JDK即可;
- 禁止修改原生腳本:不要直接改
catalina.bat/sh/startup.bat/sh,這些是Tomcat原生文件,升級(jí)時(shí)會(huì)被覆蓋,setenv是官方預(yù)留的自定義入口; - 無(wú)中文/空格路徑:Tomcat根目錄、JDK目錄全程禁止中文、空格、特殊字符(如
*、#),否則會(huì)報(bào)“路徑找不到”錯(cuò)誤; - 相對(duì)路徑基于CATALINA_HOME:不要用
./jdk/xxx或../jdk/xxx,因?yàn)槿绻诜荰omcat目錄啟動(dòng)腳本,這類(lèi)相對(duì)路徑會(huì)失效,而%CATALINA_HOME%/$CATALINA_HOME是Tomcat內(nèi)置的絕對(duì)路徑變量,永遠(yuǎn)指向根目錄; - Tomcat9的JDK兼容:最低支持JDK8,推薦JDK8/JDK11,不建議用JDK17+(部分特性兼容不佳)。
第四步:停止Tomcat(原生腳本即可)
無(wú)需額外配置,直接用Tomcatbin目錄下的停止腳本,會(huì)自動(dòng)使用同一JDK環(huán)境:
- Windows:
shutdown.bat - Linux/Mac:
./shutdown.sh
總結(jié)
- 核心目錄結(jié)構(gòu):Tomcat根目錄下新建
jdk文件夾,放入解壓版JDK,實(shí)現(xiàn)一體化; - 專(zhuān)屬配置文件:在
bin目錄新建setenv.bat/sh,利用Tomcat內(nèi)置的CATALINA_HOME配置相對(duì)路徑的JAVA_HOME,無(wú)需系統(tǒng)全局JDK; - 跨目錄啟動(dòng)無(wú)憂(yōu):基于
CATALINA_HOME的相對(duì)路徑,無(wú)論在哪個(gè)目錄執(zhí)行Tomcat啟動(dòng)腳本,JDK路徑都不會(huì)失效; - 升級(jí)友好:
setenv文件不會(huì)被Tomcat升級(jí)覆蓋,后續(xù)換JDK只需修改該文件的JDK目錄名即可。
這種配置方式的優(yōu)勢(shì)是Tomcat-JDK一體化,可直接拷貝整個(gè)Tomcat目錄到其他同系統(tǒng)服務(wù)器,無(wú)需重新配置JDK環(huán)境,直接啟動(dòng)即可使用。
另外如果你發(fā)現(xiàn)Tomcat9的bin目錄里有setclasspath.sh(Linux/Mac)/setclasspath.bat(Windows),這個(gè)文件是Tomcat原生的核心腳本,啟動(dòng)時(shí)會(huì)被catalina.sh/bat自動(dòng)加載,作用是檢測(cè)并設(shè)置JDK/JRE的類(lèi)路徑、驗(yàn)證JAVA_HOME/JRE_HOME的有效性——這和我們之前配置setenv.sh的方案完全兼容,甚至可以說(shuō)setclasspath.sh正是我們用setenv.sh配置相對(duì)路徑JDK的“底層支撐”,不用修改這個(gè)原生文件,繼續(xù)按之前的方法配置即可。
下面給你講清楚這個(gè)文件的核心邏輯、和setenv.sh的加載順序,以及為什么絕對(duì)不要修改它,同時(shí)補(bǔ)充驗(yàn)證細(xì)節(jié),讓你徹底放心配置。
一、setclasspath.sh 核心作用(Tomcat原生,無(wú)需改動(dòng))
這個(gè)文件是Tomcat官方寫(xiě)的JDK路徑檢測(cè)腳本,核心邏輯只有2點(diǎn):
- 優(yōu)先讀取已設(shè)置的
JAVA_HOME/JRE_HOME:如果我們?cè)?code>setenv.sh里提前設(shè)置了JAVA_HOME(Tomcat下的專(zhuān)屬JDK),setclasspath.sh會(huì)直接復(fù)用這個(gè)變量,不會(huì)再去檢測(cè)系統(tǒng)全局的JDK; - 若未設(shè)置,則自動(dòng)查找系統(tǒng)JDK:如果沒(méi)配
JAVA_HOME,它會(huì)遍歷系統(tǒng)路徑找jdk/jre,找不到就直接報(bào)錯(cuò)啟動(dòng)失敗(這也是Tomcat默認(rèn)需要系統(tǒng)全局JDK的原因)。
簡(jiǎn)單說(shuō):setclasspath.sh是“JDK路徑檢測(cè)器”,而setenv.sh是“JDK路徑配置器”,我們的配置會(huì)被檢測(cè)器優(yōu)先讀取,完美契合Tomcat的原生啟動(dòng)邏輯。
二、Tomcat啟動(dòng)腳本的加載順序(關(guān)鍵,解釋為什么setenv.sh生效)
Tomcat9的啟動(dòng)腳本執(zhí)行流程是層層加載的,setenv.sh的配置會(huì)提前于setclasspath.sh生效,確保JDK路徑被優(yōu)先設(shè)置,順序如下(Linux/Mac為例,Windows邏輯完全一致):
startup.sh → catalina.sh → setenv.sh(自定義,優(yōu)先加載)→ setclasspath.sh(原生,檢測(cè)JDK)→ 啟動(dòng)Tomcat
? 結(jié)論:你之前按我給的方法新建setenv.sh配置相對(duì)路徑JAVA_HOME,完全不會(huì)和setclasspath.sh沖突,反而會(huì)被它優(yōu)先使用,無(wú)需對(duì)這個(gè)原生文件做任何修改(改了會(huì)被Tomcat升級(jí)覆蓋,還可能導(dǎo)致啟動(dòng)邏輯出錯(cuò))。
三、補(bǔ)充:利用setclasspath.sh驗(yàn)證JDK配置(可選)
如果想快速驗(yàn)證setenv.sh里的JAVA_HOME是否被正確讀取,可以直接執(zhí)行setclasspath.sh,它會(huì)輸出JDK檢測(cè)結(jié)果:
Linux/Mac執(zhí)行命令
# 進(jìn)入Tomcat的bin目錄 cd CATALINA_HOME/bin # 執(zhí)行setclasspath.sh(會(huì)輸出JDK檢測(cè)日志,無(wú)報(bào)錯(cuò)即配置成功) ./setclasspath.sh
- 配置成功:無(wú)任何報(bào)錯(cuò),直接返回命令行;
- 配置失敗(如JDK目錄寫(xiě)錯(cuò)):會(huì)明確報(bào)錯(cuò)
JAVA_HOME is not defined correctly,提示找不到JDK,此時(shí)檢查setenv.sh里的JDK相對(duì)路徑即可。
Windows(對(duì)應(yīng)setclasspath.bat)
cd CATALINA_HOME\bin setclasspath.bat
同理,無(wú)報(bào)錯(cuò)即成功,報(bào)錯(cuò)則檢查setenv.bat的路徑。
四、再次強(qiáng)調(diào):絕對(duì)不要修改setclasspath.sh/bat的3個(gè)原因
- 原生文件,升級(jí)會(huì)覆蓋:Tomcat升級(jí)時(shí),bin目錄下的原生腳本(包括setclasspath.sh)會(huì)被新版本替換,你的修改會(huì)全部丟失;
- 邏輯復(fù)雜,易改崩:這個(gè)文件包含跨平臺(tái)的JDK檢測(cè)邏輯(兼容不同JDK版本、不同系統(tǒng)),新手修改容易破壞原有邏輯,導(dǎo)致Tomcat無(wú)法啟動(dòng);
- 官方有預(yù)留入口:Tomcat官方明確推薦用
setenv.sh/bat做自定義環(huán)境配置,這是專(zhuān)門(mén)為用戶(hù)預(yù)留的“安全入口”,完全能滿(mǎn)足JDK、JVM參數(shù)的配置需求。
總結(jié)
bin目錄下的setclasspath.sh是Tomcat原生的JDK路徑檢測(cè)腳本,無(wú)需修改、無(wú)需刪除,我們的配置會(huì)被它優(yōu)先讀??;- 繼續(xù)按之前的方法在
bin目錄新建setenv.sh(Linux/Mac),用$CATALINA_HOME/jdk/你的JDK目錄配置相對(duì)路徑JAVA_HOME即可,完全兼容; - Tomcat啟動(dòng)腳本的加載順序是
setenv.sh → setclasspath.sh,確保自定義JDK路徑優(yōu)先生效,實(shí)現(xiàn)Tomcat-JDK一體化(無(wú)需系統(tǒng)全局JDK); - 可直接執(zhí)行
setclasspath.sh快速驗(yàn)證JDK配置是否正確,無(wú)報(bào)錯(cuò)即代表路徑有效。
你現(xiàn)在直接按之前的步驟配置setenv.sh就行,這個(gè)原生的setclasspath.sh只會(huì)幫你“驗(yàn)證并使用”配置的JDK,不會(huì)有任何沖突~
到此這篇關(guān)于tomcat9使用指定的JDK版本的文章就介紹到這了,更多相關(guān)tomcat9使用指定JDK版本內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
可觀測(cè)性-Metrics-數(shù)據(jù)庫(kù)連接池HikariCP監(jiān)控教程
這篇文章主要介紹了可觀測(cè)性-Metrics-數(shù)據(jù)庫(kù)連接池HikariCP監(jiān)控教程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-03-03
SpringBoot響應(yīng)處理實(shí)現(xiàn)流程詳解
這篇文章主要介紹了SpringBoot響應(yīng)處理實(shí)現(xiàn)流程,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧2022-10-10
為什么mybatis中的SqlSession一定要關(guān)閉
這篇文章主要介紹了為什么mybatis中的SqlSession一定要關(guān)閉,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12
idea創(chuàng)建springboot項(xiàng)目,java版本只能選擇17和21的解決方案
這篇文章主要介紹了idea創(chuàng)建springboot項(xiàng)目,java版本只能選擇17和21的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-04-04
java.lang.IllegalStateException異常解決
異常是程序在執(zhí)行過(guò)程中遇到的錯(cuò)誤或異常情況,本文就來(lái)介紹一下java.lang.IllegalStateException異常解決,感興趣的可以了解一下2023-11-11
Spring Data JPA進(jìn)行數(shù)據(jù)分頁(yè)與排序的方法
這篇文章主要介紹了Spring Data JPA進(jìn)行數(shù)據(jù)分頁(yè)與排序的方法,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-11-11

