2011-08-24 3 views
0

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에 관한 솔루션을 본 적이 있지만, 운이 중

+0

"rmi : // localhost : 1099/RmiServer"에 서버를 바인딩하면 안됩니까? 귀하의 URL이 올바르게 쓰여진 것 같지 않습니다. 이것이 문제의 원인이라고 확신하지는 못하지만이를 고치는 것이 좋은 출발점이 될 것입니다. –

+0

이것은 까다로하게 들리지만, 일부 RMI 코드를 직접 상속 받지만 실행하는 데 많은 어려움을 겪지는 않았습니다. 한 가지 우리는 컴파일 된 jar 파일을 클라이언트와 서버로 패키징합니다. 적어도 동일한 내부 클래스 정의를 사용할 수 있다는 것을 보장합니다. – gnomed

+0

또한 개발 환경 외부에서 코드를 실행할 때 JDK 1.5 이상을 사용하고 있습니까? 프록시를 자동 생성하는 기능은 JDK 1.5에서 제공되었으며 UnicastRemoteObject를 확장하는 서버에만 제공됩니다. 그렇지 않으면 서버를 rmic하고 스텁을 직접 생성해야합니다. –

답변

0

후 일부 추가 조사를하고 내가 다른 포트 (예 : 2005)에 RMI 등록 서버를 응시하고이 라인을 변경하는 경우 포트 1099

에 RMI 등록 서버에 문제가있는 것을 나타났다 다음 RMI 자습서 코드

LocateRegistry.createRegistry(2005); 

Naming.rebind("//127.0.0.1:2055/RmiServer", obj); 

의이 오류없이 성공적으로 실행하고 내 클라이언트는 연결할 수 있었다.

이 답변으로이 오류로 다른 사용자에게 도움이되기를 바랍니다. 누구든지 더 자세한 정보가 필요한 경우 알려주십시오.

+2

포트 번호를 변경해도 문제가 해결되지 않습니다. 그 클래스 경로에 스텁없이 실행중인 다른 레지스트리가 있었고 예외가 표시되지 않거나 무시 되었기 때문에 1099에서이 레지스트리를 만드는 것이 자동으로 실패한 것 같습니다. – EJP

0

당신은 rmic의와 스텁을 재생하지 않았거나 레지스트리가 클래스 경로를 통해 액세스 할 수없는 설정을 가지고 있지 않았다 .

+0

안녕하세요 EJP 님, 몇 가지 추가 설명을 제공 할 수 있습니까? RMI 서버 프로그램을 다른 컴퓨터로 옮길 때 스텁 파일을 재생성해야합니까? 스텁 파일을 복사 할 수 없습니까? 나는 방금 rmic org.prog.rmi.RmiServer 코드로 다시 생성 해 보았습니다. 그리고 이것은 차이를 만들지 않은 것 같습니다. "레지스트리가 classpath를 통해 액세스 할 수 없다"는 것이 무슨 뜻인지 잘 모르겠습니다. - 여기서 무엇을해야합니까? – Loftx

+0

@Loftx 컴파일 단계입니다. 어떤 컴퓨터에 의존하지 않습니다. 당신은 그것을 주위에 복사 할 수 있습니다. LocateRegistry를 통해 서버 JVM (권장)에서 레지스트리를 시작하거나 -J-Dclasspath = JAR 파일이 필요한 모든 * rmiregistry *를 시작해야합니다. – EJP