업데이트 : 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를 올바르게 설정하지 않았습니까?
귀하의 충고를 크게 기쁘게 생각합니다. 감사!
어떻게 프로젝트를 제공 할 수 있습니까? 아마 그들을 확인하기 위해 우편 번호를? –
물론 여기 zip 파일이 있습니다 : http://www2.hawaii.edu/~bjpeter/RMI.zip. 나는 또한 소스 코드도 포함시켰다. –