IDEA社區版使用Gradle支持Tomcat

1. 前言

IntelliJ IDEA Community Edition(社區版)不支持Tomcat,如果不想花錢購買Ultimate版本,也不想使用Eclipse,可以嘗試通過以下方式使IDEA社區版支持Tomcat。

快速開始

設置環境變量TOMCAT_HOME_4IDEA,指定需要使用的Tomcat的安裝目錄,例如“ C:\program\apache-tomcat-7.0.79 ”。

下載 https://github.com/Adrninistrator/IDEA-IC-Tomcat/blob/master/runTomcat.gradle 腳本,拷貝至Java Web應用工程中,在build.gradle腳本中添加“apply from: ‘runTomcat.gradle’”。

執行以下Gradle腳本,即可啓動Tomcat進程並加載對應的應用。

gradlew startTomcat -DappName=test-tomcat -Darg4Tomcat="-DtestValue=aaabbbccc -Dlog.home=E:\desktop\log-test"
  • appName參數用於指定應用名稱及訪問路徑;
  • arg4Tomcat參數用於指定應用的JVM啓動參數,需要使用半角雙引號包含。

執行以下Gradle命令,可以刷新Web資源文件至Tomcat加載的應用目錄中,在不重啓進程時使Web資源文件修改生效。

gradlew refreshWebFile

2. 嘗試的方法

2.1. Smart Tomcat插件

在IDEA社區版(2019.2.4)中安裝了Smart Tomcat插件,並使用其啓動Tomcat應用,遇到了以下問題:

  • Web應用的class文件未被自動拷貝到對應的Web應用根目錄中,導致Web應用的代碼未被加載,需要手工處理,使用不方便;
  • Tomcat日誌只生成了localhost_access_log.txt日誌文件,沒有生成catalina.log、localhost.log等日誌文件,排查問題不方便。

使用Smart Tomcat插件遇到問題之後,放棄了使用該插件,沒有再去分析是否因爲使用方法不當。

3. 可行方法

3.1. 說明

之後通過Gradle腳本,使IDEA社區版支持Tomcat(也支持IDEA Ultimate版)。

完成的Gradle腳本及示例Web工程代碼可以從 https://github.com/Adrninistrator/IDEA-IC-Tomcat/https://gitee.com/adrninistrator/IDEA-IC-Tomcat/ 下載,腳本內容很短,有效行數不超過200行,處理也很簡單。

通過上述Gradle腳本,結合IDEA的功能,在完成配置後,可以實現以下功能,能夠達到與Eclipse或IDEA Ultimate版本對Tomcat支持的功能接近的效果。

  • 一鍵啓動Tomcat並加載Web應用
  • 一鍵停止Tomcat(應用實例可以接收到Web容器銷燬通知)
  • 一鍵啓動可調試的Tomcat(Web應用)
  • 一鍵從Tomcat(Web應用)啓動時開始調試

3.2. 依賴環境

  • IDEA

使用IntelliJ IDEA Community Edition 2019.2.4版本。

  • Tomcat

支持Tomcat 7、8、9版本(測試過Tomcat 7.0.55、7.0.79、8.5.20、9.0.30版本),理論上也支持Tomcat 5、6版本(未測試)。

  • Gradle

支持Gradle 4、5、6版本(測試過Gradle 4.1、4.7、5.6.4、6.0.1版本)。

  • JDK

使用JDK 1.8.0_144版本。

  • 操作系統

使用Windows 7 x64 SP1版本。

3.3. IDEA中執行Gradle腳本

假設存在以下Gradle任務:

task testTask {
    doFirst {
        println "測試-" + System.getProperty("arg")
    }
}

3.3.1. 在Terminal中執行

在IDEA的Terminal中執行以上Gradle任務時,可以通過gradle或gradlew命令,以命令行的方式執行,並可以通過“-D”前綴指定傳遞給Gradle腳本的JVM參數,與執行Java程序時類似。

執行上述任務的Gradle命令示例如下所示:

