2011-11-16 28 views
7

Tôi đang làm việc trên ứng dụng Java RMI và gặp sự cố khi liên kết máy chủ với sổ đăng ký. Tôi đang làm việc trên eclipse bằng cách sử dụng rmi plugin, và tất cả mọi thứ đã làm việc tốt trước khi tôi đã phải định dạng pc của tôi. Ngoài ra, tôi chắc chắn rằng mã là ok vì nó là một trong những trao cho tôi như là một giải pháp, do đó, phải có một cái gì đó sai với cấu hình của tôi. Dưới đây là các mã:Java RMI không thể liên kết máy chủ

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); 

    } 

} 

Exceptions nó mang lại:

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 

tôi nghiên cứu các vấn đề và hầu hết nói rằng đó là vì các thiết lập codebase (Tôi cũng sử dụng chính sách bảo mật), tôi đã cố gắng cài đặt khác nhau, và hiện đang sử dụng tùy chọn 'tính toán từ classpath' được cung cấp bởi plugin rmi, đã hoạt động trước đó, nhưng không thành công ngay bây giờ: (Vui lòng tư vấn!

+0

bạn trên Windows ?? – gotomanners

+0

Bạn đã cố gắng không đặt 'RMISecurityManager'? – srkavin

+0

Chạy nó bằng '-Djava.security.debug = truy cập, thất bại' và xem có bất cứ điều gì nhảy vào bạn – gotomanners

Trả lời

3

Vì vậy, nhanh chóng tóm tắt các vấn đề và các giải pháp:

Nếu bạn đang chạy trên JDK 7.1/6.29 (có thể một số phiên bản khác) máy chủ RMI sẽ không ràng buộc nếu bạn thiết lập codebase của nó vào file hoặc thư mục trên đĩa cứng của bạn. Cùng một mã hoạt động tốt dưới phiên bản cũ của JDK (thử nghiệm trên 6.24). Cảm ơn sự giúp đỡ của bạn!

+1

Vấn đề là đặc biệt với RMI Registry và * file: * codebases. – EJP

+0

được chấp nhận nhưng không hữu ích, hãy xem câu trả lời của: user1766585 – Chris

2

Vấn đề cơ bản ở đây là RMI Registry đang chạy theo một số SecurityManager. Tệp chính sách không cấp java.io.FilePermission" "\D:\uni\YEAR 3\Enterprise Programming\java\czat solution 2\bin\-" "read".

Đầu mối cho rằng đây là ServerException, tức là được ném vào mục tiêu của cuộc gọi và chính cuộc gọi đó là rebind().

Xem this post để được giải thích.

+0

Cảm ơn, điều này giải thích rất nhiều. Điều dễ nhất để làm trong trường hợp của tôi là sử dụng phiên bản JDK cũ hơn. – tomsky

0

Bạn đã cố cấp quyền truy cập rõ ràng vào tệp bằng tệp * .policy chưa? như mô tả trên http://docs.oracle.com/javase/7/docs/technotes/guides/security/permissions.html

 
grant codebase "file:/path/to/code" { 
    permission java.io.FilePermission "\D:\uni\YEAR 3\Enterprise Programming\java\czat solution 2\bin\-", "read"; 
} 

Tôi có cùng một vấn đề với openjdk ... có lẽ do cam kết này: http://hg.openjdk.java.net/jdk7u/jdk7u-gate/jdk/rev/7ed2fd310470

10

FWIW

tôi nâng cấp từ JDK1.6.0_33 đến 1.7. 0_21 và có cùng một vấn đề. Tôi thấy điều này document và giải quyết vấn đề bằng cách bắt đầu rmiregistry với:

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

+0

đã làm điều đó cho tôi trong Java8, rất nhiều! – Chris

Các vấn đề liên quan