在TOMCAT中使用RMI服務的常見問題

          Posted on 2006-03-09 10:08 么么茶 閱讀(2966) 評論(2)  編輯  收藏 所屬分類: JAVA-WEB
          近日因項目臨近尾聲,開始啟動工程化的工作。但是才剛剛開始就遇到個不小的問題。我們的發布是將項目連同TOMCAT一起打包,而我們的項目中使用了RMI的通信,在啟動項目時會建立一個RMI的server,這樣問題就來了。當我們將項目安裝在帶有空格的目錄中(如C:\Program Files\...)時,在啟動TOMCAT時即會報錯,報錯的信息大致如下(其中隱去了部分公司相關代碼):
          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
          可以看到路徑被從空格處截斷了,致使RMI的server無法找到啟動所需要的classpath。
          通過查找相關的文檔和資料,發現很多人都遇到過類似的問題,其中最有意義的信息是
          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
          按照上文的意思,這是一個由JDK引起的bug,而且今后也不會被修復。

          但是我們的項目有兩個版本,我所做的是WEB版的,而另外一個是獨立運行版本。問題就在這兒,那個獨立運行的版本安裝在帶有空格的目錄中時依然可以正常工作,但是一旦放到TOMCAT中就不行了。通過反復查看上述報錯信息中的各個類文件的報錯位置,也未能找到確切的原因。但是因為這些類中有多處使用了ClassLoader,所以懷疑是因為放到TOMCAT中后缺省的ClassLoader和獨立運行時不同,造成了在使用RMI相關的操作時出現了一些差別。

          Feedback

          # re: 在TOMCAT中使用RMI服務的常見問題  回復  更多評論   

          2006-05-17 14:16 by javasky
          rmi的安全機制太煩人了,我把它做到servlet中就不知怎么用安全機制了,白白損失了30分,心疼啊...

          # re: 在TOMCAT中使用RMI服務的常見問題[未登錄]  回復  更多評論   

          2009-03-26 14:21 by Terry Lee
          你這個問題讓我想起了Tomcat的JDT編譯器。Tomcat默認不使用系統的JDK進行編譯,而是使用自身帶的JDT(JDT來自eclipse),所以樓主可以嘗試更換JDT為JDK看看能否解決你的問題。另外,可以嘗試用不同版本的JDK和Tomcat試試,不知道樓主現在用的是什么版本的。

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 恩平市| 许昌县| 济宁市| 高唐县| 汝城县| 五指山市| 贡山| 绵阳市| 沾益县| 神池县| 天台县| 张家港市| 丹凤县| 遵义市| 建始县| 十堰市| 扎兰屯市| 柳林县| 德江县| 南岸区| 枝江市| 包头市| 巴马| 夏邑县| 敖汉旗| 普定县| 土默特右旗| 杭锦旗| 涪陵区| 滦平县| 泸溪县| 哈巴河县| 滕州市| 禄丰县| 泊头市| 厦门市| 安远县| 泽库县| 阜康市| 碌曲县| 澄城县|