AdSense

2026/8/20

Java 命令啟動jar並在VS Code以Debug模式執行

以java指令java -jar demo-1.0.0.jar執行Java應用程式demo-1.0.0.jar時,可以在VS Code以Debug模式下中斷點的方式如下。


例如現在VS Code中有個簡單的Java應用程式專案程式如下。

App.java

package com.abc;

public class App {
    public static void main(String[] args) {
        String id = args.length > 0 ? args[0] : "";

        System.out.println("Demo application started.");
        System.out.println("id = " + id);
    }
}

將其打包為demo-1.0.0.jar,則在所在目錄輸入java -jar demo-1.0.0.jar id=12345執行如下。

C:\..\target>java -jar demo-1.0.0.jar id=12345
Demo application started.
id = id=12345

以VS Code Debugger執行並中斷


設定launch.json

若要執行時在VS Code以debug模式進行中斷,首先在專案根目錄下新增.vscode/launch.json,內容如下。

.vscode/launch.json

{
    "version": "0.2.0",
    "configurations": [
        {
            "type": "java",          // 告訴VS Code此為Java Debug配置
            "name": "Attach App",    // 顯示在[Run and Debug]的名稱
            "request": "attach",     // 不要由VS Code啟動Java,而是連到一個已經正在執行的JVM
            "hostName": "localhost", // 表示Debugger要連到哪一台電腦,localhost即本機
            "port": 5005             // Debugger連到host的port,即localhost:5005。
        }
    ]
}

以JDWP執行JVM

然後執行命令改為java -agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=*:5005 -jar demo-1.0.0.jar id=12345。也就是多加上參數-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=*:5005開啟Java Debug功能(Java Debug Wire Protocol, JDWP)。

  • -agentlib:jdwp - 啟用JVM的Java Debug功能,讓VS Code的Debugger可以連到執行的JVM。
  • transport=dt_socket - 指定Debugger透過Socket/TCP連線到JVM。
  • server=y - JVM作為Debug Server,等待Debugger連進來。
  • suspend=y - JVM啟動後先暫停,不執行Java程式,直到Debugger連進來。
  • address=*:5005 - 指定Debug Server監聽所有網路介面的5005 port。

意思就是啟動JVM的JDWP功能,使用TCP/Socket,監聽5005 port,等待Debugger連線到JVM Debug Server才開始執行程式。

所以執行命令後會看到"Listening for transport dt_socket at address: 5005",此時執行JVM會先暫時卡住監聽5005 port等待Debugger的連線。

C:\..\target>java -agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=*:5005 -jar demo-1.0.0.jar id=12345
Listening for transport dt_socket at address: 5005

Run and Debug

此時在VS Code的App.java中下個中斷點,然後在左側選擇[Run and Debug],然後在上面選擇[Attach App]並執行,便可以看到程式繼續執行並停在中斷點。

雖然實際執行的是jar中的.class檔案,但Java編譯時會在.class中保留Debug Information,例如原始程式碼的行號資訊。VS Code Debugger透過這些資訊,可以將JVM正在執行的bytecode對應到專案中的Java原始碼,因此可以在App.java對應的位置設定中斷點。


沒有留言:

AdSense