gradle testTask -Darg=abc
gradlew testTask -Darg=abc

執行的結果如下所示:

> Task :testTask
測試-abc

3.3.2. 在Run/Debug Configurations中執行

打開IDEA的“Run/Debug Configurations”窗口,點擊加號後,從彈出菜單中選擇“Gradle”,可以新增一個配置,用於執行對應的Gradle任務。

在這裏插入圖片描述

打開“Configuration”標籤頁,對參數進行修改。

  • 點擊“Gradle project”右側的圖標,選擇當前項目;

  • 在“Tasks”右側填入需要執行的Gradle任務名稱,如“testTask”;

  • 在“VM options”右側填入需要傳遞給Gradle腳本的JVM參數,如“-Darg=test_arg”,點擊箭頭圖標可以展開編輯框。

在這裏插入圖片描述

在Run/Debug Configurations中完成配置後,可以選中對應的配置,點擊執行按鈕開始執行。

在這裏插入圖片描述
執行的結果在“Run”窗口中顯示,如下所示:

在這裏插入圖片描述

當需要修改Run/Debug Configurations使用的Gradle時,可以打開IDEA的“File | Settings | Build, Execution, Deployment | Build Tools | Gradle”菜單,修改“Use Gradle from”選項。

在這裏插入圖片描述

3.3.2.1. 解決在Run/Debug Configurations中執行Gradle腳本中文亂碼問題

在Run/Debug Configurations中執行Gradle腳本或編譯過程時,輸出的中文可能亂碼。

在這裏插入圖片描述

或如下圖所示:

在這裏插入圖片描述

進行以下設置,可以解決上述中文亂碼問題。

  • 打開IDEA的“Help”“Edit Custom VM Options…”菜單;

在這裏插入圖片描述

  • 在打開的文件最後增加“-Dfile.encoding=UTF-8”;

在這裏插入圖片描述

  • 重啓已打開的IDEA後生效。

3.4. 在IDEA中進行遠程調試

3.4.1. 在IDEA創建遠程調試配置並獲取調試參數

打開IDEA的“Run/Debug Configurations”窗口,點擊加號後,從彈出菜單中選擇“Remote”,可以新增一個配置,用於進行遠程調試。

在這裏插入圖片描述

打開“Configuration”標籤頁,對參數進行修改。

  • “Debugger mode”選項保持“Attach to remote JVM”
  • “Transport”選項保持“Socket”
  • “Host”參數保持“localhost”
  • “Port”參數指定被調試的Java進程監聽的調試端口
  • “Use module classpath”選擇被調試的Java進程對應的源代碼模塊

在這裏插入圖片描述

“Command line arguments for remote JVM”展示的調試參數不能編輯,會跟隨上方的參數變化。

  • “Transport”選項“Socket”對應調試參數“transport=dt_socket”
  • “Port”參數對應調試參數“address=”

3.4.2. 增加調試參數後啓動被調試Java進程

複製“Command line arguments for remote JVM”對應的調試參數,將其添加到被調試Java進程的JVM參數中,啓動Java進程。

需要注意,IDEA調試配置中的Port參數,與被調試Java進程使用的調試參數中的address參數值需要相同,即調試器連接的端口需要與被調試Java進程監聽的端口一致。

3.4.3. 在IDEA啓動調試

選中對應的遠程調試配置,點擊調試按鈕開始調試,與使用IDEA啓動Java進程並調試類似。

在這裏插入圖片描述

調試啓動成功後,在“Debug”“Console”窗口提示“Connected to the target VM”,如下所示。

在這裏插入圖片描述

點擊停止按鈕可以停止調試,IDEA的“Debug”窗口會出現類似“Disconnected from the target VM, address: ‘localhost:5555’, transport: ‘socket’”的提示。

在這裏插入圖片描述

停止被調試Java進程時,IDEA啓動的調試會自動結束。

停止調試後,不會使被調試的Java進程退出。

當對Tomcat進行調試時,停止調試後在Tomcat窗口會出現類似“Listening for transport dt_socket at address: 5555”提示。

