2012-06-30 4 views
0

업데이트 : Here이 프로젝트입니다. Java RMI 및 NoClassDefFoundError

나는 다음과 같은 디렉토리 구조 한 :

RMI 
    | 
    api.jar 
     |--> org.examples.rmi.api.Pi 
     |--> org.examples.rmi.api.Task 
     |--> org.examples.rmi.api.Compute 
    client.jar 
     |--> org.examples.rmi.client.ComputePi 
    server.jar 
     |--> org.examples.rmi.server.ComputeEngine 
     |--> org.examples.rmi.api.Pi 
     |--> org.examples.rmi.api.Task 
     |--> org.examples.rmi.api.Compute 

내가 내 서버를 시작하려면 다음 명령을 입력 :

C:\Users\Public\RMI>java -cp api.jar -jar -Djava.rmi.server.codebase="file:/C:/Users/Public/RMI/api.jar" -Djava.security.policy=client.policy client.jar 127.0.0.1 45 
:

C:\Users\Public\RMI\server>set CLASSPATH= 
C:\Users\Public\RMI\server>start rmiregistry 
C:\Users\Public\RMI\server>java -Djava.rmi.server.codebase="file:/C:/Users/Public/RMI/compute.jar" -Djava.rmi.server.hostname=127.0.0.1 -Djava.security.policy=server.policy org.examples.rmi.engine.ComputeEngine 

그때 나는 나의 클라이언트를 시작하려면이 명령을 입력

하지만 다음 오류가 발생합니다.

Exception in thread "main" java.lang.NoClassDefFoundError: org/examples/rmi/api/Task 
     at java.lang.Class.getDeclaredMethods0(Native Method) 
     at java.lang.Class.privateGetDeclaredMethods(Unknown Source) 
     at java.lang.Class.getMethod0(Unknown Source) 
     at java.lang.Class.getMethod(Unknown Source) 
     at sun.launcher.LauncherHelper.getMainMethod(Unknown Source) 
     at sun.launcher.LauncherHelper.checkAndLoadMain(Unknown Source) 
Caused by: java.lang.ClassNotFoundException: org.examples.rmi.api.Task 
     at java.net.URLClassLoader$1.run(Unknown Source) 
     at java.net.URLClassLoader$1.run(Unknown Source) 
     at java.security.AccessController.doPrivileged(Native Method) 
     at java.net.URLClassLoader.findClass(Unknown Source) 
     at java.lang.ClassLoader.loadClass(Unknown Source) 
     at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) 
     at java.lang.ClassLoader.loadClass(Unknown Source) 
     ... 6 more 

그러나 api 패키지의 세 클래스를 client.jar 파일에 추가하면 클라이언트가 작동합니다.

classpath를 api.jar로 설정하더라도 server.jar 파일에서 동일한 세 클래스를 제거하면 동일한 NoClassDefFoundError를 얻습니다.

C:\Users\Public\RMI>java -cp api.jar -jar -Djava.rmi.server.hostname=127.0.0.1 -Djava.rmi.server.codebase="file:/C:/Users/Public/RMI/api.jar" -Djava.security.policy=server.policy server.jar 

api 패키지에 3 개의 클래스를 여러 곳에 배치하고 싶지 않습니다. 나는 api.jar 파일에서 한 곳에 보관하고 싶습니다. 명령 줄에서 classpath를 올바르게 설정하지 않았습니까?

귀하의 충고를 크게 기쁘게 생각합니다. 감사!

+0

어떻게 프로젝트를 제공 할 수 있습니까? 아마 그들을 확인하기 위해 우편 번호를? –

+0

물론 여기 zip 파일이 있습니다 : http://www2.hawaii.edu/~bjpeter/RMI.zip. 나는 또한 소스 코드도 포함시켰다. –

답변

2

-jar 옵션을 사용하면 -cp 인수가 무시됩니다. client.jar의 Manifest에있는 Class-Path 옵션을 사용하여 client.jar을 api.jar에 연결해야합니다.

+0

감사! 나는 지금 일하고있다. –