Java命令列編譯檔案時出現的錯誤,找不到符號或軟體包不存在等__Java

來源:互聯網
上載者:User
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時,一般都加上當前路徑.。

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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.