以上調試方法也支持非Web應用,以及遠程的Java進程。

3.5. runTomcat.gradle腳本使用方法

將runTomcat.gradle腳本拷貝至Java Web應用工程中,在build.gradle腳本中添加“apply from: ‘runTomcat.gradle’”。

3.5.1. 任務及參數說明

runTomcat.gradle腳本中提供了名稱爲“startTomcat”的任務,用於啓動Tomcat並加載Web應用。

使用refreshWebFile任務,可以刷新Web資源文件至Tomcat加載的應用目錄中,在不重啓進程時使Web資源文件修改生效。

在腳本中使用了以下參數。

3.5.1.1. 環境變量

  • TOMCAT_HOME_4IDEA
環境變量名稱 TOMCAT_HOME_4IDEA
作用 指定需要使用的Tomcat的安裝目錄
示例 C:\program\apache-tomcat-7.0.79
必須設置
說明 使用Tomcat解壓後的目錄
  • TOMCAT_INSTANCE_4IDEA
環境變量名稱 TOMCAT_INSTANCE_4IDEA
作用 指定保存各應用對應的Tomcat實例的目錄
示例 D:\tomcat-test
必須設置
說明 默認使用當前用戶目錄的“.tomcat_idea”目錄。例如爲“C:\Users\user.tomcat_idea”目錄,在該目錄中保存了各應用對應的Tomcat實例,各實例分別對應其中的一個目錄

3.5.1.2. JVM參數

  • appName
JVM參數名稱 appName
作用 指定當前應用對應的Tomcat實例的名稱
示例 app_test
必須設置
  • noBuild
JVM參數名稱 noBuild
作用 指定跳過Web應用的編譯過程
示例 1
必須設置
說明 當爲非空時,會跳過;不指定或爲空時,不會跳過
  • contextPath
JVM參數名稱 contextPath
作用 指定當前Web應用的上下文路徑
示例 context_test
必須設置
說明 默認使用appName參數值
  • arg4Tomcat
JVM參數名稱 arg4Tomcat
作用 啓動Tomcat時使用的JVM參數
示例 “-DtestValue=aaabbbccc -Dlog.home=E:\desktop\log-test -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5555”
必須設置
說明 需要使用半角雙引號包含全部的參數,否則會被空格截斷。可以指定jdwp調試參數

3.5.2. 環境配置

在使用提供的Gradle腳本runTomcat.gradle時,首先需要完成環境配置,“TOMCAT_HOME_4IDEA”環境變量配置需要增加,“TOMCAT_INSTANCE_4IDEA”環境變量的配置可選。

在完成環境變量配置後,需要重啓已打開的IDEA後生效。

爲了驗證環境變量配置是否已生效,可在IDEA的Terminal中執行“echo %TOMCAT_HOME_4IDEA%”,當配置完成時會輸出對應的環境變量值,未配置或未生效時會輸出“%TOMCAT_HOME_4IDEA%”。

3.5.3. 使用場景

3.5.3.1. 正常啓動Tomcat進程

正常啓動Tomcat進程,加載示例工程中的Web應用的Gradle命令如下所示:

gradlew startTomcat -DappName=test-tomcat -Darg4Tomcat="-DtestValue=aaabbbccc -Dlog.home=E:\desktop\log-test"

在以上示例中,指定當前應用對應的Tomcat實例的名稱,以及Web應用的上下文路徑,均爲“test-tomcat”,指定啓動Tomcat時使用的JVM參數爲“"-DtestValue=aaabbbccc -Dlog.home=E:\desktop\log-test"”。

第一次執行上述Gradle命令時(或刪除了當前應用對應的Tomcat實例的目錄後),Gradle腳本輸出的結果如下所示:

> Configure project :
noBuild參數值: null

> Task :clean
> Task :compileJava
> Task :processResources
> Task :classes

