對新手來講,一個Java工程內部的多個文件夾經常會讓大家困惑。更可惡的是莫名其妙的路徑問題,在Eclipse編寫Java程序中,出現頻率最高的錯誤很可能就是路徑問題。
這些問題原因其實都是一個,就是關于Java工程內的文件結構理解不清,雖然我也不是老手,但有一些經驗,拿來和大家分享:
eclipse的基本工程目錄叫做workspace,每個運行時的eclipse實例只能對應一個workspace,也就是說,workspace是當前工作的根目錄。我們在workspace中可以隨意創建各種java相關的工程,普通的java應用,java web應用,web service應用等,我們僅拿普通的java application來說明。
通常我們創建一個java application工程,會創建一個工程目錄,假設工程名稱為:TestProject,那么在當前的workspace里講創建一個目錄名為TestProject,同時我們選擇src作為源碼文件夾,bin作為輸出路徑,這樣就構成了一個基本的java application工程。,在workspace中存在如下文件夾:
+workspace
+TestProject
-src
-bin
這個時候我們創建的代碼將寫入src目錄,輸出的class文件將存在于bin目錄。
(對于新手來說,區分src目錄和bin目錄很重要,通常情況下,src目錄只存放源代碼,而所有工程相關的其他輸出文件都會存放在bin目錄下,最為重 要的是:用Eclipse進行打包時根目錄就是bin,用jar包調用工程的時候默認的路徑也要以bin為準,到bin的層級數目就是最終的數目,因此可 以說bin是最為重要的目錄,而不是src)
這時候我們在src目錄下創建一個類,就叫做TestClass,里面有一個main方法如下:
Java代碼
public static voidmain(String[] args){
System.out.println(new File("test.txt").exist());
}
同時在src目錄下創建一個空的文件test.txt。什么都不要做,保存工程,打開資源管理器,我們來查看workspace/TestProject/bin目錄,下面會存在兩個文件:TestClass.class和test.txt。
此時我們設想,程序的內容就是檢查test.txt文件是否存在,按照現在的目錄規劃,我們認為,在控制臺上將打出“true”,ok,我們回到eclipse中,運行TestClass這個類。控制臺輸出了:false!
為什么我們得到了并非我們預期的結果呢?先別著急,我們打開windows的命令行界面(或者linux的shell都ok),將目錄切換到workspace/TestProject/bin目錄下,執行如下命令java TestClass,看看出現什么結果?true!對,就是true。
為啥同樣的程序會有不同的結果呢?這個答案很簡單,就出在java.exe本身的一個參數-cp(classpath)上!
eclipse默認的classpath包括三個部分:
1、jdk的bin目錄;
2、工程引用的所有其他jar包路徑
3、工程根路徑(對,不是bin路徑)
那么我們就可以理解來,在classpath的根路徑中并不存在這個test.txt文件,用相對路徑描述,這個文件實際存在于src/test.txt 和bin/test.txt。也就是說,classpath默認的路徑是workspace-testproject下,而不是workspace- testproject-bin下,所以才找不到這個文件。這是經常出現的問題!
那么這個時候就有疑問了,如果我們打包發布工程,是不是jar包中會把testproject根目錄作為包中的根目錄呢?幸運的是,eclipse考慮好 了這個問題。通過eclipse的導出jar能力,bin目錄會作為jar的根目錄,而不是bin的上層的工程目錄,這樣類的包路徑就是正確的,同時,工 程目錄下的資源文件、配置文件等也被拷貝到這里,也就是相當于把工程目錄下的這些文件拷貝到來bin目錄后再打包,這樣文件的相對路徑也就符合默認的 classpath了。
從上面可以總結出來:Eclipse直接運行時,是以工程的根目錄作為基準目錄。而打包成jar運行時,則是以bin目錄作為基準目錄。這兩者相差了一級目錄,如果理解的不好,可能會導致錯誤。希望大家注意!