Java命令列編譯檔案時出現的錯誤,找不到符號或軟體包不存在等
標籤(空格分隔): Java
參考http://stackoverflow.com/questions/6665420/package-does-not-exist-error
參考http://docs.oracle.com/javase/7/docs/technotes/tools/windows/javac.html
配套代碼上傳在:http://download.csdn.net/detail/qq369201191/9287185
習慣了eclipse的自動編譯,Java命令列編譯、執行檔案只會最基礎的部分,就是對單檔案的編譯和執行,而且不包含任何外部JAR包。但有時候你還非得用命令列,會碰到一些問題,博主這裡給出幾種常見的問題及解決方案。 實驗環境介紹
eclipse 的工作目錄在D:\myeclipse\Workspaces,裡面有我們的一個工程example,點進去,eclipse為我們設定好的幾個檔案.settings、bin、src、.classpath、project,src中存放的是原始碼,結構就如上圖所示。
在eclipse匯入後顯示的結構如下圖所示,
小提示:包名com.example.controller指的是在src/com/example/controller檔案夾下有個controller.java檔案
model.java是一個獨立的類,不匯入任何外部包
controller.java匯入了com.example.model.model
view.java匯入了com.example.controller.controller和調用了一個外部Jar包
在觀察案例代碼時,需要特別注意此時命令列的目前的目錄,選項參數和Java檔案,會有不同的結果 使用絕對路徑
絕對路徑就是從根目錄開始的路徑,Windows下就是以盤符開頭,如”C:\”,Linux下以斜杠開頭/home。
使用絕對路徑的好處就是不管命令列的當前路徑在哪裡,都能正確的進行編譯
案例一
D:\myeclipse\Workspaces\example>javac D:\myeclipse\Workspaces\example\src\com\example\model\*.java
案例二
D:\myeclipse\Workspaces\example\src>javac D:\myeclipse\Workspaces\example\src\com\example\model\*.java
使用相對路徑 相對路徑就是相對當前上下文環境,在命令列中就是相對命令列中前面的路徑。 相對路徑不以/開頭,直接檔案名稱。
如案例一,當前路徑在D:\myeclipse\Workspaces\example\src,相對這個路徑,Java檔案的相對路徑就為com/example/model/*.java。在案例二中當前路徑有變化,相應得Java檔案的相對路徑也有變化。
案例一
D:\myeclipse\Workspaces\example\src>javac com/example/model/*.java
案例二
D:\myeclipse\Workspaces\example>javac src/com/example/model/*.java
基本概念已經理解了,上乾貨,一般命令列編譯出現的問題: 問題一:找不到符號或軟體包不存在
案例一
D:\myeclipse\Workspaces\example\src>javac com/example/controller/*.java
這種情況下可以正常得進行編譯,因為你自己不指定classpath,一般系統預設的classpath會在當前路徑中搜尋。
案例二
D:\myeclipse\Workspaces\example>javac src/com/example/controller/*.java報錯src\com\example\controller\controller.java:3: 軟體包 com.example.model 不存在
我們切換目錄,已上文絕對路徑、相對路徑的知識,正確給出Java檔案的路徑。這時會報出錯誤,軟體包com.xxx不存在。因為在controller.java檔案中有一個import com.example.model.model,根據系統預設的classpath會在當前路徑下找,即D:\myeclipse\Workspaces\example,很明顯這個路徑下沒有com檔案。
解決方案,我們告訴編譯器哪個目錄下會有就行了,所以需要加入選項-cp xxxx 或 -classpath xxxx
D:\myeclipse\Workspaces\example>javac -cp src src/com/example/controller/*.java
加上參數-cp src,告訴編譯器可以去src中找,就不會有問題了。
同樣的,classpath可以是相對路徑,也可以是絕對路徑,本例中使用的是相對路徑,命令列換路徑後,所有參數都要換
D:\myeclipse\Workspaces>javac -cp example/src example/src/com/example/controller/*.java
下面這個是用絕對路徑寫的,相對路徑和絕對路徑以下不再敘述
javac -cp D:\myeclipse\Workspaces\example\src example/src/com/example/controller/*.java
問題二:JAR包怎麼引入
首先還是在eclipse調通,建議專門建立一個lib檔案,然後把JAR包全部放在這裡面,對項目轉移也比較方便。
案例一
D:\myeclipse\Workspaces\example\src>javac com/example/view/view.java錯誤com\example\view\view.java:4: 軟體包 com.google.gson 不存在import com.google.gson.Gson; ^com\example\view\view.java:14: 找不到符號符號: 類 Gson位置: 類 com.example.view.view Gson gson = new Gson(); ^com\example\view\view.java:14: 找不到符號符號: 類 Gson位置: 類 com.example.view.view Gson gson = new Gson(); ^3 錯誤
其實就一個問題,沒找到JAR包。引入JAR就是注意要把路徑寫到JAR包的具體位置。廢話少說,給出例子:
案例二
D:\myeclipse\Workspaces\example\src>javac -cp lib/gson-2.3.1.jar com/example/view/view.java錯誤com\example\view\view.java:3: 軟體包 com.example.controller 不存在import com.example.controller.controller; ^com\example\view\view.java:10: 找不到符號符號: 類 controller位置: 類 com.example.view.view new controller(); ^2 錯誤
細心的你會發現,問題變了,因為我們引入了JAR包,所以因為JAR找不到的GSON問題已經沒了,現在的問題就是找不到com.xxxx,就變成問題一。這裡解釋一下,我們加入-cp xxxx或-classpath xxxx之後,會覆蓋系統中的classpath,案例二這麼寫的確可以找到GSON類,但在碰到import com.example.model.model時還在lib/gson-2.3.1.jar檔案中查當然是找不到了,所以報錯。方法很簡單,在增加一個com.xxxx檔案夾的路徑,沒錯就是當前路徑。所以加上.;lib/gson-2.3.1.jar。現在你是否對一開始配置Java環境時候,classpath中的路徑要.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar有了理解呢。
特別注意的是在Linux下用冒號:進行分隔,而在Windows用分號進行分割。
案例三
正確D:\myeclipse\Workspaces\example\src>javac -cp .;lib/gson-2.3.1.jar com/example/view/view.java
問題三:指定class檔案存放位置
預設的情況下,class檔案和java檔案存放在一個目錄下,但你有沒有發現,eclipse編譯後會有兩個目錄,一個是src,存放的是使用者編輯的原始碼,定一個是bin檔案,是編譯後的位元組碼。它是加了-d選項。
D:\myeclipse\Workspaces\example\src>javac -d ../bin com/example/model/model.java
這裡bin檔案和src檔案是同級(看實驗環境介紹),也是使用的是相對路徑。開啟檔案後可以發現在bin檔案中產生了com/example/model/model.class具有階層的目錄。
到此我相信你已經能基本上解決編譯時間的問題了。 總結
本文給出了幾個常見問題的解決方案,以上代碼都經過實驗過,不會有問題。命令列中我們要注意相對路徑和絕對路徑的差別,已經Linux下和Windows下分隔字元的差別(Linux用冒號,Windows下用分號)。另外設定classpath時,一般都加上當前路徑.。
以上內容是博主查閱一些資料,並進行了總結,本來還想認真研讀一下官方文檔的,但因為是全英文,而且很具體,還是放棄了。以後在碰到問題繼續完善好了。如果以上所述有問題,請及時指出,歡迎交流。