2011-11-16 26 views
7

Java RMI uygulamasında çalışıyorum ve bir sunucuyu kayıt defterine bağlarken sorun yaşıyorum. Ben rmi eklenti kullanarak tutulma üzerinde çalışıyorum ve her şey benim pc biçimlendirmek zorunda kalmadan önce iyi çalıştı. Ayrıca, bir çözüm olarak bana verilen kod olduğu için kodun tamam olduğundan eminim, bu yüzden yapılandırmamla ilgili bir sorun olmalı. Ben farklı ayarlar denedimJava RMI sunucuya bağlanamıyor

Failed to register object java.rmi.ServerException: RemoteException occurred in server thread; nested exception is: 
    java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is: 
    java.lang.ClassNotFoundException: access to class loader denied 
java.rmi.ServerException: RemoteException occurred in server thread; nested exception is: 
    java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is: 
    java.lang.ClassNotFoundException: access to class loader denied 
    at sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:419) 
    at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:267) 
    at sun.rmi.transport.Transport$1.run(Transport.java:177) 
    at sun.rmi.transport.Transport$1.run(Transport.java:174) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at sun.rmi.transport.Transport.serviceCall(Transport.java:173) 
    at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:553) 
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:808) 
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:667) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603) 
    at java.lang.Thread.run(Thread.java:722) 
    at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(StreamRemoteCall.java:273) 
    at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:251) 
    at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:377) 
    at sun.rmi.registry.RegistryImpl_Stub.rebind(Unknown Source) 
    at java.rmi.Naming.rebind(Naming.java:177) 
    at RMIChatServerImpl.main(RMIChatServerImpl.java:175) 
Caused by: java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is: 
    java.lang.ClassNotFoundException: access to class loader denied 
    at sun.rmi.registry.RegistryImpl_Skel.dispatch(Unknown Source) 
    at sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:409) 
    at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:267) 
    at sun.rmi.transport.Transport$1.run(Transport.java:177) 
    at sun.rmi.transport.Transport$1.run(Transport.java:174) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at sun.rmi.transport.Transport.serviceCall(Transport.java:173) 
    at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:553) 
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:808) 
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:667) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603) 
    at java.lang.Thread.run(Thread.java:722) 
Caused by: java.lang.ClassNotFoundException: access to class loader denied 
    at sun.rmi.server.LoaderHandler.loadClass(LoaderHandler.java:447) 
    at sun.rmi.server.LoaderHandler.loadClass(LoaderHandler.java:184) 
    at java.rmi.server.RMIClassLoader$2.loadClass(RMIClassLoader.java:637) 
    at java.rmi.server.RMIClassLoader.loadClass(RMIClassLoader.java:264) 
    at sun.rmi.server.MarshalInputStream.resolveClass(MarshalInputStream.java:216) 
    at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1593) 
    at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1514) 
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1750) 
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1347) 
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:369) 
    ... 13 more 
Caused by: java.security.AccessControlException: access denied ("java.io.FilePermission" "\D:\uni\YEAR 3\Enterprise Programming\java\czat solution 2\bin\-" "read") 
    at java.security.AccessControlContext.checkPermission(AccessControlContext.java:366) 
    at java.security.AccessController.checkPermission(AccessController.java:555) 
    at java.lang.SecurityManager.checkPermission(SecurityManager.java:549) 
    at sun.rmi.server.LoaderHandler$Loader.checkPermissions(LoaderHandler.java:1176) 
    at sun.rmi.server.LoaderHandler$Loader.access$000(LoaderHandler.java:1130) 
    at sun.rmi.server.LoaderHandler.loadClass(LoaderHandler.java:411) 
    ... 22 more 

Sorunun araştırılmış ve en çok (Ben de güvenlik politikasını kullanın) nedeniyle kod temeli ayarları olduğunu söylemek:

public static void main (String[] args){ 

    try{ 

     RMIChatServer myObject = new RMIChatServerImpl(); 

     System.setSecurityManager(new RMISecurityManager()); 

     Naming.rebind("Hello", myObject); 

     System.out.println("Remote object bound to registry"); 
    } 
    catch(Exception e){ 

     System.out.println("Failed to register object " + e); 
     e.printStackTrace(); 
     System.exit(1); 

    } 

} 

İstisnalar o verir: İşte kod ve şu anda daha önce çalışmış olan ancak şu anda başarısız olan rmi eklentisi tarafından sağlanan 'classpath'den hesaplama' seçeneğini kullanıyoruz :(Lütfen öneri edin:

+0

Windows'ta mısınız? – gotomanners

+0

'RMISecurityManager' ayarını denemediniz mi? – srkavin

+0

"-Djava.security.debug = erişim, hata" ile çalıştırın ve bir şey atlarsa bakın – gotomanners

cevap

3

Yani, sorunu ve çözümü hızlı özeti:

Eğer dosyaya onun kod tabanına ayarlarsanız 7.1/6.29 (mümkünse başka versiyonu) RMI sunucu bağlamak olmaz JDK üzerinde çalıştırıyorsanız veya sabit diskinizdeki dizini. Aynı kod, JDK'nın eski sürümünde gayet iyi çalışır (6.24'te test edilmiştir). Yardımlarınız için teşekkürler!

+1

Sorun, özellikle RMI Kayıt Defteri ve * dosya: * codebases ile ilgilidir. – EJP

+0

kabul edildi ama yararsızdır, cevabı bakın: user866585 – Chris

2

Buradaki temel sorun, RMI Kaydı, SecurityManager ve 'un .policy dosyasının altında çalışıyor. java.io.FilePermission" "\D:\uni\YEAR 3\Enterprise Programming\java\czat solution 2\bin\-" "read". Buradaki ipucu, bunun bir ServerException, yani aramanın hedefine atıldığı ve aramanın kendisinin rebind() olduğunu göstermesidir.

Açıklama için this post adresine bakın.

+0

Teşekkürler, bu çok açıklar. Benim durumumda yapılabilecek en kolay şey, sadece JDK'nın eski versiyonunu kullanmaktı. – tomsky

10

FWIW

Ben JDK1.6.0_33 ila 1,7 yükseltti. 0_21 ve aynı sorunu vardı. Bu document bulundu ve birlikte rmiregistry başlatarak sorunu çözüldü:

rmiregistry -J-Djava.rmi.server.useCodebaseOnly=false

+0

Java8 için benim için hile yaptı, çok fazla! – Chris