更新: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\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
然後我輸入這個命令來啓動我的客戶:
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
但我得到以下錯誤:
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文件中,則客戶端工作。
如果我刪除server.jar文件中的相同三個類,即使將類路徑設置爲api.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包中的多個地方。我只想把它們放在api.jar文件的一個地方。我沒有正確設置命令行上的類路徑嗎?
您的建議將不勝感激。謝謝!
你能介紹一下如何提供這個項目嗎?也許一個zip來檢查他們? –
當然,這裏是zip文件:http://www2.hawaii.edu/~bjpeter/RMI.zip。我還包括了源代碼。 –