> Task :startTomcat
appName參數值: test-tomcat
contextPath參數值: test-tomcat
arg4Tomcat參數值: -DtestValue=aaabbbccc -Dlog.home=E:\desktop\log-test
tomcatDir參數值: C:\program\apache-tomcat-7.0.55
instanceDir參數值: C:\Users\user\.tomcat_idea
當前路徑: E:\IDEA-IC-Tomcat
當前應用使用的Tomcat實例目錄: C:\Users\user\.tomcat_idea\test-tomcat
生成Web應用所需文件
生成Web應用所需文件-完成
判斷是否需要創建Tomcat實例
創建Tomcat實例
文件不存在: C:\Users\user\.tomcat_idea\test-tomcat\conf\Catalina\localhost\test-tomcat.xml
寫入文件: C:\Users\user\.tomcat_idea\test-tomcat\conf\Catalina\localhost\test-tomcat.xml
生成bat停止腳本文件: C:\Users\user\.tomcat_idea\test-tomcat\test-tomcat-stop.bat
文件不存在: C:\Users\user\.tomcat_idea\test-tomcat\test-tomcat-stop.bat
寫入文件: C:\Users\user\.tomcat_idea\test-tomcat\test-tomcat-stop.bat
生成bat啓動腳本文件: C:\Users\user\.tomcat_idea\test-tomcat\test-tomcat-start.bat
文件不存在: C:\Users\user\.tomcat_idea\test-tomcat\test-tomcat-start.bat
寫入文件: C:\Users\user\.tomcat_idea\test-tomcat\test-tomcat-start.bat

當以上Gradle腳本執行成功後,會啓動Tomcat,Tomcat進程會產生單獨的命令行窗口。

在這裏插入圖片描述

使用瀏覽器訪問示例工程的Controller,URL爲“ http://localhost:8080/test-tomcat/testrest/get ”,輸出結果爲當前時間戳及“testValue”對應的JVM參數值,訪問結果如下所示:

在這裏插入圖片描述

3.5.3.2. 使用Tomcat實例啓動腳本啓動Tomcat進程

runTomcat.gradle腳本的“startTomcat”任務執行時,會在當前Web應用對應的Tomcat實例目錄生成啓動腳本,如前文輸出的示例“C:\Users\user\.tomcat_idea\test-tomcat\test-tomcat-start.bat”。

當不需要對Web應用重新編譯時,可以直接執行上述啓動腳本,啓動Tomcat進程,加載Web應用。

3.5.3.3. 停止Tomcat進程

在示例工程中,TestPostConstructLazyFalse.preDestroy()方法使用了@PreDestroy註解,該方法會在應用停止階段執行,會在當前目錄生成名稱爲“preDestroy-”及當前時間戳的目錄。

3.5.3.3.1. 直接關閉Tomcat窗口(應用實例無法接收到Web容器銷燬通知)

將Tomcat窗口關閉,可以停止Tomcat進程。

通過該方法停止Tomcat進程,會使Tomcat進程直接結束,應用實例無法接收到Web容器銷燬通知,示例工程的TestPostConstructLazyFalse.preDestroy()方法不會執行,當前目錄不會生成目錄。

3.5.3.3.2. 使用Tomcat實例停止腳本停止Tomcat進程(應用實例可以接收到Web容器銷燬通知)

runTomcat.gradle腳本的“startTomcat”任務執行時,會在當前Web應用對應的Tomcat實例目錄生成停止腳本,如前文輸出的示例“C:\Users\user\.tomcat_idea\test-tomcat\test-tomcat-stop.bat”。

執行上述停止腳本,會執行Tomcat提供的stop命令,可以停止Tomcat進程,應用實例可以接收到Web容器銷燬通知,示例工程的TestPostConstructLazyFalse.preDestroy()方法會執行,當前目錄會生成目錄,如下所示。

在這裏插入圖片描述

3.5.3.4. 調試Web應用

以下在IDEA創建遠程調試配置並獲取調試參數的過程,可以參考前文對應內容。

3.5.3.4.1. 進程啓動後調試
  • 啓動Tomcat進程

獲取到調試參數如下所示:

-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5555

