近日因項(xiàng)目臨近尾聲,開始啟動(dòng)工程化的工作。但是才剛剛開始就遇到個(gè)不小的問題。我們的發(fā)布是將項(xiàng)目連同TOMCAT一起打包,而我們的項(xiàng)目中使用了RMI的通信,在啟動(dòng)項(xiàng)目時(shí)會(huì)建立一個(gè)RMI的server,這樣問題就來了。當(dāng)我們將項(xiàng)目安裝在帶有空格的目錄中(如C:\Program Files\...)時(shí),在啟動(dòng)TOMCAT時(shí)即會(huì)報(bào)錯(cuò),報(bào)錯(cuò)的信息大致如下(其中隱去了部分公司相關(guān)代碼):
通過查找相關(guān)的文檔和資料,發(fā)現(xiàn)很多人都遇到過類似的問題,其中最有意義的信息是
但是我們的項(xiàng)目有兩個(gè)版本,我所做的是WEB版的,而另外一個(gè)是獨(dú)立運(yùn)行版本。問題就在這兒,那個(gè)獨(dú)立運(yùn)行的版本安裝在帶有空格的目錄中時(shí)依然可以正常工作,但是一旦放到TOMCAT中就不行了。通過反復(fù)查看上述報(bào)錯(cuò)信息中的各個(gè)類文件的報(bào)錯(cuò)位置,也未能找到確切的原因。但是因?yàn)檫@些類中有多處使用了ClassLoader,所以懷疑是因?yàn)榉诺絋OMCAT中后缺省的ClassLoader和獨(dú)立運(yùn)行時(shí)不同,造成了在使用RMI相關(guān)的操作時(shí)出現(xiàn)了一些差別。
java.io.IOException: Cannot bind to URL [jmx]: javax.naming.CommunicationException: Failed to retrieve stub from server 127.0.0.1:1099 [Root exception is java.net.MalformedURLException: no protocol: Files\
]
at javax.management.remote.rmi.RMIConnectorServer.newIOException(RMIConnectorServer.java:814)
at javax.management.remote.rmi.RMIConnectorServer.start(RMIConnectorServer.java:431)
at
javax.servlet.GenericServlet.init(GenericServlet.java:211)
at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1029)
at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:862)
at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:4013)
at org.apache.catalina.core.StandardContext.start(StandardContext.java:4357)
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:823)
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:807)
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:595)
at org.apache.catalina.core.StandardHostDeployer.addChild(StandardHostDeployer.java:903)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at org.apache.commons.beanutils.MethodUtils.invokeMethod(MethodUtils.java:216)
at org.apache.commons.digester.SetNextRule.end(SetNextRule.java:256)
at org.apache.commons.digester.Rule.end(Rule.java:276)
at org.apache.commons.digester.Digester.endElement(Digester.java:1058)
at org.apache.catalina.util.CatalinaDigester.endElement(CatalinaDigester.java:76)
at org.apache.xerces.parsers.AbstractSAXParser.endElement(Unknown Source)
at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanEndElement(Unknown Source)
at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(Unknown Source)
at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source)
at org.apache.commons.digester.Digester.parse(Digester.java:1567)
at org.apache.catalina.core.StandardHostDeployer.install(StandardHostDeployer.java:488)
at org.apache.catalina.core.StandardHost.install(StandardHost.java:863)
at org.apache.catalina.startup.HostConfig.deployDescriptors(HostConfig.java:483)
at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:427)
at org.apache.catalina.startup.HostConfig.start(HostConfig.java:983)
at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:349)
at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1091)
at org.apache.catalina.core.StandardHost.start(StandardHost.java:789)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1083)
at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:478)
at org.apache.catalina.core.StandardService.start(StandardService.java:480)
at org.apache.catalina.core.StandardServer.start(StandardServer.java:2313)
at org.apache.catalina.startup.Catalina.start(Catalina.java:556)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:287)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:425)
Caused by: javax.naming.CommunicationException: Failed to retrieve stub from server 127.0.0.1:1099 [Root exception is java.net.MalformedURLException: no protocol: Files\
]
at org.jnp.interfaces.NamingContext.getServer(NamingContext.java:161)
at org.jnp.interfaces.NamingContext.checkRef(NamingContext.java:871)
at org.jnp.interfaces.NamingContext.bind(NamingContext.java:377)
at org.jnp.interfaces.NamingContext.bind(NamingContext.java:370)
at javax.naming.InitialContext.bind(InitialContext.java:359)
at javax.management.remote.rmi.RMIConnectorServer.bind(RMIConnectorServer.java:635)
at javax.management.remote.rmi.RMIConnectorServer.start(RMIConnectorServer.java:427)
51 more
Caused by: java.net.MalformedURLException: no protocol: Files\
at java.net.URL.<init>(URL.java:567)
at java.net.URL.<init>(URL.java:464)
at java.net.URL.<init>(URL.java:413)
at sun.rmi.server.LoaderHandler.pathToURLs(LoaderHandler.java:747)
at sun.rmi.server.LoaderHandler.loadClass(LoaderHandler.java:147)
at java.rmi.server.RMIClassLoader$2.loadClass(RMIClassLoader.java:620)
at java.rmi.server.RMIClassLoader.loadClass(RMIClassLoader.java:247)
at sun.rmi.server.MarshalInputStream.resolveClass(MarshalInputStream.java:197)
at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1538)
at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1460)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1693)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1299)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:339)
at java.rmi.MarshalledObject.get(MarshalledObject.java:135)
at org.jnp.interfaces.NamingContext.getServer(NamingContext.java:151)
57 more
可以看到路徑被從空格處截?cái)嗔耍率筊MI的server無法找到啟動(dòng)所需要的classpath。
at javax.management.remote.rmi.RMIConnectorServer.newIOException(RMIConnectorServer.java:814)
at javax.management.remote.rmi.RMIConnectorServer.start(RMIConnectorServer.java:431)
at

