標簽(空格分隔): Javajavascript
習慣了eclipse的自動編譯,Java命令行編譯、執行文件只會最基礎的部分,就是對單文件的編譯和執行,并且不包含任何外部JAR包。但有時候你還非得用命令行,會碰到一些問題,博主這里給出幾種常見的問題及解決方法。html
實驗環境介紹
eclipse 的工做目錄在D:\myeclipse\Workspaces,里面有咱們的一個工程example,點進去,eclipse為咱們設置好的幾個文件.settings、bin、src、.classpath、project,src中存放的是源代碼,結構就如上圖所示。java
在eclipse導入后顯示的結構以下圖所示,
小提示:包名com.example.controller指的是在src/com/example/controller文件夾下有個controller.java文件python
model.java是一個獨立的類,不導入任何外部包
controller.java導入了com.example.model.model
view.java導入了com.example.controller.controller和調用了一個外部Jar包linux
在觀察案例代碼時,須要特別注意此時命令行的當前目錄,選項參數和Java文件,會有不一樣的結果objective-c
使用絕對路徑
絕對路徑就是從根目錄開始的路徑,Windows下就是以盤符開頭,如”C:\”,Linux下以斜杠開頭/home。sql
使用絕對路徑的好處就是無論命令行的當前路徑在哪里,都能正確的進行編譯windows
案例一
D:\myeclipse\Workspaces\example>javac D:\myeclipse\Workspaces\example\src\com\example\model\*.java
1
1
案例二
D:\myeclipse\Workspaces\example\src>javac D:\myeclipse\Workspaces\example\src\com\example\model\*.java
1
1
使用相對路徑
相對路徑就是相對當前上下文環境,在命令行中就是相對命令行中前面的路徑。
相對路徑不以/開頭,直接文件名。
如案例一,當前路徑在D:\myeclipse\Workspaces\example\src,相對這個路徑,Java文件的相對路徑就為com/example/model/*.java。在案例二中當前路徑有變化,相應得Java文件的相對路徑也有變化。
案例一
D:\myeclipse\Workspaces\example\src>javac com/example/model/*.java
1
1
案例二
D:\myeclipse\Workspaces\example>javac src/com/example/model/*.java
1
1
基本概念已經理解了,上干貨,通常命令行編譯出現的問題:
問題一:找不到符號或軟件包不存在
案例一
D:\myeclipse\Workspaces\example\src>javac com/example/controller/*.java
1
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
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
1
加上參數-cp src,告訴編譯器能夠去src中找,就不會有問題了。
一樣的,classpath能夠是相對路徑,也能夠是絕對路徑,本例中使用的是相對路徑,命令行換路徑后,全部參數都要換
D:\myeclipse\Workspaces>javac -cp example/src example/src/com/example/controller/*.java
1
1
下面這個是用絕對路徑寫的,相對路徑和絕對路徑如下再也不敘述
javac -cp D:\myeclipse\Workspaces\example\src example/src/com/example/controller/*.java
1
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
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
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
1
2
問題三:指定class文件存放位置
默認的狀況下,class文件和java文件存放在一個目錄下,但你有沒有發現,eclipse編譯后會有兩個目錄,一個是src,存放的是用戶編輯的源代碼,定一個是bin文件,是編譯后的字節碼。它是加了-d選項。
D:\myeclipse\Workspaces\example\src>javac -d ../bin com/example/model/model.java
1
1
這里bin文件和src文件是同級(看實驗環境介紹),也是使用的是相對路徑。打開文件后能夠發如今bin文件中生成了com/example/model/model.class具備層次結構的目錄。
到此我相信你已經能基本上解決編譯時的問題了。
總結
本文給出了幾個常見問題的解決方案,以上代碼都通過實驗過,不會有問題。命令行中咱們要注意相對路徑和絕對路徑的差異,已經Linux下和Windows下分隔符的差異(Linux用冒號,Windows下用分號)。另外設置classpath時,通常都加上當前路徑.。
以上內容是博主查閱一些資料,并進行了總結,原本還想認真研讀一下官方文檔的,但由于是全英文,并且很具體,仍是放棄了。之后在碰到問題繼續完善好了。若是以上所述有問題,請及時指出,歡迎交流!