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”時,在啓動時不會暫時線程。