कल मैंने जावा आरएमआई के साथ शुरू करने की कोशिश की। मुझे यह सूर्य ट्यूटोरियल (http://java.sun.com/docs/books/tutorial/rmi/index.html) मिला और सर्वर अपूर्णता के साथ शुरू किया। लेकिन हर बार जब मैं प्रोग्राम शुरू करता हूं (rmiregistry चल रहा है) मैं निम्नलिखित StackTrace के साथ एक AccessControlException मिलती है:जावा आरएमआई ट्यूटोरियल - एक्सेसकंट्रोल अपवाद: एक्सेस अस्वीकार (java.io.FilePermission
LoginImpl exception:
java.security.AccessControlException: access denied (java.io.FilePermission \\\C\ProjX\server\serverProj\bin\usermanager read)
at java.security.AccessControlContext.checkPermission(AccessControlContext.java:264)
at java.security.AccessController.checkPermission(AccessController.java:427)
at java.lang.SecurityManager.checkPermission(SecurityManager.java:532)
at java.lang.SecurityManager.checkRead(SecurityManager.java:871)
at java.io.File.exists(File.java:700)
at sun.net.www.protocol.file.Handler.openConnection(Handler.java:80)
at sun.net.www.protocol.file.Handler.openConnection(Handler.java:55)
at java.net.URL.openConnection(URL.java:943)
at sun.rmi.server.LoaderHandler.addPermissionsForURLs(LoaderHandler.java:1020)
at sun.rmi.server.LoaderHandler.access$300(LoaderHandler.java:52)
at sun.rmi.server.LoaderHandler$Loader.<init>(LoaderHandler.java:1108)
at sun.rmi.server.LoaderHandler$Loader.<init>(LoaderHandler.java:1089)
at sun.rmi.server.LoaderHandler$1.run(LoaderHandler.java:861)
at java.security.AccessController.doPrivileged(Native Method)
at sun.rmi.server.LoaderHandler.lookupLoader(LoaderHandler.java:858)
at sun.rmi.server.LoaderHandler.loadProxyClass(LoaderHandler.java:541)
at java.rmi.server.RMIClassLoader$2.loadProxyClass(RMIClassLoader.java:628)
at java.rmi.server.RMIClassLoader.loadProxyClass(RMIClassLoader.java:294)
at sun.rmi.server.MarshalInputStream.resolveProxyClass(MarshalInputStream.java:238)
at java.io.ObjectInputStream.readProxyDesc(ObjectInputStream.java:1494)
at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1457)
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 sun.rmi.registry.RegistryImpl_Skel.dispatch(Unknown Source)
at sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:375)
at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:240)
at sun.rmi.transport.Transport$1.run(Transport.java:153)
at java.security.AccessController.doPrivileged(Native Method)
at sun.rmi.transport.Transport.serviceCall(Transport.java:149)
at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:460)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:701)
at java.lang.Thread.run(Thread.java:595)
at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(Unknown Source)
at sun.rmi.transport.StreamRemoteCall.executeCall(Unknown Source)
at sun.rmi.server.UnicastRef.invoke(Unknown Source)
at sun.rmi.registry.RegistryImpl_Stub.rebind(Unknown Source)
at startserver.StartServer.main(StartServer.java:22)
मेरे server.policy फ़ाइल इस तरह दिखता है:
grant {
permission java.security.AllPermission;
};
लेकिन मैं भी इस एक कोशिश की ...
grant {
permission java.security.AllPermission;
permission java.io.FilePermission "file://C:/ProjX/server/serverProj/bin/usermanager", "read";
};
... और यह एक (और कई अन्य :-():
grant codeBase "file:///-" {
permission java.security.AllPermission;
};
लेकिन हर मामले में परिणाम एक ही है। और हां, पॉलिसी फाइल पथ में है (जब मैं पॉलिसी फाइल में गलत स्टेटस लिखता हूं तो मुझे एक पार्स अपवाद दिखाई देता है)। मैंने कई अन्य "/" और "\" नक्षत्रों की कोशिश की लेकिन इसका कोई प्रभाव नहीं पड़ा।
मैं ग्रहण और मेरी वी एम-पैरामीटर का उपयोग इस तरह हैं:
-cp C:\ProjX\server\serverProj\bin\usermanager\
-Djava.rmi.server.codebase=file://C:/ProjX/server/serverProj/bin/usermanager/
-Djava.rmi.server.hostname=XYZ (anonymized)
-Djava.security.policy=server.policy
संकलित रिमोट-इंटरफेस और इंटरफेस-कार्यान्वयन वर्ग (LoginImpl) वर्ग इस पथ में हैं: "C:/ProjX/सर्वर/serverProj/bin/usermanager/"। मुख्य विधि, मैं कहाँ instanciate और रजिस्ट्री में ठूंठ rebind एक और पैकेज में है और इस तरह दिखता है:
public static void main(String[] args) {
if (System.getSecurityManager() == null) {
System.setSecurityManager(new SecurityManager());
}
try {
String name = "Login";
Login login = new LoginImpl();
Login stub = (Login) UnicastRemoteObject.exportObject(login, 0);
Registry registry = LocateRegistry.getRegistry();
registry.rebind(name, stub);
System.out.println("LoginImpl bound");
} catch (Exception e) {
System.err.println("LoginImpl exception:");
e.printStackTrace();
}
}
किसी को भी मेरे लिए एक सलाह है? मदद के लिए शुक्रिया।
तो सवाल ही है (java.rmi.UnmarshalException पता चलता है कि codebase बदलते मेरी AccessControlException का समाधान नहीं है)। और नहीं: मैं एक प्लगइन "जी बी" खरीदना नहीं चाहता ;-)।
मुझे एक समान समस्या थी। मैंने इसे इस दृष्टिकोण के माध्यम से हल किया - https://stackoverflow.com/a/44275905/1509058 –