1. 程式人生 > >Javac命令編譯時的類檔案依賴問題

Javac命令編譯時的類檔案依賴問題

目錄

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;
    但因為是JDK中的類,所以仍可以直接編譯

第二種情況:引入 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.javaB.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.javaB.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