Tomcat 启动失败

Tomcat failing to startup

前几天打开电脑,尝试启动tomcat,结果是我从事软件开发以来的第一次惊喜

确切的错误信息是:

Using CATALINA_BASE:   "C:\apache-tomcat-8.0.9"
Using CATALINA_HOME:   "C:\apache-tomcat-8.0.9"
Using CATALINA_TMPDIR: "C:\apache-tomcat-8.0.9\temp"
Using JRE_HOME:        "C:\Program Files\Java\jdk1.8.0_45"
Using CLASSPATH:       "C:\apache-tomcat-8.0.9\bin\bootstrap.jar;C:\apache-tomcat-8.0.9\bin\tomcat-juli.jar"
Error occurred during initialization of VM
Could not find agent library D:\Program in absolute path, with error: Can't find dependent libraries

我无法理解它的意义,也无法在 google 中找到任何相关信息,尝试使用 3 个不同版本的 tomcat 7.0.8、8.0.5、8.0.9,所有人都是一样的情况。当我看到这个时,我认为 JDK 已经过时了,因为我有它的几个版本,然后我从 PC 上删除了所有 JDKs 和 JRE,只安装了最后一个 8u45,但没有任何运气。有人能指出我正确的方向吗?

echo

的输出
Using CATALINA_BASE:   "C:\Users\Denees\AppData\Roaming\NetBeans.0.1\apache-tomcat-8.0.15.0_base"
Using CATALINA_HOME:   "C:\Program Files\Apache Software Foundation\Apache Tomcat 8.0.15"
Using CATALINA_TMPDIR: "C:\Users\Denees\AppData\Roaming\NetBeans.0.1\apache-tomcat-8.0.15.0_base\temp"
Using JRE_HOME:        "C:\Java\jdk1.8.0_45"
Using CLASSPATH:       "C:\Program Files\Apache Software Foundation\Apache Tomcat 8.0.15\bin\bootstrap.jar;C:\Program Files\Apache Software Foundation\Apache Tomcat 8.0.15\bin\tomcat-juli.jar"
"C:\Java\jdk1.8.0_45\bin\java.exe" -XX:+UseConcMarkSweepGC -XX:+CMSPermGenSweepingEnabled -XX:+CMSClassUnloadingEnabled -XX:MaxPermSize=1024m -Dhttp.nonProxyHosts="localhost|127.0.0.1|Denees" -Drebel.env.ide.plugin.version=6.2.0.1 -Drebel.env.ide.version=8.0.2 -Drebel.env.ide.product=netbeans -Drebel.env.ide=netbeans -Drebel.base=C:\Users\Denees\.jrebel -Drebel.notification.url=http://localhost:57212 -agentpath:D:\Program Files\NetBeans 8.0.1\java2\griffin\lib\jrebel64.dll -Djava.util.logging.config.file="C:\Users\Denees\AppData\Roaming\NetBeans.0.1\apache-tomcat-8.0.15.0_base\conf\logging.properties" -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager   -Djava.endorsed.dirs="C:\Program Files\Apache Software Foundation\Apache Tomcat 8.0.15\endorsed" -classpath "C:\Program Files\Apache Software Foundation\Apache Tomcat 8.0.15\bin\bootstrap.jar;C:\Program Files\Apache Software Foundation\Apache Tomcat 8.0.15\bin\tomcat-juli.jar" -Dcatalina.base="C:\Users\Denees\AppData\Roaming\NetBeans.0.1\apache-tomcat-8.0.15.0_base" -Dcatalina.home="C:\Program Files\Apache Software Foundation\Apache Tomcat 8.0.15" -Djava.io.tmpdir="C:\Users\Denees\AppData\Roaming\NetBeans.0.1\apache-tomcat-8.0.15.0_base\temp" org.apache.catalina.startup.Bootstrap  start

您应该将 "C:\Program Files" 放在引号或更好的位置,将 tomcat 安装到名称中没有空格的文件夹。

这是由无效的 JVM 命令行参数引起的错误。这是重现它的一种方法:

C:\>java -agentpath:D:\Program Files\blahblah
Error occurred during initialization of VM
Could not find agent library D:\Program in absolute path, with error: Can't find dependent libraries

检查 Tomcat 的 Java 选项。 运行 %CATALINA_HOME%\bin\tomcat8w.exe 作为管理员,导航到 Java 选项卡并查看 Java 选项。如果 -agentpath 的值中有 spaces,则将值括在双引号中。

如果在 Tomcat 的启动中找不到任何此类参数,请检查 NetBeans 中 Tomcat 服务器的配置。转到 Window > 服务器,在左侧列表中选择您的服务器,然后单击平台选项卡。如果 'VM Options' 字段包含 -agentpath 参数的值,并且该值中包含 space,请确保该值用双引号引起来。

如果您在配置文件模式下启动 Tomcat,也会使用 -agentpath 参数。这是我看到的用于在 NetBeans 8.0.2 中以配置文件模式启动 Tomcat 的完整命令行,在 Sysinternals Process Explorer 的帮助下捕获,并格式化为可读性:

