2012-06-30 95 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\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文件的一個地方。我沒有正確設置命令行上的類路徑嗎?

您的建議將不勝感激。謝謝!

+0

你能介紹一下如何提供這個項目嗎?也許一個zip來檢查他們? –

+0

當然,這裏是zip文件:http://www2.hawaii.edu/~bjpeter/RMI.zip。我還包括了源代碼。 –

回答

2

當您使用-jar選項時,-cp參數被忽略。您應該使用client.jar的清單中的Class-Path選項將client.jar連接到api.jar。

+0

謝謝!我現在開始工作了。 –