由于缺少jmxremote.access文件而禁用JMX身份验证,Tomcat 7无法启动

时间:2014-02-25 22:02:42

标签: java tomcat jmx

我的tomcat 7(在amazon-eu,java 1.7.0_51上托管)无法启动以下异常:

SEVERE: Catalina.start:org.apache.catalina.LifecycleException: Failed to start component [StandardServer[8005]]
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:154)
        at org.apache.catalina.startup.Catalina.start(Catalina.java:684)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:616)
        at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:322)
        at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:456)
Caused by: java.lang.IllegalArgumentException: jmxremote.access (No such file or directory)
        at javax.management.remote.rmi.RMIConnectorServer.start(RMIConnectorServer.java:372)
        at org.apache.catalina.mbeans.JmxRemoteLifecycleListener.createServer(JmxRemoteLifecycleListener.java:304)
        at org.apache.catalina.mbeans.JmxRemoteLifecycleListener.lifecycleEvent(JmxRemoteLifecycleListener.java:258)
        at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119)
        at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:90)
        at org.apache.catalina.util.LifecycleBase.setStateInternal(LifecycleBase.java:402)
        at org.apache.catalina.util.LifecycleBase.setState(LifecycleBase.java:347)
        at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:725)
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
        ... 7 more
Caused by: java.io.FileNotFoundException: jmxremote.access (No such file or directory)
        at java.io.FileInputStream.open(Native Method)
        at java.io.FileInputStream.<init>(FileInputStream.java:137)
        at java.io.FileInputStream.<init>(FileInputStream.java:96)
        at com.sun.jmx.remote.security.MBeanServerFileAccessController.propertiesFromFile(MBeanServerFileAccessController.java:294)
        at com.sun.jmx.remote.security.MBeanServerFileAccessController.<init>(MBeanServerFileAccessController.java:133)
        at javax.management.remote.rmi.RMIConnectorServer.start(RMIConnectorServer.java:370)
        ... 15 more

启用了JMX,因为我在/usr/share/tomcat7/conf/tomcat7.conf中有以下行:

$CATALINA_OPTS=-Dcom.sun.management.jmxremote -Djava.rmi.server.hostname=ec2-<ip>.eu-west-1.compute.amazonaws.com -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false

以及/usr/share/tomcat7/conf/server.xml中的以下内容:

<Listener className="org.apache.catalina.mbeans.JmxRemoteLifecycleListener"
           rmiRegistryPortPlatform="9998" rmiServerPortPlatform="9998"/>

如果我评论这两行,一切都很好。

问题是:为什么在“authenticate”设置为false时需要jmxremote.access。

2 个答案:

答案 0 :(得分:2)

你是绝对正确的,如果你设置com.sun.management.jmxremote.authenticate=false你不应该需要jmxremote.access文件,我相信问题是JMX参数没有被选中由tomcat提供,据我所知,tomcat7.conf不是tomcat(check this)的标准配置文件,请尝试将它们添加到/usr/share/tomcat7/bin/catalina.sh,如下所示:

CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote -Djava.rmi.server.hostname=ec2-<ip>.eu-west-1.compute.amazonaws.com -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false"

有关如何配置tomcat check this的更多信息,您将在catalina.sh的标题中看到更多文档。

答案 1 :(得分:0)

尝试用双引号括起命令行参数,例如:

$CATALINA_OPTS="-Dcom.sun.management.jmxremote -Djava.rmi.server.hostname=ec2-<ip>.eu-west-1.compute.amazonaws.com -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false"

我的猜测是,由于缺少引号,它只考虑了第一个参数。