"C:\Program Files\Java\jdk1.8.0_05\bin\java.exe"   
  -Dhttp.nonProxyHosts="localhost|127.0.0.1|Stalactite"
  -agentpath:"C:\Program Files\NetBeans 8.0.2\profiler\lib\deployed\jdk16\windows-amd64\profilerinterface.dll=C:\Program Files\NetBeans 8.0.2\profiler\lib",5140
  -Dnbprofiler.agentid=1145099082
  -Djava.util.logging.config.file="C:\Apache\Tomcat8.0.12\conf\logging.properties"
  -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
  -Djava.endorsed.dirs="C:\Apache\Tomcat8.0.12\endorsed"
  -classpath "C:\Apache\Tomcat8.0.12\bin\bootstrap.jar;C:\Apache\Tomcat8.0.12\bin\tomcat-juli.jar" 
  -Dcatalina.base="C:\Apache\Tomcat8.0.12"
  -Dcatalina.home="C:\Apache\Tomcat8.0.12"
  -Djava.io.tmpdir="C:\Apache\Tomcat8.0.12\temp"
  org.apache.catalina.startup.Bootstrap start

可能您使用的是旧版本的 NetBeans,它可能会为 -agentpath 参数生成无效值。

如果上述所有方法都失败,您将需要确切地找出用于启动 Java 的命令行是什么。为此,请在文本编辑器中编辑 catalina.bat (C:\apache-tomcat-8.0.9\bin\catalina.bat)。底部是四行,全部以 %_EXECJAVA% 开头。复制每一行,将其粘贴到正上方,并在其前面添加 echo。所以它看起来不像下面这样(为了清楚起见,我缩写了 %_EXECJAVA% 行):

if not "%JPDA%" == "" goto doJpda
if not "%SECURITY_POLICY_FILE%" == "" goto doSecurity
%_EXECJAVA% %JAVA_OPTS% %CATALINA_OPTS% %DEBUG_OPTS% ...
goto end
:doSecurity
%_EXECJAVA% %JAVA_OPTS% %CATALINA_OPTS% %DEBUG_OPTS% ...
goto end
:doJpda
if not "%SECURITY_POLICY_FILE%" == "" goto doSecurityJpda
%_EXECJAVA% %JAVA_OPTS% %CATALINA_OPTS% %JPDA_OPTS% %DEBUG_OPTS% ...
goto end
:doSecurityJpda
%_EXECJAVA% %JAVA_OPTS% %CATALINA_OPTS% %JPDA_OPTS% %DEBUG_OPTS% ...
goto end

它应该看起来像

if not "%JPDA%" == "" goto doJpda
if not "%SECURITY_POLICY_FILE%" == "" goto doSecurity
echo %_EXECJAVA% %JAVA_OPTS% %CATALINA_OPTS% %DEBUG_OPTS% ...
%_EXECJAVA% %JAVA_OPTS% %CATALINA_OPTS% %DEBUG_OPTS% ...
goto end
:doSecurity
echo %_EXECJAVA% %JAVA_OPTS% %CATALINA_OPTS% %DEBUG_OPTS% ...
%_EXECJAVA% %JAVA_OPTS% %CATALINA_OPTS% %DEBUG_OPTS% ...
goto end
:doJpda
if not "%SECURITY_POLICY_FILE%" == "" goto doSecurityJpda
echo %_EXECJAVA% %JAVA_OPTS% %CATALINA_OPTS% %JPDA_OPTS% %DEBUG_OPTS% ...
%_EXECJAVA% %JAVA_OPTS% %CATALINA_OPTS% %JPDA_OPTS% %DEBUG_OPTS% ...
goto end
:doSecurityJpda
echo %_EXECJAVA% %JAVA_OPTS% %CATALINA_OPTS% %JPDA_OPTS% %DEBUG_OPTS% ...
%_EXECJAVA% %JAVA_OPTS% %CATALINA_OPTS% %JPDA_OPTS% %DEBUG_OPTS% ...
goto end

然后,当您启动 Tomcat 时,您应该会看到完整的命令行 运行 启动 Java。这应该出现在 NetBeans 日志 window 中,紧接在 Using CLASSPATH:.

开头的行下方

既然你已经完成了这一步并得到了输出,我可以很快看出问题是由命令行的以下部分引起的。

-agentpath:D:\Program Files\NetBeans 8.0.1\java2\griffin\lib\jrebel64.dll

所以你正在使用 JRebel。

我没有使用 JRebel,而且由于我没有社交媒体帐户,所以我什至无法注册试用。我所能做的就是安装 JRebel NetBeans 插件并查看各种选项。

如果您 运行 Tomcat 作为远程服务器,那么在 JRebel 插件选项的启动选项卡上的设置说明中有错误(工具 > 选项 > JRebel > 启动).要求您创建的 catalina-jrebel.bat 文件的第 3 行如下:

set JAVA_OPTS=-javaagent:%REBEL_HOME%\jrebel.jar -Drebel.remoting_plugin=true %JAVA_OPTS%

如果您的 REBEL_HOME 环境变量中包含 space,这当然是错误的,因为它在您的机器上看起来是这样。上述批处理脚本的第三行应包含 -javaagent 参数值的引号,即:

set JAVA_OPTS=-javaagent:"%REBEL_HOME%\jrebel.jar" -Drebel.remoting_plugin=true %JAVA_OPTS%

如果您通过 IDE 启动 Tomcat,JRebel 应该会自动设置服务器。如果这就是您正在做的事情,但事情仍然不适合您,那么我会寻求 ZeroTurnaround 的支持,因为这是一个 JRebel 问题。

顺便说一下,在您的机器上,REBEL_HOME 环境变量似乎指向 D:\Program Files\NetBeans 8.0.1 下的某处 - 我以为您说您安装了 NetBeans 8.0.2?

最后,作为最后的手段,尝试将 NetBeans 重新安装到一个不包含任何 space 的文件夹中。