Tomcat 啟動腳本 catalina.sh 需要 JAVA_HOME 或 JRE_HOME 環境變數定位 Java 執行檔。切換用戶(如從一般用戶換到 root)或非登入 Shell 環境下啟動時,常因環境變數未載入導致啟動失敗。
Neither the JAVA_HOME nor the JRE_HOME environment variable is defined
At least one of these environment variable is needed to run this program
catalina.sh 啟動時會讀取 JAVA_HOME/JRE_HOME.bashrc, .bash_profile, /etc/profile)su -c, systemd, cron)不會載入互動式 Shell 配置
cd /path/to/tomcat/bin
vi catalina.sh
在檔案開頭(註解區塊後、第一個命令前)加入:
# ---- 自訂 Java 路徑 ----
export JAVA_HOME=/usr/local/jdk1.8.0_202
export JRE_HOME=/usr/local/jdk1.8.0_202/jre
# ------------------------
優點:Tomcat 專用,不影響其他程式;缺點:升級 Tomcat 時需重複設定。
vi /path/to/tomcat/bin/setenv.sh
# 若不存在則新建
內容:
#!/bin/bash
export JAVA_HOME=/usr/local/jdk1.8.0_202
export JRE_HOME=$JAVA_HOME/jre
export CATALINA_OPTS="-Xms512m -Xmx2048m -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m"
chmod +x setenv.sh
優點:不修改原始腳本,升級不受影響,可集中管理 JVM 參數。
vi /etc/profile.d/java.sh
export JAVA_HOME=/usr/local/jdk1.8.0_202
export JRE_HOME=$JAVA_HOME/jre
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
chmod +x /etc/profile.d/java.sh
source /etc/profile.d/java.sh
適用:所有用戶、所有 Java 程式共用。需重新登入或 source /etc/profile 生效。
vi ~/.bash_profile
# 加入同上 export 內容
source ~/.bash_profile
# 檢查環境變數
echo $JAVA_HOME
echo $JRE_HOME
# 測試 Java 版本
java -version
# 啟動 Tomcat
/path/to/tomcat/bin/startup.sh
# 或
/path/to/tomcat/bin/catalina.sh run
ls $JAVA_HOME/bin/java)、腳本是否有語法錯誤、是否在正確用戶環境下執行。Environment=JAVA_HOME=... 或使用 setenv.sh。setenv.sh 指定各自的 JAVA_HOME,互不干擾。
vi /etc/systemd/system/tomcat.service
[Unit]
Description=Apache Tomcat
After=network.target
[Service]
Type=forking
User=tomcat
Group=tomcat
Environment=JAVA_HOME=/usr/local/jdk1.8.0_202
Environment=JRE_HOME=/usr/local/jdk1.8.0_202/jre
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
[Install]
WantedBy=multi-user.target
systemctl daemon-reload
systemctl enable tomcat
systemctl start tomcat
推薦使用 setenv.sh 隔離 Tomcat Java 環境,搭配 systemd 服務管理實現生產級部署。避免直接修改 catalina.sh 或依賴不穩定的 Shell 環境變數繼承。