javax.servlet.GenericServlet.init(GenericServlet.java:211)
at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1029)
at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:862)
at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:4013)
at org.apache.catalina.core.StandardContext.start(StandardContext.java:4357)
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:823)
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:807)
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:595)
at org.apache.catalina.core.StandardHostDeployer.addChild(StandardHostDeployer.java:903)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at org.apache.commons.beanutils.MethodUtils.invokeMethod(MethodUtils.java:216)
at org.apache.commons.digester.SetNextRule.end(SetNextRule.java:256)
at org.apache.commons.digester.Rule.end(Rule.java:276)
at org.apache.commons.digester.Digester.endElement(Digester.java:1058)
at org.apache.catalina.util.CatalinaDigester.endElement(CatalinaDigester.java:76)
at org.apache.xerces.parsers.AbstractSAXParser.endElement(Unknown Source)
at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanEndElement(Unknown Source)
at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(Unknown Source)
at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source)
at org.apache.commons.digester.Digester.parse(Digester.java:1567)
at org.apache.catalina.core.StandardHostDeployer.install(StandardHostDeployer.java:488)
at org.apache.catalina.core.StandardHost.install(StandardHost.java:863)
at org.apache.catalina.startup.HostConfig.deployDescriptors(HostConfig.java:483)
at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:427)
at org.apache.catalina.startup.HostConfig.start(HostConfig.java:983)
at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:349)
at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1091)
at org.apache.catalina.core.StandardHost.start(StandardHost.java:789)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1083)
at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:478)
at org.apache.catalina.core.StandardService.start(StandardService.java:480)
at org.apache.catalina.core.StandardServer.start(StandardServer.java:2313)
at org.apache.catalina.startup.Catalina.start(Catalina.java:556)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:287)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:425)
Caused by: javax.naming.CommunicationException: Failed to retrieve stub from server 127.0.0.1:1099 [Root exception is java.net.MalformedURLException: no protocol: Files\

at org.jnp.interfaces.NamingContext.getServer(NamingContext.java:161)
at org.jnp.interfaces.NamingContext.checkRef(NamingContext.java:871)
at org.jnp.interfaces.NamingContext.bind(NamingContext.java:377)
at org.jnp.interfaces.NamingContext.bind(NamingContext.java:370)
at javax.naming.InitialContext.bind(InitialContext.java:359)
at javax.management.remote.rmi.RMIConnectorServer.bind(RMIConnectorServer.java:635)
at javax.management.remote.rmi.RMIConnectorServer.start(RMIConnectorServer.java:427)

Caused by: java.net.MalformedURLException: no protocol: Files\

at java.net.URL.<init>(URL.java:567)
at java.net.URL.<init>(URL.java:464)
at java.net.URL.<init>(URL.java:413)
at sun.rmi.server.LoaderHandler.pathToURLs(LoaderHandler.java:747)
at sun.rmi.server.LoaderHandler.loadClass(LoaderHandler.java:147)
at java.rmi.server.RMIClassLoader$2.loadClass(RMIClassLoader.java:620)
at java.rmi.server.RMIClassLoader.loadClass(RMIClassLoader.java:247)
at sun.rmi.server.MarshalInputStream.resolveClass(MarshalInputStream.java:197)
at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1538)
at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1460)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1693)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1299)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:339)
at java.rmi.MarshalledObject.get(MarshalledObject.java:135)
at org.jnp.interfaces.NamingContext.getServer(NamingContext.java:151)

