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

