今天因为公司有项目要开发,但作为是刚刚入手Ubuntu的吃瓜群众,不得不重新配置一套开IDE。
首先大家来找找茬上图两张:
图一:(成功)
图二:(失败)
别看两次运行结果都是Tomcat started
http://localhost:8080,测试一下发现第二次是假启动 ,
千万别认为是你的浏览器坏了,不信我们来看看日志(logs/catalina.log):
Exception in thread "main" java.lang.UnsupportedClassVersionError: org/apache/catalina/startup/Bootstrap : Unsupported major.minor version 51.0
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClassCond(ClassLoader.java:631)
at java.lang.ClassLoader.defineClass(ClassLoader.java:615)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:283)
at java.net.URLClassLoader.access$000(URLClassLoader.java:58)
at java.net.URLClassLoader$1.run(URLClassLoader.java:197)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
Could not find the main class: org.apache.catalina.startup.Bootstrap. Program will exit.
我们来翻译一下:不能够找到main class 但是事实上我们的项目里有下面这个jar包。
org.apache.catalina.startup.Bootstrap
这是为什么,请看上图两张图的结果上显示JRE_HOME这个属性的不同,一个配置了,一个未配置,区别来了;JRE是什么东西,Java run environment,正解。再来看我们的tomcat给的说明文件,下面这个文件其实很重要,有些小伙伴可能会忽略:RUNNING.txt 这个文件详细描述了tomcat运行需要的参数,配置,运行命令,等等。读一下真的会让你有个更加深入的理解,博主有空会翻译一份。
(3.2) Set JRE_HOME or JAVA_HOME (required)
These variables are used to specify location of a Java Runtime
Environment or of a Java Development Kit that is used to start Tomcat.
The JRE_HOME variable is used to specify location of a JRE. The JAVA_HOME
variable is used to specify location of a JDK.
Using JAVA_HOME provides access to certain additional startup options that
are not allowed when JRE_HOME is used.
If both JRE_HOME and JAVA_HOME are specified, JRE_HOME is used.
这段话的大致意思就是tomcat运行的时候需要jre,可以仅有一个jre环境,也可以有jdk环境,因为jdk里毕竟包含着jre嘛,当两者都配置的时候,优先使用jre_hone,那么问题来了tomcat在启动的时候在哪个位置配置了这两个环境变量呢,接着看文件
(4) Start Up Tomcat
(4.1) Tomcat can be started by executing one of the following commands:
On Windows:
%CATALINA_HOME%\bin\startup.bat
or
%CATALINA_HOME%\bin\catalina.bat start
On *nix:
$CATALINA_HOME/bin/startup.sh
or
$CATALINA_HOME/bin/catalina.sh start
这两个就有意思了,启动的时候的文件,首先我们来分析$CATALINA_HOME是什么东西,
(3.1) Set CATALINA_HOME (required) and CATALINA_BASE (optional)
The CATALINA_HOME environment variable should be set to the location of the
root directory of the "binary" distribution of Tomcat.
看这段文字:可以知道CATALINA_HOME是一个必须的环境变量,那么这个环境变量是怎么来的呢,再来看看startup.sh和catalina.sh这两个文件,发现catalina.sh这个文件很有意思了,里面全是一些配置的环境变量,甚至它文件的开头注释详细描述了,这些变量的作用,例如
# JAVA_HOME Must point at your Java Development Kit installation.
# Required to run the with the "debug" argument.
#
# JRE_HOME Must point at your Java Runtime installation.
# Defaults to JAVA_HOME if empty. If JRE_HOME and JAVA_HOME
# are both set, JRE_HOME is used.
这两个词清楚的说明了这两个环境变量的重要性,至此我们可以知道,JRE_HOME这个变量必须有,而且可以配置在此文件下,再回过头来看CATALINA_HOME这个变量在哪里配置了,来看看startup.bat这个命令文件一看惊奇的发现:
rem Guess CATALINA_HOME if not defined
set "CURRENT_DIR=%cd%"
if not "%CATALINA_HOME%" == "" goto gotHome
set "CATALINA_HOME=%CURRENT_DIR%"
if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome
cd ..
set "CATALINA_HOME=%cd%"
cd "%CURRENT_DIR%"
:gotHome
if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome
echo The CATALINA_HOME environment variable is not defined correctly
echo This environment variable is needed to run this program
goto end
:okHome
set "EXECUTABLE=%CATALINA_HOME%\bin\catalina.bat"
在这个文件中,首先判断CATALINA_HOME环境变量是否为空,如果为空,就将当前目录设为CATALINA_HOME的值。接着判断当前目录下是否存在bin\catalina.bat,如果文件不存在,将当前目录的父目录设为CATALINA_HOME的值。根据笔者机器上Tomcat安装目录的层次结构,最后CATALINA_HOME的值被设为Tomcat的安装目录。如果环境变量CATALINA_HOME已经存在,则通过这个环境变量调用bin目录下的“catalina.bat start”命令。通过这段分析,我们了解到两个信息,一是Tomcat启动时,需要查找CATALINA_HOME这个环境变量,如果在Tomcat的bin目录下调用startup.bat,Tomcat会自动并正确设置CATALINA_HOME;二是执行startup.bat命令,实际上执行的是“catalina.bat start”命令。
所以得出结论:刚才的错误是由于没有加载jre_home引起的,而博主是在tomcat这个目录下执行的startup.sh所以默认目录为tomcat目录,而此目录下有catalina.bat,所有tomcat启动成功了,但是事实上是缺少一个jre环境的所以可以在catalina.sh文件下配置jre_home的位置,大功搞成。