Tomcat无法启动

Den*_*ees 4 java tomcat java-7 java-8

几天前,当我打开电脑时,我尝试启动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
Run Code Online (Sandbox Code Playgroud)

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

输出用 echo

Using CATALINA_BASE:   "C:\Users\Denees\AppData\Roaming\NetBeans\8.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\8.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\8.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\8.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\8.0.1\apache-tomcat-8.0.15.0_base\temp" org.apache.catalina.startup.Bootstrap  start
Run Code Online (Sandbox Code Playgroud)

Luk*_*ard 5

这是由无效的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
Run Code Online (Sandbox Code Playgroud)

检查Tomcat的Java选项.%CATALINA_HOME%\bin\tomcat8w.exe以管理员身份运行,导航到Java选项卡并查看Java选项.如果其中-agentpath包含空格的值,请将值括在双引号中.

如果在Tomcat的启动中找不到任何此类参数,请在NetBeans中检查Tomcat服务器的配置.转到窗口>服务器,在左侧列表中选择您的服务器,然后单击平台选项卡.如果"VM选项"字段包含-agentpath参数的值,并且此值中包含空格,请确保将此值括在双引号字符中.

-agentpath如果在配置文件模式下启动Tomcat,也会使用该参数.这是我在NetBeans 8.0.2中以Profile Mode启动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
Run Code Online (Sandbox Code Playgroud)

您可能正在使用旧版本的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
Run Code Online (Sandbox Code Playgroud)

它应该看起来像

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
Run Code Online (Sandbox Code Playgroud)

然后,当您启动Tomcat时,您应该看到正在运行的完整命令行以启动Java.这应该出现在NetBeans日志窗口中,紧挨着开始的行下方Using CLASSPATH:.

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

-agentpath:D:\Program Files\NetBeans 8.0.1\java2\griffin\lib\jrebel64.dll
Run Code Online (Sandbox Code Playgroud)

所以你正在使用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%
Run Code Online (Sandbox Code Playgroud)

如果您的REBEL_HOME环境变量中包含空格,这当然是错误的,因为它似乎在您的计算机上执行.上述批处理脚本的第三行应包含-javaagent参数值周围的引号,即:

set JAVA_OPTS=-javaagent:"%REBEL_HOME%\jrebel.jar" -Drebel.remoting_plugin=true %JAVA_OPTS%
Run Code Online (Sandbox Code Playgroud)

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

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

最后,作为最后的手段,尝试将NetBeans重新安装到不包含任何空格的文件夹中.