Java命令行編譯文件時出現的錯誤,找不到符號或軟件包不存在等

裝載於http://blog.csdn.net/qq369201191/article/details/49946609

參考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爲我們設置好的幾個文件.settingsbinsrc.classpathproject,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
  • 1

案例二

D:\myeclipse\Workspaces\example\src>javac D:\myeclipse\Workspaces\example\src\com\example\model\*.java
  • 1

使用相對路徑

  • 相對路徑就是相對當前上下文環境,在命令行中就是相對命令行中前面的路徑。
  • 相對路徑不以/開頭,直接文件名。

如案例一,當前路徑在D:\myeclipse\Workspaces\example\src,相對這個路徑,Java文件的相對路徑就爲com/example/model/*.java。在案例二中當前路徑有變化,相應得Java文件的相對路徑也有變化。

案例一

D:\myeclipse\Workspaces\example\src>javac com/example/model/*.java
  • 1

案例二

D:\myeclipse\Workspaces\example>javac src/com/example/model/*.java
  • 1

基本概念已經理解了,上乾貨,一般命令行編譯出現的問題:

問題一:找不到符號或軟件包不存在

案例一

D:\myeclipse\Workspaces\example\src>javac com/example/controller/*.java
  • 1

這種情況下可以正常得進行編譯,因爲你自己不指定classpath,一般系統默認的classpath會在當前路徑中搜索。

案例二

D:\myeclipse\Workspaces\example>javac src/com/example/controller/*.java

報錯
src\com\example\controller\controller.java:3: 軟件包 com.example.model 不存在
  • 1
  • 2
  • 3
  • 4

我們切換目錄,已上文絕對路徑、相對路徑的知識,正確給出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
  • 1

加上參數-cp src,告訴編譯器可以去src中找,就不會有問題了。

同樣的,classpath可以是相對路徑,也可以是絕對路徑,本例中使用的是相對路徑,命令行換路徑後,所有參數都要換

D:\myeclipse\Workspaces>javac -cp example/src example/src/com/example/controller/*.java
  • 1

下面這個是用絕對路徑寫的,相對路徑和絕對路徑以下不再敘述

javac -cp D:\myeclipse\Workspaces\example\src example/src/com/example/controller/*.java
  • 1

問題二: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 錯誤
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

其實就一個問題,沒找到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 錯誤
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

細心的你會發現,問題變了,因爲我們引入了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
  • 1
  • 2

問題三:指定class文件存放位置

默認的情況下,class文件和java文件存放在一個目錄下,但你有沒有發現,eclipse編譯後會有兩個目錄,一個是src,存放的是用戶編輯的源代碼,定一個是bin文件,是編譯後的字節碼。它是加了-d選項。

D:\myeclipse\Workspaces\example\src>javac -d ../bin com/example/model/model.java
  • 1

這裏bin文件和src文件是同級(看實驗環境介紹),也是使用的是相對路徑。打開文件後可以發現在bin文件中生成了com/example/model/model.class具有層次結構的目錄。

到此我相信你已經能基本上解決編譯時的問題了。

總結

本文給出了幾個常見問題的解決方案,以上代碼都經過實驗過,不會有問題。命令行中我們要注意相對路徑和絕對路徑的差別,已經Linux下和Windows下分隔符的差別(Linux用冒號,Windows下用分號)。另外設置classpath時,一般都加上當前路徑.。

以上內容是博主查閱一些資料,並進行了總結,本來還想認真研讀一下官方文檔的,但因爲是全英文,而且很具體,還是放棄了。以後在碰到問題繼續完善好了。如果以上所述有問題,請及時指出,歡迎交流!

發佈了23 篇原創文章 · 獲贊 9 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章