2016-03-23 53 views
2

我正在學習java包。我成功創建了包含單個.class文件Hello.class的軟件包。現在我想將另一個類文件添加到同一個包中。我將新的java類命名爲Goodbye.java,並將其編譯到相同的目錄「pack」中,通過添加類到包

javac -d ./bin Goodbye.java 

命令。 bin目錄包含包目錄。 該I經由

javac -cp ./bin test.java 

命令編譯包含主函數test.java文件。編譯工作正常。但是當我輸入時

java test 

命令。我得到

Hello, world 
Exception in thread "main" java.lang.NoClassDefFoundError: pack/Goodbye 
at test.main(test.java:9) 
Caused by: java.lang.ClassNotFoundException: pack.Goodbye 
at java.net.URLClassLoader$1.run(URLClassLoader.java:366) 
at java.net.URLClassLoader$1.run(URLClassLoader.java:355) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.net.URLClassLoader.findClass(URLClassLoader.java:354) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:425) 
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:358) 
... 1 more 

任何人都可以解釋我在這種情況下做錯了什麼嗎?我正在研究ubuntu 14.04並在終端中做所有事情。

兩個Hello.java和Goodbye.java文件位於

/home/username/apps/src 

目錄。對應的類文件在裏面

/home/username/apps/bin/pack 

目錄。包目錄由

創建
javac -d ./bin 

命令。 Hello.java文件的內容

package pack; 
public class Hello 
{ 
    public static void HelloMessage() 
    { 
     System.out.println("hello, world"); 
    } 
} 

它工作正常。對於其對應的類文件被加載Goodbye.java文件 內容是進口包位於/家/用戶名

package pack; 
public class Goodbye 
{ 
    public static void message() 
    { 
     System.out.println("bye"); 
    } 
} 

test.java文件/ apps目錄。它具有以下幾行代碼

import pack.*; 
public class test 
{ 
    public static void main(String args[]) 
    { 
     Hello.HelloMessage(); 
     Goodbye.message(); 
    } 
} 

任何幫助,高度讚賞。

+0

但是,爲什麼不使用IDE?這會讓你的工作更輕鬆。 – Hackerdarshi

+0

我有C++背景,習慣了終端。我不喜歡IDE的未知共振 –

+0

我認爲,這是很好的想知道,它是如何真正在命令行工作。這最終會提供更深入的理解,即使在以後只使用IDE時也是如此。 – vanje

回答

1

我的類文件的理解,就像下面的樹:

/home/username/apps/bin 
        | 
        +-- pack 
        |  | 
        |  +--- Hello.class 
        |  | 
        |  +--- Goodbye.class 
        | 
        +-- test.class 

然後去/home/username/apps/bin並調用

java -cp . test 

隨着-cp添加當前目錄下搜索類。這應該始終是你的軟件包的根源。然後參考你的主類。

順便說一句:根據Java naming conventions,類名應以大寫字母開頭,如Test

更新:更新了類文件位置。

+0

不,測試是一個獨立的.java文件,它位於 –

+0

之上的一個目錄@olzhabala:我更新了我的答案。 – vanje

+0

偉大的人!非常感謝你! –

0

你需要設置的兩個位置的類路徑,因爲你必須在兩個不同的地點類文件:

  1. /家/用戶名/應用/(在此位置獲得的Test.class)
  2. /家/ username/apps/src/bin(pack.Hello.class和pack.Goodbye.class在此位置可用)

可以使用javac命令的-cp選項執行此操作。您需要在如下的多個類路徑之間放置分號:

java -cp .;./bin test 
+0

錯誤地理解錯誤的文件夾結構。另外我寫了javac而不是java命令。 我能看到的問題是所有必需的類都不在classpath中。 使用java命令的-cp選項指定所有類的路徑。 – kamal