通過查找相關(guān)的文檔和資料,發(fā)現(xiàn)很多人都遇到過類似的問題,其中最有意義的信息是
There is a bug in the JDK which makes RMI fail if Tomcat is installed in directory containing spaces (e.g. C:\Program Files\Apache Group\Jakarta Tomcat 5.0). This bug won't be fixed, so you can only workaround it.
The installation should have checked the folder name for you and promted you to reinstall Tomcat. If you missed that or renamed the folder after you installed KIM, follow the seme advice now: reinstall Tomcat in a folder (using underscores instead of spaces for example) or just rename folders needed so that the full path contains no spaces. Then reinstall KIM too and point it to the new loacation when asked for Tomcat server, or to skip the new install just manually edit your start/stop Tomcat bat/sh files in %KIM_Platform_Home%/bin directory where this path is used.
For more details refer to:
http://nagoya.apache.org/bugzilla/show_bug.cgi?id=4543
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4496398
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4273532
按照上文的意思,這是一個(gè)由JDK引起的bug,而且今后也不會(huì)被修復(fù)。The installation should have checked the folder name for you and promted you to reinstall Tomcat. If you missed that or renamed the folder after you installed KIM, follow the seme advice now: reinstall Tomcat in a folder (using underscores instead of spaces for example) or just rename folders needed so that the full path contains no spaces. Then reinstall KIM too and point it to the new loacation when asked for Tomcat server, or to skip the new install just manually edit your start/stop Tomcat bat/sh files in %KIM_Platform_Home%/bin directory where this path is used.
For more details refer to:
http://nagoya.apache.org/bugzilla/show_bug.cgi?id=4543
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4496398
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4273532
但是我們的項(xiàng)目有兩個(gè)版本,我所做的是WEB版的,而另外一個(gè)是獨(dú)立運(yùn)行版本。問題就在這兒,那個(gè)獨(dú)立運(yùn)行的版本安裝在帶有空格的目錄中時(shí)依然可以正常工作,但是一旦放到TOMCAT中就不行了。通過反復(fù)查看上述報(bào)錯(cuò)信息中的各個(gè)類文件的報(bào)錯(cuò)位置,也未能找到確切的原因。但是因?yàn)檫@些類中有多處使用了ClassLoader,所以懷疑是因?yàn)榉诺絋OMCAT中后缺省的ClassLoader和獨(dú)立運(yùn)行時(shí)不同,造成了在使用RMI相關(guān)的操作時(shí)出現(xiàn)了一些差別。