Javac命令編譯時的類檔案依賴問題
阿新 • • 發佈:2019-01-06
目錄
Markdown版本筆記 | 我的GitHub首頁 | 我的部落格 | 我的微信 | 我的郵箱 |
---|---|---|---|---|
MyAndroidBlogs | baiqiantao | baiqiantao | bqt20094 | [email protected] |
javac命令 編譯
***
目錄
===
Javac命令編譯時的類檔案依賴問題
在使用原始的javac
編譯Java類檔案時,如果當前類檔案對其他類有依賴,那麼就可能會出現問題。
舉例如下:在桌面新建一個資料夾test,然後建立兩個類:A.java和B.java,兩個類的程式碼都很簡單,其中B類對A類有依賴:
import java.sql.Date;
public class A {
public static void i(Date date) {
System.out.println(date.toString());
}
}
import java.sql.Date; public class B { public static void i(String info) { Date date = new Date(System.currentTimeMillis()); A.i(date); } }
第一種情況
直接用javac命令編譯兩個原始檔,且先編譯 A.java
,結果如下:
C:\Users\baiqi>cd/d C:\Users\baiqi\Desktop\test
C:\Users\baiqi\Desktop\test>javac A.java
C:\Users\baiqi\Desktop\test>javac B.java
可以看到編譯成功,生成了對應的class檔案。
注意:
- 若在沒有編譯
A.java
情況下直接編譯B.java
,則會同時
生成A和B對應的class檔案。 - 雖然我們程式碼中匯入了
import java.sql.Date;
第二種情況:引入 jar 包
我們在B.java
中利用import語句匯入一個包:
import java.sql.Date;
import com.google.gson.Gson;
public class B {
public static void i(String info) {
Date date = new Date(System.currentTimeMillis());
System.out.println(new Gson().toJson(date));
A.i(date);
}
}
然後直接編譯B.java
:
C:\Users\baiqi\Desktop\test>javac B.java
B.java:2: 錯誤: 程式包com.google.gson不存在
import com.google.gson.Gson;
^
B.java:7: 錯誤: 找不到符號
System.out.println(new Gson().toJson(date));
^
符號: 類 Gson
位置: 類 B
2 個錯誤
可以看到,B.java
檔案編譯失敗,這是因為Gson並非Java標準類庫中的內容,因此編譯器找不到對應的包,就會出錯。
我們將需要的jar
檔案放入當前目錄,並使用-cp
引數將庫檔案匯入,然後繼續編譯:
C:\Users\baiqi\Desktop\test>javac -cp gson-2.8.1.jar B.java
B.java:8: 錯誤: 找不到符號
A.i(date);
^
符號: 變數 A
位置: 類 B
1 個錯誤
怎麼提示找不到 A 呢?
這是因為,預設情況下,編譯器會在當前目錄
下尋找需要的類檔案,但是如果我們使用cp
引數修改了類檔案查詢路徑,而並沒有包含當前目錄
,那麼就會編譯失敗。因為我們在使用cp
引數時,需要將當前目錄包含進去:
C:\Users\baiqi\Desktop\test>javac -cp gson-2.8.1.jar;. B.java
第三種情況:新增 package
我們在A.java
和B.java
檔案中新增package
語句:
package com.bqt.test;
import java.sql.Date;
public class A {
public static void i(Date date) {
System.out.println(date.toString());
}
}
package com.bqt.test;
import java.sql.Date;
public class B {
public static void i(String info) {
Date date = new Date(System.currentTimeMillis());
A.i(date);
}
}
然後我們將A.java
和B.java
放入相應的包中:
然後直接編譯B.java
(注意要指定相對或絕對路徑):
C:\Users\baiqi\Desktop\test>javac com\bqt\test\B.java
第四種情況:引入jar包並新增package
我們在上面第三種情況下再給B引入jar包:
package com.bqt.test;
import java.sql.Date;
import com.google.gson.Gson;
public class B {
public static void i(String info) {
Date date = new Date(System.currentTimeMillis());
System.out.println(new Gson().toJson(date));
A.i(date);
}
}
同樣,命令也結合以上兩種形式即可:
C:\Users\baiqi\Desktop\test>javac -cp gson-2.8.1.jar;. com\bqt\test\B.java
2019-1-6