Tomcat 无法识别 JAVA_HOME

Tomcat 无法识别 JAVA_HOME

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

export JAVA_HOME=/opt/java/jdk1.8.0_05
export PATH=$PATH:$JAVA_HOME/bin

当我运行时,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

但是...我刚刚尝试过echo $JAVA_HOME并且它有效吗?

答案1

中有一个帮助文本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

当你开始tomcat使用时catalina.sh,它会搜索文件setenv.sh采购它正在CATALINA_HOME或中搜索CATALINA_BASE

因此更好的设置方法JAVA_HOMEtomcat

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

    export JAVA_HOME=/opt/java/jdk1.8.0_05
    
  3. 使其可执行。


为什么应该使用此解决方案:

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

答案2

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

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

    sudo -E /opt/tomcat7/apache-tomcat-7.0.53/bin/startup.sh
    

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

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

    sudo nano /etc/environment
    

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

    JAVA_HOME=/opt/java/jdk1.8.0_05
    PATH=$PATH:$JAVA_HOME/bin
    

    进而

    source /etc/environment
    

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


更新:

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

sudo su

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

答案3

我正在寻找的解决方案是/etc/environment,如环境变量,不处理脚本,也不扩展变量,因此添加以下内容(没有导出)起了作用:

JAVA_HOME=/opt/java/jdk1.8.0_05

然后我重新启动系统以使更改生效。

答案4

选择或尝试不同的JDK

$JAVA_HOME如上所述catalina.shintro 或其他 Tomcat 文档,并且不要更改除其中定义的环境变量(例如 Catalina Home/Base)之外的任何其他内容。然后运行以下命令;

sudo update-alternatives --config java
sudo update-alternatives --config javac
sudo update-alternatives --config javadoc
sudo update-alternatives --config javap

在每个服务器上,我都必须从 Java Development Kit/JDK 版本 11 切换到版本 8,以适应 tomcat 版本 8。我测试了两次,我确信这是解决方案(使用更新替代方案,依赖 Java 的程序知道在哪里可以找到 Java,因此您不必在 env vars 文件中重复此操作)。A 最初,我确实发现我的 shutdown.sh 脚本正在端口 8005 上寻找我的服务器,而它却在 8080 上启动(严重无法联系 localhost:8005。Tomcat 可能未运行。 或者连接被拒绝错误)。但服务器本身确实关闭了。我手动重新启动它,然后将其关闭,结果发现错误不再发生。

加入 tomcat 用户组,我想你会发现 Tomcat 本身就很麻烦。然后对自己要有耐心!

注意/注意事项:一次测试一个更改,并相应地更新其他更改。

相关内容