2009-11-12 84 views
0

快速個人背景:我幾個月前被其他開發人員都是PHP開發人員的公司聘爲唯一.NET開發人員(C#)。工作一週後,我被告知他們想改用Java而不是.NET。不是一個理想的情況,但我試圖讓它工作。Java庫和類路徑問題

我不認爲我理解項目庫和類路徑之間的關係。我正在使用NetBeans 6.7.1進行開發。我目前的項目是創建一個應用程序,將更新多個商家來源(易趣,亞馬遜等)。我創建了一個處理這些更新計劃的類庫項目。我們將其稱爲更新。

我正在爲各種來源(例如eBay)創建類庫項目。我將ebay項目添加到更新項目作爲庫。在IDE中有一個框顯示「在類路徑上生成項目」,該項目被選中。

最後,現在我有了一個庫中引用的更新項目(使eBay的項目,現在2個庫深)以同樣的方式一點點控制檯應用程序。它適用於Update項目中的代碼。

這工作正常,直到我實例化ebay項目中的類(從更新項目通過控制檯應用程序)。在這一點上,我收到了

Exception in thread "main" 
java.lang.NoClassDefFoundError 

這是

Caused by: java.lang.ClassNotFoundException 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:200) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:188) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:307) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:252) 
    at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320) 

這些項目都建立罰款,但這種運行時異常是殺害我。我不知道我是否真的明白將項目庫添加​​到項目中的作用,以及是否還需要做更多的事情才能使課程更容易訪問。我習慣於能夠添加對DLL的引用並且很好。我不明白爲什麼我沒有得到任何編譯器錯誤或構建錯誤,但我得到有關可訪問性的運行時錯誤。我猜測classpath是一個我不明白的東西,儘管我認爲這個問題可能與其他東西完全相關。

回答

1

的解決方案,我想出現在:

我預計從嵌套庫提及「冒泡」。這顯然不適用於類路徑。我的結構基本上是:

A具有參考B的參考到C

當我跑了它工作得很好,直到它在C.了的東西我所做的是通過添加給予直接引用到C它作爲該項目的圖書館。從一些快速的Google搜索中,它看起來很像是如何將類路徑添加到NetBeans中的項目。

這對我來說似乎有點混亂,也許有更好的方法來做到這一點,但它現在已經解決了我的問題。感謝大家的回答 - 雖然沒有人精確地解決了我的特殊問題(你們讓我大概有95%的方法),但他們證實了我的想法,並使我能夠找出最後一點。

2

在Java中,與C#不同,您需要將類路徑顯式添加到項目中。我使用日食,我必須做到這一點,得到一些加載的引用的罐子。

3

我強烈建議您選擇Core Java第1卷和第2卷。它們對於想要了解語言內部(如ClassLoader)的Java開發人員必須讀取。至少,請閱讀課程加載。

要回答你的問題,Update項目應該生成.class文件或jar。您需要在您的類路徑中具有您引用它們的項目的類文件或jar的位置。根據您的IDE,對項目的引用可能只會讓您訪問源代碼,以進行編譯。

3

您需要將Java概念從IDE特定的概念中分離出來。我建議在跳入NetBeans之前,使用文本編輯器和命令shell通過簡單的java教程。

庫和項目是NetBeans的特定術語。我不是NetBeans用戶,所以我不會猜測他們是什麼,儘管我有一些猜測,但我會說他們的配置很可能會影響編譯時環境。

Classpath是一個核心的java概念。您必須在運行時將所有類(或包含這些類的jar)的路徑提供給java命令,以便它能夠加載這些類。(您還需要在編譯時針對您引用但目前不編譯的類執行javac命令)。

任何時間您看到java.lang.ClassNotFoundException,這意味着當您啓動運行時時,類路徑中缺少編譯代碼時出現在類路徑中的某個類。

1
Exception in thread "main" 
java.lang.NoClassDefFoundError 

類名中缺少的錯誤消息,但讓我們假設這是你想要執行main方法的類本身。在這種情況下,這意味着Java無法在運行時類路徑中找到特定的類。

爲了解決這個問題需要cd到其中類位於然後將包的根如下重新執行java命令:

java -cp . com.example.MainClass 

這裏-cp參數指定的類路徑。它只有一個值.這意味着當前的工作目錄應該被帶入類路徑(這通常是默認情況,但比沒有更安全)。

或者,你可以在-cp參數指定它的完整路徑,這樣就可以從任何地方執行它,例如:

java -cp /path/to/package/root com.example.MainClass 

這是最見於教程對於初學者,但通常不被使用的另一種替代方案由專業人士定義一個%CLASSPATH%環境變量,其中您準確地輸入了您想要在-cp參數中使用的值。然後java命令將查找它(只要您使用而不是使用-cp,-classpath-jar參數之一)。

如果輸入長命令會感到厭倦,您可以使用批處理或shell文件,以便您可以輕鬆管理它。

如果您有一個JAR文件或其他根文件夾文件夾,並且您想在程序中使用這些文件夾,那麼您需要將它們追加到類路徑中。在Windows上時,分隔符是分號;,在Linux上分隔符是:。更進一步,當路徑包含空格時,您需要引用特定的路徑。這裏是一個Windows的例子:

java -cp .;/path/to/package/root;"/spacy path/to/file.jar" com.example.MainClass 

希望這會有所幫助。

+0

感謝您的帖子。事實證明,這與NetBeans中的引用問題有關(請參閱我自己對此問題的回答)。我假設一個項目是自包含的(不正確的)假設 - 如果它自己設置了所有的引用,那麼使用該項目的任何東西都可以引用項目本身 - 而不需要引用所有的片斷,所引用的項目也是使用。 – 2009-11-12 20:27:01