Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學
您现在的位置: Windows教程網 >> Windows教程 >  >> Linux 系統教學 >> Linux 教學

解決 Tomcat 啟動報「Neither JAVA_HOME nor JRE_HOME is defined」環境變數配置

編輯:Linux 教學

前言

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
  • 不同用戶的 Shell 環境變數獨立(.bashrc, .bash_profile, /etc/profile)
  • 非登入 Shell(如 su -c, systemd, cron)不會載入互動式 Shell 配置

解決方案

方法一:修改 catalina.sh 直接指定(最直接、隔離性好)


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 時需重複設定。

方法二:設定 setenv.sh(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 參數。

方法三:系統級環境變數(/etc/profile.d/)


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 生效。

方法四:用戶級環境變數(~/.bash_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

常見坑點

Q: 設定了 JAVA_HOME 但啟動仍報錯?
A: 檢查路徑是否正確(ls $JAVA_HOME/bin/java)、腳本是否有語法錯誤、是否在正確用戶環境下執行。
Q: systemd 服務啟動失敗?
A: systemd 不載入 Shell 配置,需在 Service 檔指定 Environment=JAVA_HOME=... 或使用 setenv.sh。
Q: 多版本 Java 共存怎麼辦?
A: 每個 Tomcat 實例用 setenv.sh 指定各自的 JAVA_HOME,互不干擾。

systemd 服務範例(生產環境推薦)


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 環境變數繼承。

Copyright © Windows教程網 All Rights Reserved