2016-02-28 44 views
1

讓我們考慮這樣的目錄結構:javac的錯誤:包com.myproject.planets不存在

C:\Tests>tree /F 
C:. 
│ GreetingsUniverse.java 
│ 
└───planets 
     Earth.java 
     Jupiter.java 

地球和木星有com.myproject.planets package,GreetingsUniverse具有com.myproject包。

javac的編譯失敗GreetingsUniverse.java

C:\Tests>javac -cp "C:\Tests\planets" GreetingsUniverse.java 
GreetingsUniverse.java:3: error: package com.myproject.planets does not exist 
import com.myproject.planets.Earth; 
          ^
GreetingsUniverse.java:4: error: package com.myproject.planets does not exist 
import com.myproject.planets.Jupiter; 
          ^
GreetingsUniverse.java:19: error: cannot find symbol 
     new Earth(); 
      ^
    symbol: class Earth 
    location: class GreetingsUniverse 
GreetingsUniverse.java:20: error: cannot find symbol 
     new Jupiter(); 
      ^
    symbol: class Jupiter 
    location: class GreetingsUniverse 
4 errors 

而另一個嘗試:

C:\Tests>javac -cp "C:\Tests\planets\" GreetingsUniverse.java 
javac: no source files 
Usage: javac <options> <source files> 
use -help for a list of possible options 

爲什麼它不編譯?類必須放在與包相同的目錄結構中嗎?所以木星應該放置在C:\ Tests \ com \ myproject \ planets \ Jupiter.java或者還有其他問題?

+0

很簡單:目錄結構應該與包結構匹配。如果一個類在'com.myproject.planets'包中,那麼它的源文件應該在'com/myproject/planets'文件夾中。 'cp'選項應該包含jar文件和包樹的根目錄。 –

回答

1

最佳做法是在項目目錄中包含「src」子目錄。然後,按照行業標準,創建「main \ java」子目錄。然後把裏面的目錄嚴格對應於包結構(這是強制性的)。然後,如果你真的想從命令行編譯,與-cp指定「src」目錄:

C:. 
└───src 
    └───main 
     └───java 
       └───com 
        └───myproject 
         └───planets 
            Jupiter.class 
            Jupiter.java 

c:\temp\project>javac -cp src\main\java src\main\java\com\myproject\planets\Jupiter.java 

注意,包名必須相對於類路徑的路徑完全一致,所以在我的例子中,包聲明package com.myproject.planets,不是src.com.myproject.planets。如果不遵守這個規定,將會導致類似你的問題。

如果你有像jp.co.ourcompany.ourdepartment.ourproject.ourpackage.oursubpackage這樣的深層包裝結構,遵循這個規則可能會變得很麻煩,但不幸的是,這是無法解決的。

擁有「src \ main \ java」內部的源代碼具有被行業標準構建工具(如Maven和Gradle)支持的優勢。你甚至不必告訴他們你的來源是什麼:約定優於配置等等。

+0

最好的做法是使用像src/main/java,src/test/java,src/main/resources等等的企業標準包結構,這通過使用像maven,gradle這樣的構建工具來實現。這些工具將採取我們的包裝和編譯問題。 –

+0

@Praveen,編輯。 –

0
c:\javac -cp c:\;c:\Tests\;c:\Tests\planets GreetingsUniverse.java