gpt4 book ai didi

java - RMI 绑定(bind)失败并显示 "java.lang.ClassNotFoundException: rmitest.IRemote"

转载 作者:行者123 更新时间:2023-12-01 21:08:23 24 4
gpt4 key购买 nike

我在将远程对象绑定(bind)到 RMI 注册表时遇到问题。我已将代码简化为一个非常简单的示例,当我在计算机(Windows 10)上测试它时,它运行良好。但是,如果我在另一台计算机(Windows 7)上启动它,当调用 registry.bind(id, remoteObject); 时,我会收到此异常:

java.lang.ClassNotFoundException: 
rmitest.IRemote (no security manager: RMI class loader disabled)

我不需要 SecurityManager,因为所有类文件都在 jar 中,并且我不想使用动态代码加载功能。

为什么它会尝试加载安全管理器,为什么即使我定义了安全管理器也找不到安全管理器?它在一台机器上运行但在另一台机器上运行失败的原因可能是什么?我认为代码是好的,它一定是一些配置问题,但我不确定到底是什么配置错误。

这是远程接口(interface)和远程对象实现,我将其导出为 Eclipse 中的可运行 Jar,即 rmitest.jar

public interface IRemote extends Remote {
void foo() throws RemoteException;
}
public class RemoteImpl extends UnicastRemoteObject implements IRemote {

private static Registry registry;

public RemoteImpl() throws RemoteException {
super();
}

public static void main(final String[] args) throws Exception {
try {
LocateRegistry.createRegistry(Registry.REGISTRY_PORT);
} catch (final Exception e) {
// already created
}
registry = LocateRegistry.getRegistry(Registry.REGISTRY_PORT);
registry.bind(UUID.randomUUID().toString(), new RemoteImpl());
System.out.println("Binding successful");
}

@Override
public void foo() throws RemoteException {
System.out.println("foo");
}
}

这是完整的堆栈跟踪,它在调用 registry.bind 的行中抛出,并且与使用以下命令运行时完全相同:java -jar rmtest.jar
java -Djava.security.manager -Djava.security.policy=policy -jar rmitest.jar

很奇怪的是,显然在这两种情况下都需要安全管理器,但即使在第二种情况下也找不到安全管理器。

Exception in thread "main" java.rmi.ServerException: RemoteException occurred in server thread; nested exception is: 
java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is:
java.lang.ClassNotFoundException: rmitest.IRemote (no security manager: RMI class loader disabled)
at sun.rmi.server.UnicastServerRef.oldDispatch(Unknown Source)
at sun.rmi.server.UnicastServerRef.dispatch(Unknown Source)
at sun.rmi.transport.Transport$1.run(Unknown Source)
at sun.rmi.transport.Transport$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at sun.rmi.transport.Transport.serviceCall(Unknown Source)
at sun.rmi.transport.tcp.TCPTransport.handleMessages(Unknown Source)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(Unknown Source)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$256(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(StreamRemoteCall.java:276)
at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:253)
at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:379)
at sun.rmi.registry.RegistryImpl_Stub.bind(Unknown Source)
at rmitest.RemoteImpl.main(RemoteImpl.java:29)
Caused by: java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is:
java.lang.ClassNotFoundException: rmitest.IRemote (no security manager: RMI class loader disabled)
at sun.rmi.registry.RegistryImpl_Skel.dispatch(Unknown Source)
at sun.rmi.server.UnicastServerRef.oldDispatch(Unknown Source)
at sun.rmi.server.UnicastServerRef.dispatch(Unknown Source)
at sun.rmi.transport.Transport$1.run(Unknown Source)
at sun.rmi.transport.Transport$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at sun.rmi.transport.Transport.serviceCall(Unknown Source)
at sun.rmi.transport.tcp.TCPTransport.handleMessages(Unknown Source)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(Unknown Source)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$256(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.ClassNotFoundException: rmitest.IRemote (no security manager: RMI class loader disabled)
at sun.rmi.server.LoaderHandler.loadProxyClass(Unknown Source)
at java.rmi.server.RMIClassLoader$2.loadProxyClass(Unknown Source)
at java.rmi.server.RMIClassLoader.loadProxyClass(Unknown Source)
at sun.rmi.server.MarshalInputStream.resolveProxyClass(Unknown Source)
at java.io.ObjectInputStream.readProxyDesc(Unknown Source)
at java.io.ObjectInputStream.readClassDesc(Unknown Source)
at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
at java.io.ObjectInputStream.readObject0(Unknown Source)
at java.io.ObjectInputStream.readObject(Unknown Source)
... 15 more

这是策略文件,它应该允许一切:

grant {
permission java.security.AllPermission;
};

最佳答案

问题是“其他一些 Java 进程”提供了自己的注册表,它无法访问您的 CLASSPATH。您会发现,如果您有比 createRegistry() 的空 catch block 更好的东西。

关于java - RMI 绑定(bind)失败并显示 "java.lang.ClassNotFoundException: rmitest.IRemote",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41873994/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com