在執行Gradle “startTomcat”任務時,添加以上參數至arg4Tomcat參數中(可添加到IDEA的“Run/Debug Configurations”的Gradle配置中),如下所示:

gradlew -DappName=test-tomcat
-Darg4Tomcat="-DtestValue=aaabbbccc -Dlog.home=E:\desktop\log-test -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5555"

執行以上Gradle命令後,啓動Tomcat進程。

  • 啓動IDEA調試

之後可以在IDEA中啓動調試。

對URI“/testrest/get”對應的TestRestController.get()方法設置斷點,通過瀏覽器訪問後,IDEA調試器進入斷點,可在“Debug”“Debugger”窗口查看。

在這裏插入圖片描述

3.5.3.4.2. 從進程啓動開始調試(操作兩次)

以上使用的調試參數中的suspend參數值爲“n”,被調試的進程在啓動時不會暫停線程,會正常啓動。只支持先啓動被調試進程,再進行調試。

當需要從進程啓動開始調試時,需要將調試參數中的suspend參數值設爲“y”,被調試的進程在啓動時會暫停線程,等待調試器連接address指定的端口後,纔會繼續啓動。

  • 啓動Tomcat進程

當需要從進程啓動開始調試時,調試參數示例如下。

-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5555

將Gradle任務“startTomcat”的“arg4Tomcat”參數中配置的“suspend”參數設置爲“y”,再通過該命令啓動Tomcat,Tomcat窗口只顯示“Listening for transport dt_socket at address: 5555”,未顯示其他內容,即Tomcat進程此時在等待調試器連接address參數對應的端口,未完成啓動。

在這裏插入圖片描述

  • 啓動IDEA調試

在Web應用初始化階段會執行的代碼設置斷點,例如在示例工程的帶有@PostConstruct註解的TestPostConstructLazyFalse.postConstruct()方法設置斷點。

在IDEA啓動調試,查看Tomcat窗口日誌已更新,說明Tomcat進程已啓動。

查看IDEA調試窗口,已進入以上設置的斷點,證明可以從Web應用啓動開始調試。

在這裏插入圖片描述

3.5.3.4.3. 從進程啓動開始調試(一鍵完成)

以上從進程啓動開始調試的操作需要先啓動Tomcat進程,再啓動IDEA調試,可以優化爲一鍵完成。

打開IDEA的“Run/Debug Configurations”窗口,選擇“Remote”配置,點擊“Before launch: Activate tool window”下方的加號按鈕,選擇“Run Gradle task”。

在這裏插入圖片描述

彈出“Select Gradle Task”窗口,“Gradle project”“Tasks”“VM options”參數配置,可參考在IDEA添加Gradle配置,通過“startTomcat”任務啓動Tomcat進程的步驟,需要確保“VM options”參數填寫的“arg4Tomcat”參數中的調試參數“suspend”爲“y”。

在這裏插入圖片描述

“Before launch: Activate tool window”下方的列表會出現配置的Gradle任務。

在這裏插入圖片描述

完成以上配置後,在啓動IDEA調試之前,會執行指定的Gradle任務“startTomcat”,以“suspend=y”的調試參數啓動Tomcat進程。可以實現一鍵從進程啓動開始調試,與IDEA Ultimate版或Eclipse對Web應用從啓動開始調試的效果類似。

3.5.3.4.4. 調試Tomcat的類

當需要對Tomcat的類進行調試時,需要將Tomcat的lib目錄添加至IDEA的Web應用工程的依賴中,否則調試時無法查看Tomcat的類。

打開IDEA的“Project Structure”窗口,選擇“Project Settings”“Modules”標籤頁,在打開的窗口中選擇Web項目主模塊,選擇“Dependencies”標籤頁,點擊加號按鈕,選擇“JARs or directories…”菜單。

在這裏插入圖片描述

在彈出的窗口,選擇當前使用的Tomcat的安裝目錄的lib目錄。

在這裏插入圖片描述

完成添加後,Tomcat的lib目錄會出現在“Dependencies”標籤頁的最下方。

