나는 rmi 응용 프로그램을 쓰고 있습니다. 모든 클래스를 하나의 디렉토리에 넣으면 모든 것이 완벽하게 작동합니다. 그러나 서버 부분과 클라이언트 부분을 분할하려고하면 java.lang.ClassNotFoundException.myclasses가 발생합니다. 레지스트리가 CLASSPATH에서 해당 클래스를 찾을 수없는 것 같습니다. 이 문제를 어떻게 해결할 수 있을지 궁금합니다.자바 rmi 예외
답변
클라이언트 및 서버에 대한 인수에 classpath 디렉토리를 지정합니까? 튜토리얼에서
:서버 Solaris 운영 체제에
:
자바 -classpath classDir -Djava.rmi.server.codebase = 파일 : classDir/example.hello.
시작 JAV : Windows 플랫폼에서 서버 &
-classpath classDir -Djava.rmi.server.codebase = 파일 :
자바 -classpath classDir 예제 : 서버가 준비 classDir/example.hello.Server
되면 다음과 같이 클라이언트를 실행할 수 있습니다. classDir 클래스 파일 트리
http://java.sun.com/javase/6/docs/technotes/guides/rmi/hello/hello-world.html#5
레지스트리는 클라이언트 인터페이스와 서버 구현 클래스를 연결합니다. 클라이언트에서는 클래스 경로에 인터페이스 클래스 정의가 있어야합니다.
또한 클라이언트는 구현 클래스를 전혀 참조하면 안됩니다. 모든 것은 interface/stub 클래스에 있어야합니다.
이 질문에 답을 얻지 못하면보다 구체적이고 최소한 코드를 제공해야합니다.
호 레지스트리의 루트 디렉토리입니다 hello.Client 는 스텁에 이름을 거기에 연결하는 것입니다. 그는 구현 클래스에 대해 아무것도 모릅니다. 그러나 스텁의 인스턴스를 보유하려면 해당 클래스의 CLASSPATH와 스텁이 종속 된 모든 응용 프로그램 클래스가 필요합니다. – EJP
이 문제를 해결합니다. 그러나 클라이언트를 실행할 때 비슷한 문제점이 있습니다. 스레드 "main"의 예외 java.rmi.ServerException : RemoteException이 서버 스레드에서 발생했습니다. 중첩 예외는 다음과 같습니다. \t java.rmi.UnmarshalException : 인수를 비 정렬 화하는 중 오류가 발생했습니다. 상자의 예외는 다음과 같습니다 \t java.lang.ClassNotFoundException가 : com.v3q6.ClientBootstrap.ClientImpl_Stub (NO Security Manager를 사용할 RMI 클래스 로더) \t sun.rmi.server.UnicastServerRef.dispatch (UnicastServerRef.java:353) 에서. .. ... 그 이유는 아마 내가 "UnicastRemoteObject.exportObject (클라이언트);" 이거 좀 생각해? –
스텁을 생성하려면 rmic을 다시 실행해야합니다. – UberAlex