Java 命令行 編譯、執行、打包


Java 命令行 編譯、執行、打包

一般來說 IDE 或項目管理工具打包很方便。
我遇到了不能使用任何開發工具的情況,簡單記錄一下相關操作,不做深入探討。

環境

linux
jdk 1.8

簡單的編譯執行

# 測試目錄
cd /usr/local/mytest

創建文件 src/com/demo/Hello.java

package com.demo;

public class Hello {
    public static void main(String[] args) {
        System.out.println("hello");
    }
}

看下目錄結構

編譯,生成 class 文件

javac src/com/demo/Hello.java

下面的截圖可以看到,在 java 文件同級目錄,生成了 class 文件

執行

# -cp src 這個參數是把 src 目錄添加到 classpath 目錄
java -cp src com.demo.Hello

打包

打包只應當包含 .class 文件,需要創建一個目錄,用來專門存放 .class 文件

mkdir /usr/local/mytest/target

編譯

# -d target 參數,指定 class 文件生成在 target 目錄
javac src/com/demo/Hello.java -d target


看一下 target 目錄下生成了 .class 文件

打包

# -C target . 參數,指定把 target 目錄下的所有文件打包
jar -cvf my.jar -C target .

執行

java -jar my.jar


報錯了,這是正常的,因為我們沒有指定入口,java 不知道應該執行什么。
正確的執行方式

# -cp my.jar 把 jar 包添加到 classpath 目錄
# com.demo.Hello 說明哪個類是入口
java -cp my.jar com.demo.Hello

可執行的 jar 包

可以直接執行,無需指定入口
創建 /usr/local/mytest/MANIFEST.MF,在文件內說明程序入口:

Main-Class: com.demo.Hello

再次打包

# 添加了 m 參數,指定 MANIFEST.MF,這個文件的內容會被添加到 jar 包的清單,用於說明 my.jar 的入口
jar -cvfm my.jar MANIFEST.MF -C target .

執行

java -jar my.jar

成功輸出 hello

依賴第三方 jar 包的 java 代碼的編譯執行

創建文件 src/com/demo/HelloGson.java,這個代碼依賴 gson 包:

package com.demo;

import com.google.gson.Gson;

import java.util.HashMap;
import java.util.Map;

public class HelloGson {
    public static void main(String[] args) {

        Gson gson = new Gson();
        Map<String, String> map = new HashMap<String, String>();
        map.put("key1", "value1");
        map.put("key2", "value2");
        String json = gson.toJson(map);
        System.out.println(json);
    }
}

直接編譯:

javac src/com/demo/HelloGson.java -d target

理所當然的報錯 error: package com.google.gson does not exist,依賴包不存在
創建 libs 目錄,把依賴包 gson-2.8.5.jar 放進去,最后整個目錄結構如下:

再次編譯,使用 -cp libs/gson-2.8.5.jar 參數添加依賴包:

javac -cp libs/gson-2.8.5.jar src/com/demo/HelloGson.java -d target

編譯成功,生成 HelloGson.class 文件:

執行:

java -cp target com.demo.HelloGson

報錯 java.lang.ClassNotFoundException: com.google.gson.Gson 還是缺少依賴。
執行時也需把 libs/gson-2.8.5.jar 添加到 classpath 路徑中:

java -cp target:libs/gson-2.8.5.jar com.demo.HelloGson

成功輸出:

{"key1":"value1","key2":"value2"}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM