问题:启动tomcat报找不到JAVA_HOME或者JRE_HOME环境变量的问题

栏目: Java · 发布时间: 7年前

内容简介:一、错误来源在非linux系统上(即外部)启动tomcat时显示的错误二、报错原文

一、错误来源

在非 linux 系统上(即外部)启动tomcat时显示的错误

二、报错原文

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

三、错误译文

JAVA_HOME和JRE_HOME环境变量都没有定义

运行这个程序至少需要这些环境变量中的一个

四、错误思索

我明明在/etc/profile这个文件里面添加了 java 和tomcat的环境变量啊,为什么还出错,而在服务器上启动tomcat就不报这个错误

五、粗略分析错误原因

在服务器上启动tomcat不报错是因为启动tomcat时区/etc/profile文件里面找到了java和tomcat的环境变量,所以顺利启动,而在外部启动tomcat时,tomcat程序首先调用startup.sh脚本文件,startup.sh又去调用catalina.sh这个脚本文件,而catalina.sh脚本文件又会去setclasspath.sh这个脚本文件里面寻找tomcat变量环境,这是因为setclasspath.sh文件就是tomcat变量环境脚本,这是因为这个脚本默认是没有在脚本开头申请java和jdk的变量环境刘静的,因此报错,setclasspath.sh的路径是:

/usr/local/tomcat/bin/setclasspath.sh

(因为我的tomcat是装在/usr/local路径下了,所以我的是这个,你们要按照你们的安装路径在查找)

六、查看setclasspath.sh脚本文件,精确分析原因

setclasspath.sh脚本原文以及中文解释如下:

#!/bin/sh
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License.  You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# -----------------------------------------------------------------------------
#  Set CLASSPATH and Java options
#
#  $Id: setclasspath.sh 795037 2009-07-17 10:52:16Z markt $
# -----------------------------------------------------------------------------
# Make sure prerequisite environment variables are set
#因为setclasspath.sh脚本是被catalina.sh调用,所以可以继承catalina.sh中的变量申明
if [ -z "$JAVA_HOME" -a -z "$JRE_HOME" ]; then
#判断用户有没有提前做$JAVA_HOME和$JRE_HOME全局变量声明,如果都没进行申明
  # Bugzilla 37284 (reviewed).
  if $darwin; then
  #要理解这个判断,先看下startup.sh和shutdown.sh就会明白
  #这个是win仿真unix不用管下面两个语句
    if [ -d "/System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK/Home" ]; then
      export JAVA_HOME="/System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK/Home"
    fi
  else
  #其他环境没有申明,那么系统自己想办法找这两个变量的路径
    JAVA_PATH=`which java 2>/dev/null`
#此语句可以把java命令位置找出来
    if [ "x$JAVA_PATH" != "x" ]; then
#如果能找出java路径,则可以定位到java命令的路径,经过作者验证不是java的装路径
#所以通过此处就可以看出,老鸟们为什么都要自己指定这两个变量了
      JAVA_PATH=`dirname $JAVA_PATH 2>/dev/null`
      JRE_HOME=`dirname $JAVA_PATH 2>/dev/null`
    fi
    if [ "x$JRE_HOME" = "x" ]; then
#如果找不到java路径,那么就看有没有/usr/bin/java这个执行文件,有的话就它了,没有就算了
      # XXX: Should we try other locations?
      if [ -x /usr/bin/java ]; then
        JRE_HOME=/usr
      fi
    fi
  fi

  if [ -z "$JAVA_HOME" -a -z "$JRE_HOME" ]; then
  #再验证一边,有没有这两个变量,没有不好意思,我不执行了,退出
  #这个exit 1 不但是结束setclasspath.sh,会彻底退出catalina.sh脚本的
  #对于在脚本中引用脚本的童鞋们,就需要注意了,小心使用exit。 
    echo "Neither the JAVA_HOME nor the JRE_HOME environment variable is defined"
    echo "At least one of these environment variable is needed to run this program"
    exit 1
  fi
