2009-10-02 4 views
2

Java rmi를 사용하여 간단한 프로젝트를 작성하고 실행 가능한 jar 파일로 내 보냈습니다. 내가 그것을 실행하려고 할 때, 때로는 예외가 발생하고 때때로 작동합니다. -Djava.rmi.server.codebase = file : serverClasses /를 지정하면 올바르게 jar 파일을 만들지 못했던 것 같습니다.rmi 클래스에서 예외를 찾을 수 없습니다.

java.rmi.ServerException: RemoteException occurred in server thread; nested exception is: 
    java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is: 
    java.lang.ClassNotFoundException: com.ServerBootstrap.IServer 
    at sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:413) 
    at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:267) 
    at sun.rmi.transport.Transport$1.run(Transport.java:177) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at sun.rmi.transport.Transport.serviceCall(Transport.java:173) 
    at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:553) 
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:808) 
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:667) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603) 
    at java.lang.Thread.run(Thread.java:636) 
    at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(StreamRemoteCall.java:273) 
    at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:251) 
    at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:377) 
    at sun.rmi.registry.RegistryImpl_Stub.rebind(Unknown Source) 
    at java.rmi.Naming.rebind(Naming.java:177) 
    at com.v3q6.eece411.A2.ServerBootstrap.ChatRoomServer.main(ChatRoomServer.java:37) 
Caused by: java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is: 
    java.lang.ClassNotFoundException: com.ServerBootstrap.IServer 
    at sun.rmi.registry.RegistryImpl_Skel.dispatch(Unknown Source) 
    at sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:403) 
    at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:267) 
    at sun.rmi.transport.Transport$1.run(Transport.java:177) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at sun.rmi.transport.Transport.serviceCall(Transport.java:173) 
    at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:553) 
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:808) 
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:667) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603) 
    at java.lang.Thread.run(Thread.java:636) 
Caused by: java.lang.ClassNotFoundException: com.ServerBootstrap.IServer 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:217) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:205) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:323) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:268) 
    at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:336) 
    at java.lang.Class.forName0(Native Method) 
    at java.lang.Class.forName(Class.java:264) 
    at sun.rmi.server.LoaderHandler.loadProxyInterfaces(LoaderHandler.java:728) 
    at sun.rmi.server.LoaderHandler.loadProxyClass(LoaderHandler.java:672) 
    at sun.rmi.server.LoaderHandler.loadProxyClass(LoaderHandler.java:609) 
    at java.rmi.server.RMIClassLoader$2.loadProxyClass(RMIClassLoader.java:646) 
    at java.rmi.server.RMIClassLoader.loadProxyClass(RMIClassLoader.java:311) 
    at sun.rmi.server.MarshalInputStream.resolveProxyClass(MarshalInputStream.java:255) 
    at java.io.ObjectInputStream.readProxyDesc(ObjectInputStream.java:1548) 
    at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1510) 
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1749) 
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1346) 
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:368) 
    ... 12 more 

그것은 코드베이스를 인식하지 못하는 프로그램을 보인다 다음은 스택 트레이스입니다. 제 경우에는 모든 파일이 로컬입니다. 누구가 문제인지 아는 사람 있습니까? 덕분에

답변

3

com.ServerBootstrap.IServer 클래스를 포함하는 JAR 파일의 이름을 코드베이스에 명시 적으로 지정하십시오.

-Djava.rmi.server.codebase=file:serverClasses/myjarfile.jar 

는 "Dynamic code downloading using JavaTM RMI (Using the java.rmi.server.codebase Property)는"문서는 코드베이스의 사용과 사양에 대한 옵션에 대한 자세한 정보를 제공합니다.

+0

작동합니다! 매번 이것을 추가하지 않아도되도록 어딘가에 설정할 수 있습니까? –

+0

@CKeven : 'System.getProperties(). setProperty (name, value)'...를 사용하여 똑같은 작업을 수행 할 수 있습니다. –

+0

나는 이것을 정말로 어떻게하는지 모른다. 너는 나에게 명시 적으로 말해 줄 수 있니? thanks –

0

완전한 스택 추적이 아니며, 문제의 근본 원인을 보여주는 부분을 생략했을 수도 있습니다.

올바르게 기억한다면 ClassNotFoundException은로드되는 클래스의 정적 초기화 또는 클래스가 종속되어있는 일부 클래스에서 예외가 발생하여 때로는 발생할 수 있습니다. 이 경우 다음 중첩 수준에서 문제의 첫 번째 스택 추적에 중첩 예외로 표시됩니다. 응용 프로그램에서 시도한 클래스로드가 반복 될 경우 초기화 예외가 결과 스택 추적에없는 것을 (아마도 잘못 알고있는 것) 기억합니다.

편집 : 스택 트레이스에 내 이론이 올바르지 않다고 나와 있습니다.

+0

나는 그저 모두 올려 놓았다. Thx –

0

java.rmi.server.codebase에 지정된 상대 경로를 사용하여 클라이언트를 시작할 때 올바른 디렉토리 ("serverClasses"의 상위 디렉토리)에 있는지 확인하십시오. 이것이 어렵다면 코드베이스의 절대 경로가 더 신뢰할 수 있습니다.

또한 -jar 옵션을 사용하여 실행하면 -classpath 옵션이 완전히 무시됩니다. 나는 그것이 여기에 문제라고 생각하지 않는다. RMIClassLoader은 여전히 ​​서버의 코드베이스 설정을 사용하여 작동 할 수 있어야합니다. 그러나 클래스 패스에 지정된 추가 클래스에 대한 액세스 권한이있는 클라이언트에 의존하는 경우에는 작동하지 않습니다. 기본 JAR 파일의 매니페스트에서 Class-path 속성을 사용해야합니다.

+0

이상한 것은 프로그램이 jar 파일에서 클래스를 올바르게 인식하지 못한다는 것입니다. 왜 그런지 아십니까? –