Java RMI 클라이언트/서버 코드를 상속 받았지만 한 시스템에서 정상적으로 실행되지만 가져올 수 없었습니다. 내 dev 환경에서 실행합니다.Java RMI ServerException - java.lang.ClassNotFoundException : org.prog.rmi.RmiServer_Stub
java.rmi.ServerException: RemoteException occurred in server thread; nested exception is:
java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is:
java.lang.ClassNotFoundException: org.prog.rmi.RmiServer_Stub (no security manager: RMI class loader disabled)
at sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:396)
at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:250)
at sun.rmi.transport.Transport$1.run(Transport.java:159)
at java.security.AccessController.doPrivileged(Native Method)
at sun.rmi.transport.Transport.serviceCall(Transport.java:155)
at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:535)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:790)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:649)
...
내 server.policy
파일이
grant {
permission java.security.AllPermission;
};
입니다 그리고 내 자바 코드 : 나는 다음과 같은 java.exe -Djava.security.policy=conf\server.policy -SRC;. -Djava.library.path=. org.prog.rmi.RmiServer
나는 다음과 같은 오류를 사용하여 서버를 실행할 때
문제는
package org.prog.rmi;
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.RMISecurityManager;
import java.rmi.server.UnicastRemoteObject;
import java.rmi.registry.*;
public class RmiServer extends UnicastRemoteObject
implements RmiServerIntf {
private BatchApi bapi;
private String iniFileLocation;
private String layoutOption;
private int addressCount = 0;
private RefInt apiHandle = new RefInt();
public RmiServer(String iniFileLocation,String layoutOption) throws RemoteException
{ super();
this.iniFileLocation = iniFileLocation;
this.layoutOption = layoutOption;
initAPI();
startupAPI();
openAPI();
}
public static void main(String args[])
{
System.out.println("RMI server started");
// Create and install a security manager
if (System.getSecurityManager() == null)
{
System.setSecurityManager(new RMISecurityManager());
System.out.println("Security manager installed.");
}
else
System.out.println("Security manager already exists.");
try //special exception handler for registry creation
{
LocateRegistry.createRegistry(1099);
System.out.println("java RMI registry created.");
}
catch (RemoteException e)
{
//do nothing, error means registry already exists
System.out.println("java RMI registry already exists.");
}
try
{
//Instantiate RmiServer
for (String arg: args){
System.out.println(arg);
}
RmiServer obj = new RmiServer(args[0],args[1]);
// Bind this object instance to the name "RmiServer"
Naming.rebind("//127.0.0.1/RmiServer", obj);
System.out.println("PeerServer bound in registry");
}
catch (Exception e)
{
System.err.println("RMI server exception:");
e.printStackTrace();
}
}
}
나는 java.rmi.server.codebase
에 관한 솔루션을 본 적이 있지만, 운이 중
"rmi : // localhost : 1099/RmiServer"에 서버를 바인딩하면 안됩니까? 귀하의 URL이 올바르게 쓰여진 것 같지 않습니다. 이것이 문제의 원인이라고 확신하지는 못하지만이를 고치는 것이 좋은 출발점이 될 것입니다. –
이것은 까다로하게 들리지만, 일부 RMI 코드를 직접 상속 받지만 실행하는 데 많은 어려움을 겪지는 않았습니다. 한 가지 우리는 컴파일 된 jar 파일을 클라이언트와 서버로 패키징합니다. 적어도 동일한 내부 클래스 정의를 사용할 수 있다는 것을 보장합니다. – gnomed
또한 개발 환경 외부에서 코드를 실행할 때 JDK 1.5 이상을 사용하고 있습니까? 프록시를 자동 생성하는 기능은 JDK 1.5에서 제공되었으며 UnicastRemoteObject를 확장하는 서버에만 제공됩니다. 그렇지 않으면 서버를 rmic하고 스텁을 직접 생성해야합니다. –