2009年6月18日 星期四
Ubuntu底下執行java的小問題
改寫了metasearch取資料部分的程式
這次了解了幾個問題
首先
改版後的程式~把一些主要的變數和程序~用static的方式宣告
這樣在執行過程中~這些變數和程序會一直在記憶體中
一方面使用上較方便~另一方面變數可以達到共用的效果
第一件了解到的事是...
之前的程式
在ubuntu server上compile時~都會因為package的關係~而產生錯誤
但這次為了達到變數共享的效果(不同類別中的程式存取同樣的變數)
package似乎不能拿掉
了解到package的功能跟C#的namespace的功能是一樣的之後
我想到~之前或許是因為我們使用的package~卻沒把程式放在同樣名稱的資料夾下
所以才會出錯..
另外
之前有研究過~在用php執行java程式時
是否能把java的程式放在同一資料夾~而正常執行
這次在無意間改寫classpath~意外的發現~是可以的
如:
java -cp .:/usr/lib/jvm/java-6-sun/lib:/usr/share/java/mysql.jar:/home/canlab/metasearch/wjm/websource_api Main
最後一段路徑/home/canlab/metasearch/wjm/websource_api只要指向放java程式的資料夾~似乎就可以了
但~前提似乎是在沒有使用package的情況下
最後
這次~困擾我最久的~就是以下的錯誤訊息
Exception in thread "main" java.lang.NoClassDefFoundError: Main (wrong name: testtest/Main)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:620)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:124)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:260)
at java.net.URLClassLoader.access$000(URLClassLoader.java:56)
at java.net.URLClassLoader$1.run(URLClassLoader.java:195)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:276)
at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)
類似的訊息出現了不下n次
從一開始什麼都不懂~
靠著學長的教導~
才有以下使用長長的classpath的程式碼產生
java -cp .:/usr/lib/jvm/java-6-sun/lib:/usr/share/java/mysql.jar:/home/canlab/metasearch/wjm/websource_api Main
但這次使用package名稱websource_api的程式
無論我再怎樣改classpath~都無法讓錯誤訊息消失
看了錯誤訊息~明知道一定是classpath的問題~就是改不出來
最後
突發奇想的...改成這樣...
java -cp .:/usr/lib/jvm/java-6-sun/lib:/usr/share/java/mysql.jar:/home/canlab/metasearch/wjm/ websource_api.Main
終於可以了
雖然不是完全懂為什麼
訂閱:
張貼留言 (Atom)
沒有留言:
張貼留言