在這裏插入圖片描述

當刷新Gradle後,項目配置會重置,以上添加的依賴會被清理,需要重新添加。

完成以上配置後,在Tomcat的org.apache.catalina.startup.HostConfig$DeployDescriptor類run方法設置斷點,從進程啓動開始調試,可以在IDEA的Debug窗口看到已進入斷點。該方法是Tomcat啓動時執行的第一個Tomcat的類的方法。

在這裏插入圖片描述

3.6. 其他說明

  • 生成Web應用所需文件調整

runTomcat.gradle腳本中buildFiles4WebApp方法用於生成Web應用所需文件,拷貝的目錄與文件可以根據實際情況調整。

  • 調試端口需要確保未被監聽

被調試Java進程的調試參數中指定的adderss參數對應的調試端口,需要確保未被監聽,否則被調試Java進程會啓動失敗,窗口會自動消失,Tomcat的提示如下。

在這裏插入圖片描述

  • 重新創建Tomcat實例

當因爲需要修改使用的Tomcat版本,或其他原因,導致需要重新創建Web應用使用的Tomcat實例時,需要將對應的Tomcat實例目錄刪除,如“C:\Users\user.tomcat_idea\test-tomcat”,之後再執行Gradle的startTomcat任務。

  • Tomcat實例目錄配置修改與日誌查看

當前Web應用對應的Tomcat實例目錄,在執行Gradle “startTomcat”任務時會輸出,如“C:\Users\user.tomcat_idea\test-tomcat”。

當需要修改當前Web應用對應的Tomcat使用的HTTP服務端口、SSL配置、線程池數量等參數時,可以修改Tomcat實例目錄的“conf\server.xml”文件,說明略。

當需要同時啓動多個Tomcat進程分別加載不同的Web應用時,需要先修改對應Tomcat實例的“conf\server.xml”文件中的監聽端口,避免不同的Tomcat實例使用同一個端口導致不可用。

Tomcat實例目錄的“logs”目錄保存了Tomcat日誌文件,使用默認配置時,包括“catalina.log”“localhost.log”“localhost_access_log.txt”“host-manager.log”“manager.log”等。

3.7. 原理說明

通過runTomcat.gradle腳本啓動Tomcat進程並加載Web應用,與Eclipse或IDEA Ultimate(2018.3及之前版本)的原理類似,如下所示。

3.7.1. 生成Web應用所需文件

當noBuild參數未指定或爲空時,會先執行Gradle的classes任務完成編譯,再執行buildFiles4WebApp方法,完成以下操作:

  • 將編譯生成的class文件拷貝至“build/tomcat/WEB-INF/classes”目錄中
  • 將“src/main/resources/”目錄(配置文件)拷貝至“build/tomcat/WEB-INF/classes”目錄中
  • 將“src/main/webapp/”目錄(靜態資源與WEB-INF/web.xml文件)拷貝至“build/tomcat”目錄中
  • 將依賴的jar包拷貝至“build/tomcat/WEB-INF/lib”目錄中

3.7.2. 生成Tomcat實例

判斷當前應用使用的Tomcat實例目錄是否已存在,若已存在時則不再處理。

當前應用使用的Tomcat實例目錄不存在時,進行以下操作生成Tomcat實例:

  • 在“TOMCAT_INSTANCE_4IDEA”環境變量參數值對應的目錄,或當前用戶目錄的“.tomcat_idea”目錄中,創建當前Web應用使用的Tomcat實例目錄,使用Gradle “startTomcat”任務執行時的“appName”參數值作爲目錄名稱;
  • 將“TOMCAT_HOME_4IDEA”環境變量參數值指定的,需要使用的Tomcat安裝目錄的bin、conf目錄拷貝至當前Web應用使用的Tomcat實例目錄中;
  • 在當前Web應用使用的Tomcat實例目錄創建logs、temp、work目錄。

3.7.3. 處理Tomcat上下文描述符文件

