Tomcat 无法识别 JAVA_HOME

isa*_*pir 17 bash java tomcat environment-variables

我已经安装了 Ubuntu 14.04 Server,提取了 JDK1.8u5 和 Tomcat7,并将以下内容添加到 .profile(我也尝试将其添加到 .bashrc 并具有类似的 [非] 结果):

export JAVA_HOME=/opt/java/jdk1.8.0_05
export PATH=$PATH:$JAVA_HOME/bin
Run Code Online (Sandbox Code Playgroud)

当我运行时,echo $JAVA_HOME我得到了预期的结果/opt/java/jdk1.8.0_05。我也可以运行java -version并从 Java 获得正确的响应。到目前为止,一切都很好。

所以现在我尝试启动Tomcat(也尝试过catalina.sh),我得到以下信息:

user@ubuntu:~$ sudo /opt/tomcat7/apache-tomcat-7.0.53/bin/startup.sh
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
Run Code Online (Sandbox Code Playgroud)

但是...我刚试过echo $JAVA_HOME,它奏效了吗?

c0r*_*0rp 30

中有帮助文本catalina.sh。我将在这里引用:

#   Do not set the variables in this script. Instead put them into a script
#   setenv.sh in CATALINA_BASE/bin to keep your customizations separate.

#
#   JAVA_HOME       Must point at your Java Development Kit installation.
#                   Required to run the with the "debug" argument.

# Ensure that any user defined CLASSPATH variables are not used on startup,
# but allow them to be specified in setenv.sh, in rare case when it is needed.
CLASSPATH=

if [ -r "$CATALINA_BASE/bin/setenv.sh" ]; then
  . "$CATALINA_BASE/bin/setenv.sh"
elif [ -r "$CATALINA_HOME/bin/setenv.sh" ]; then
  . "$CATALINA_HOME/bin/setenv.sh"
fi
Run Code Online (Sandbox Code Playgroud)

当您开始tomcat使用 时catalina.sh,它会搜索文件setenv.sh获取它。它正在搜索CATALINA_HOMECATALINA_BASE

所以更好的方式来设定JAVA_HOMEtomcat是:

  1. 创建一个setenv.sh在文件夹中命名的脚本CATALINA_BASE/bin,如果它不存在的话。
  2. 将此行添加到 setenv.sh

    export JAVA_HOME=/opt/java/jdk1.8.0_05
    
    Run Code Online (Sandbox Code Playgroud)
  3. 使其可执行。


为什么你应该使用这个解决方案:

在脚本中设置环境变量更安全。始终尝试尽可能在本地设置变量。尽量不要使用/etc/environment/etc/profile和其他人,如果你真的没有需要Global Environment Variable。设置JAVA_HOMEinsetenv.sh使您能够将不同的 tomcat 与需要不同版本java但由一个用户运行的不同应用程序一起使用。其他用户环境不会受到您的影响。


job*_*bin 6

由于您为自己的用户而不是超级用户设置了环境变量,因此您有两个选择:

  1. 您必须使用-E选项导出变量,如下所示:

    sudo -E /opt/tomcat7/apache-tomcat-7.0.53/bin/startup.sh
    
    Run Code Online (Sandbox Code Playgroud)

    请注意,这将在运行命令时导出所有环境变量。这不是首选,因为当您以 root 身份运行命令时,普通用户环境会溢出。这是不可取的。

  2. 导出root.bashrc /etc/enviroment文件中的变量。打开终端并输入:

    sudo nano /etc/environment
    
    Run Code Online (Sandbox Code Playgroud)

    并输入您的管理密码,并将以下几行添加到文件末尾:

    JAVA_HOME=/opt/java/jdk1.8.0_05
    PATH=$PATH:$JAVA_HOME/bin
    
    Run Code Online (Sandbox Code Playgroud)

    进而

    source /etc/environment
    
    Run Code Online (Sandbox Code Playgroud)

    或重新启动您的机器,然后重试您正在使用的命令。


更新:

这个答案提供了两个提示,为什么第 2 步不起作用,sudo会重置环境并提供安全路径,因此所有全局变量都被重置。一种解决方法是使用

sudo su
Run Code Online (Sandbox Code Playgroud)

然后执行使用设置的环境变量的命令。