fi
if [ -z "$JAVA_HOME" -a "$1" = "debug" ]; then
  echo "JAVA_HOME should point to a JDK in order to run in debug mode."
  exit 1
fi
if [ -z "$JRE_HOME" ]; then
  JRE_HOME="$JAVA_HOME"
fi
# If we're running under jdb, we need a full jdk.
if [ "$1" = "debug" ] ; then
  if [ "$os400" = "true" ]; then
    if [ ! -x "$JAVA_HOME"/bin/java -o ! -x "$JAVA_HOME"/bin/javac ]; then
      echo "The JAVA_HOME environment variable is not defined correctly"
      echo "This environment variable is needed to run this program"
      echo "NB: JAVA_HOME should point to a JDK not a JRE"
      exit 1
    fi
  else
    if [ ! -x "$JAVA_HOME"/bin/java -o ! -x "$JAVA_HOME"/bin/jdb -o ! -x "$JAVA_HOME"/bin/javac ]; then
      echo "The JAVA_HOME environment variable is not defined correctly"
      echo "This environment variable is needed to run this program"
      echo "NB: JAVA_HOME should point to a JDK not a JRE"
      exit 1
    fi
  fi
fi
#上段的代码都是在确认$JAVA_HOME和$JRE_HOME变量的申明情况及后续的解决过程
if [ -z "$BASEDIR" ]; then
#对"$BASEDIR变量的检查,木有的话就退出
  echo "The BASEDIR environment variable is not defined"
  echo "This environment variable is needed to run this program"
  exit 1
fi
if [ ! -x "$BASEDIR"/bin/setclasspath.sh ]; then
#确认"$BASEDIR"/bin/setclasspath.sh有木有,木有还是退出
  if $os400; then
    # -x will Only work on the os400 if the files are:
    # 1. owned by the user
    # 2. owned by the PRIMARY group of the user
    # this will not work if the user belongs in secondary groups
    eval
#eval不清楚嘛意思
  else 
    echo "The BASEDIR environment variable is not defined correctly"
    echo "This environment variable is needed to run this program"
    exit 1
  fi
fi
# Don't override the endorsed dir if the user has set it previously
#这个是确认JAVA_ENDORSED_DIRS的位置
if [ -z "$JAVA_ENDORSED_DIRS" ]; then
  # Set the default -Djava.endorsed.dirs argument
  JAVA_ENDORSED_DIRS="$BASEDIR"/endorsed
fi
# OSX hack to CLASSPATH
JIKESPATH=
if [ `uname -s` = "Darwin" ]; then
  OSXHACK="/System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK/Classes"
  if [ -d "$OSXHACK" ]; then
    for i in "$OSXHACK"/*.jar; do
      JIKESPATH="$JIKESPATH":"$i"
    done
  fi
fi
# Set standard commands for invoking Java.
#这句是响当当的重要,确定了$_RUNJAVA的值
_RUNJAVA="$JRE_HOME"/bin/java
if [ "$os400" != "true" ]; then
  _RUNJDB="$JAVA_HOME"/bin/jdb
fi

说明:通过对这个脚本的分析,我们可以看到,这个脚本就做了一件事情,检查各种变量是否赋值,验证tomcat启动停止需要涉及到的文件,保障tomcat顺利启动停止。而我们报错就是因为它在全文搜索了半天结果一直找不到JRE_HOME和JAVA_HOME这两个变量到底在哪。

七、解决方案

在setclasspath.sh脚本文件的所有没有注释的行的开头加入截图中的两行即可:

问题:启动tomcat报找不到JAVA_HOME或者JRE_HOME环境变量的问题

最后重启tomcat就解决了问题。


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

The Little MLer

The Little MLer

Matthias Felleisen、Daniel P. Friedman、Duane Bibby、Robin Milner / The MIT Press / 1998-2-19 / USD 34.00

The book, written in the style of The Little Schemer, introduces instructors, students, and practicioners to type-directed functional programming. It covers basic types, quickly moves into datatypes, ......一起来看看 《The Little MLer》 这本书的介绍吧!

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具