上下文描述符是一個XML文件,其中包含與Tomcat相關的上下文配置,例如命名資源或會話管理器配置等。當Tomcat啓動時,上下文描述符會被首先部署。可參考 https://tomcat.apache.org/tomcat-7.0-doc/deployer-howto.html 。

上下文描述符需要保存在當前Web應用使用的Tomcat實例目錄的“conf\Catalina\localhost”目錄中,當前Web應用的上下文路徑與上下文描述符文件名相同(不含.xml後綴),上下文路徑的大小寫與文件名的大小寫一致。

runTomcat.gradle腳本會檢查當前Web應用對應的Tomcat實例的上下文描述符,若文件已存在且內容不需要修改,則不執行寫入操作;若文件不存在或文件內容需要修改,則執行文件寫入操作。

3.7.4. 生成Tomcat實例啓動/停止腳本

Tomcat實例啓動/停止腳本會保存在當前Web應用對應的Tomcat實例目錄中。

runTomcat.gradle腳本會檢查對應的腳本文件,在需要寫入時進行寫入操作。

在啓動腳本中會調用Tomcat實例目錄的“bin\startup.bat”腳本;在停止腳本中會調用Tomcat實例目錄的“bin\shutdown.bat”腳本。

3.7.5. 啓動Tomcat

runTomcat.gradle腳本會執行生成的Tomcat實例啓動腳本,以啓動Tomcat。

3.7.6. 調試Web應用

以上的遠程調試使用了JDWP(Java Debug Wire Protocol),可參考 https://docs.oracle.com/javase/8/docs/technotes/guides/jpda/jdwp-spec.html ,JDWP是用於調試器與其調試的Java虛擬機之間的通信協議。

JPDA(The Java Platform Debugger Architecture)包含三個接口,供調試器在桌面系統的開發環境中使用。JDWP屬於其中一個,JPDA的說明可參考 https://docs.oracle.com/javase/8/docs/technotes/guides/jpda/ 。

在JPDA連接和調用詳細信息(https://docs.oracle.com/javase/8/docs/technotes/guides/jpda/conninv.html )中,說明當suspend參數爲“y”時,VMStartEvent會使用SUSPEND_ALL作爲暫停策略;當suspend參數爲“n”時,VMStartEvent會使用SUSPEND_NONE作爲暫停策略。

參考 https://docs.oracle.com/javase/8/docs/jdk/api/jpda/jdi/com/sun/jdi/event/VMStartEvent.html ,說明VMStartEvent是目標VM的初始化通知,在啓動主線程之前和執行任何應用程序代碼之前,會收到此事件。

參考 https://docs.oracle.com/javase/8/docs/jdk/api/jpda/jdi/com/sun/jdi/request/EventRequest.html ,說明SUSPEND_ALL在事件發生時會暫停全部線程;SUSPEND_NONE在事件發生時不會暫停線程。

根據以上說明可知,當Java進程的調試參數中的suspend參數爲“y”時,在啓動時會暫時全部線程;suspend參數爲“n”時,在啓動時不會暫時線程。
😕/docs.oracle.com/javase/8/docs/technotes/guides/jpda/conninv.html )中,說明當suspend參數爲“y”時,VMStartEvent會使用SUSPEND_ALL作爲暫停策略;當suspend參數爲“n”時,VMStartEvent會使用SUSPEND_NONE作爲暫停策略。

參考 https://docs.oracle.com/javase/8/docs/jdk/api/jpda/jdi/com/sun/jdi/event/VMStartEvent.html ,說明VMStartEvent是目標VM的初始化通知,在啓動主線程之前和執行任何應用程序代碼之前,會收到此事件。

參考 https://docs.oracle.com/javase/8/docs/jdk/api/jpda/jdi/com/sun/jdi/request/EventRequest.html ,說明SUSPEND_ALL在事件發生時會暫停全部線程;SUSPEND_NONE在事件發生時不會暫停線程。

根據以上說明可知,當Java進程的調試參數中的suspend參數爲“y”時,在啓動時會暫時全部線程;suspend參數爲“n”時,在啓動時不會暫時線程。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章