整合營銷服務(wù)商

          電腦端+手機(jī)端+微信端=數(shù)據(jù)同步管理

          免費(fèi)咨詢熱線:

          IDEA 社區(qū)版不支持 Tomcat?一招完美解決

          IDEA 社區(qū)版不支持 Tomcat?一招完美解決

          者 | 鄭祎

          責(zé)編 | Elle

          前言

          IntelliJ IDEA Community Edition(社區(qū)版)不支持Tomcat,不想花錢購買Ultimate版本,也不想使用Eclipse,嘗試通過其他方式使IDEA社區(qū)版支持Tomcat。

          嘗試的方法

          2.1. Smart Tomcat插件

          在IDEA社區(qū)版(2019.2.4)中安裝了Smart Tomcat插件,并使用其啟動Tomcat應(yīng)用,遇到了以下問題:

          1. Web應(yīng)用的class文件未被自動拷貝到對應(yīng)的Web應(yīng)用根目錄中,導(dǎo)致Web應(yīng)用的代碼未被加載,需要手工處理,使用不方便;

          2. Tomcat日志只生成了localhost_access_log.txt日志文件,沒有生成catalina.log、localhost.log等日志文件,排查問題不方便。

          使用Smart Tomcat插件遇到問題之后,放棄了使用該插件,沒有再去分析是否因為使用方法不當(dāng)。

          可行方法

          3.1. 說明

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

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

          通過上述Gradle腳本,結(jié)合IDEA的功能,在完成配置后,可以實現(xiàn)以下功能,能夠達(dá)到與Eclipse或IDEA Ultimate版本對Tomcat支持的功能接近的效果。

          • 一鍵啟動Tomcat并加載Web應(yīng)用

          • 一鍵停止Tomcat(應(yīng)用實例可以接收到Web容器銷毀通知)

          • 一鍵啟動可調(diào)試的Tomcat(Web應(yīng)用)

          • 一鍵從Tomcat(Web應(yīng)用)啟動時開始調(diào)試

          3.2. 依賴環(huán)境

          • 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版本。

          • 操作系統(tǒng)

          使用Windows 7 x64 SP1版本。

          3.3. IDEA中執(zhí)行Gradle腳本

          假設(shè)存在以下Gradle任務(wù):

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

          3.3.1. 在Terminal中執(zhí)行

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

          執(zhí)行上述任務(wù)的Gradle命令示例如下所示:

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

          執(zhí)行的結(jié)果如下所示:

          > Task :testTask
          測試-abc

          3.3.2. 在Run/Debug Configurations中執(zhí)行

          打開IDEA的“Run/Debug Configurations”窗口,點(diǎn)擊加號后,從彈出菜單中選擇“Gradle”,可以新增一個配置,用于執(zhí)行對應(yīng)的Gradle任務(wù)。

          打開“Configuration”標(biāo)簽頁,對參數(shù)進(jìn)行修改。

          • 點(diǎn)擊“Gradle project”右側(cè)的圖標(biāo),選擇當(dāng)前項目;

          • 在“Tasks”右側(cè)填入需要執(zhí)行的Gradle任務(wù)名稱,如“testTask”;

          • 在“VM options”右側(cè)填入需要傳遞給Gradle腳本的JVM參數(shù),如“-Darg=test_arg”,點(diǎn)擊箭頭圖標(biāo)可以展開編輯框。

          在Run/Debug Configurations中完成配置后,可以選中對應(yīng)的配置,點(diǎn)擊執(zhí)行按鈕開始執(zhí)行。

          執(zhí)行的結(jié)果在“Run”窗口中顯示,如下所示:

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

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

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

          或如下圖所示:

          進(jìn)行以下設(shè)置,可以解決上述中文亂碼問題。

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

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

          • 重啟已打開的IDEA后生效。

          3.4. 在IDEA中進(jìn)行遠(yuǎn)程調(diào)試

          3.4.1. 在IDEA創(chuàng)建遠(yuǎn)程調(diào)試配置并獲取調(diào)試參數(shù)

          打開IDEA的“Run/Debug Configurations”窗口,點(diǎn)擊加號后,從彈出菜單中選擇“Remote”,可以新增一個配置,用于進(jìn)行遠(yuǎn)程調(diào)試。

          打開“Configuration”標(biāo)簽頁,對參數(shù)進(jìn)行修改。

          • “Debugger mode”選項保持“Attach to remote JVM”

          • “Transport”選項保持“Socket”

          • “Host”參數(shù)保持“l(fā)ocalhost”

          • “Port”參數(shù)指定被調(diào)試的Java進(jìn)程監(jiān)聽的調(diào)試端口

          • “Use module classpath”選擇被調(diào)試的Java進(jìn)程對應(yīng)的源代碼模塊

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

          • “Transport”選項“Socket”對應(yīng)調(diào)試參數(shù)“transport=dt_socket”

          • “Port”參數(shù)對應(yīng)調(diào)試參數(shù)“address=”

          3.4.2. 增加調(diào)試參數(shù)后啟動被調(diào)試Java進(jìn)程

          復(fù)制“Command line arguments for remote JVM”對應(yīng)的調(diào)試參數(shù),將其添加到被調(diào)試Java進(jìn)程的JVM參數(shù)中,啟動Java進(jìn)程。

          需要注意,IDEA調(diào)試配置中的Port參數(shù),與被調(diào)試Java進(jìn)程使用的調(diào)試參數(shù)中的address參數(shù)值需要相同,即調(diào)試器連接的端口需要與被調(diào)試Java進(jìn)程監(jiān)聽的端口一致。

          3.4.3. 在IDEA啟動調(diào)試

          選中對應(yīng)的遠(yuǎn)程調(diào)試配置,點(diǎn)擊調(diào)試按鈕開始調(diào)試,與使用IDEA啟動Java進(jìn)程并調(diào)試類似。

          調(diào)試啟動成功后,在“Debug”“Console”窗口提示“Connected to the target VM”,如下所示。

          點(diǎn)擊停止按鈕可以停止調(diào)試,IDEA的“Debug”窗口會出現(xiàn)類似“Disconnected from the target VM, address: 'localhost:5555', transport: 'socket'”的提示。

          停止被調(diào)試Java進(jìn)程時,IDEA啟動的調(diào)試會自動結(jié)束。

          停止調(diào)試后,不會使被調(diào)試的Java進(jìn)程退出。

          當(dāng)對Tomcat進(jìn)行調(diào)試時,停止調(diào)試后在Tomcat窗口會出現(xiàn)類似“Listening for transport dt_socket at address: 5555”提示。

          以上調(diào)試方法也支持非Web應(yīng)用,以及遠(yuǎn)程的Java進(jìn)程。

          3.5. runTomcat.gradle腳本使用方法

          將runTomcat.gradle腳本拷貝至Java Web應(yīng)用工程中,在build.gradle腳本中添加“apply from: 'runTomcat.gradle'”。

          3.5.1. 任務(wù)及參數(shù)說明

          runTomcat.gradle腳本中提供了名稱為“startTomcat”的任務(wù),用于啟動Tomcat并加載Web應(yīng)用。

          在腳本中使用了以下參數(shù)。

          3.5.1.1. 環(huán)境變量

          • TOMCAT_HOME_4IDEA

          • TOMCAT_INSTANCE_4IDEA

          3.5.1.2. JVM參數(shù)

          • appName

          • noBuild

          • contextPath

          • arg4Tomcat

          3.5.2. 環(huán)境配置

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

          在完成環(huán)境變量配置后,需要重啟已打開的IDEA后生效。

          為了驗證環(huán)境變量配置是否已生效,可在IDEA的Terminal中執(zhí)行“echo %TOMCAT_HOME_4IDEA%”,當(dāng)配置完成時會輸出對應(yīng)的環(huán)境變量值,未配置或未生效時會輸出“%TOMCAT_HOME_4IDEA%”。

          3.5.3. 使用場景

          3.5.3.1. 正常啟動Tomcat進(jìn)程

          正常啟動Tomcat進(jìn)程,加載示例工程中的Web應(yīng)用的Gradle命令如下所示:

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

          在以上示例中,指定當(dāng)前應(yīng)用對應(yīng)的Tomcat實例的名稱,以及Web應(yīng)用的上下文路徑,均為“test-tomcat”,指定啟動Tomcat時使用的JVM參數(shù)為“"-DtestValue=aaabbbccc -Dlog.home=E:\desktop\log-test"”。

          第一次執(zhí)行上述Gradle命令時(或刪除了當(dāng)前應(yīng)用對應(yīng)的Tomcat實例的目錄后),Gradle腳本輸出的結(jié)果如下所示:

          > Configure project :
          noBuild參數(shù)值:

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

          > Task :startTomcat
          appName參數(shù)值: test-tomcat
          contextPath參數(shù)值: test-tomcat
          arg4Tomcat參數(shù)值: -DtestValue=aaabbbccc -Dlog.home=E:\desktop\log-test
          tomcatDir參數(shù)值: C:\program\apache-tomcat-7.0.55
          instanceDir參數(shù)值: C:\Users\user\.tomcat_idea
          當(dāng)前路徑: E:\IDEA-IC-Tomcat
          當(dāng)前應(yīng)用使用的Tomcat實例目錄: C:\Users\user\.tomcat_idea\test-tomcat
          生成Web應(yīng)用所需文件
          生成Web應(yīng)用所需文件-完成
          判斷是否需要創(chuàng)建Tomcat實例
          創(chuàng)建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

          當(dāng)以上Gradle腳本執(zhí)行成功后,會啟動Tomcat,Tomcat進(jìn)程會產(chǎn)生單獨(dú)的命令行窗口。

          使用瀏覽器訪問示例工程的Controller,URL為“ http://localhost:8080/test-tomcat/testrest/get ”,輸出結(jié)果為當(dāng)前時間戳及“testValue”對應(yīng)的JVM參數(shù)值,訪問結(jié)果如下所示:

          3.5.3.2. 使用Tomcat實例啟動腳本啟動Tomcat進(jìn)程

          runTomcat.gradle腳本的“startTomcat”任務(wù)執(zhí)行時,會在當(dāng)前Web應(yīng)用對應(yīng)的Tomcat實例目錄生成啟動腳本,如前文輸出的示例“C:\Users\user\.tomcat_idea\test-tomcat\test-tomcat-start.bat”。

          當(dāng)不需要對Web應(yīng)用重新編譯時,可以直接執(zhí)行上述啟動腳本,啟動Tomcat進(jìn)程,加載Web應(yīng)用。

          3.5.3.3. 停止Tomcat進(jìn)程

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

          3.5.3.3.1. 直接關(guān)閉Tomcat窗口(應(yīng)用實例無法接收到Web容器銷毀通知)

          將Tomcat窗口關(guān)閉,可以停止Tomcat進(jìn)程。

          通過該方法停止Tomcat進(jìn)程,會使Tomcat進(jìn)程直接結(jié)束,應(yīng)用實例無法接收到Web容器銷毀通知,示例工程的TestPostConstructLazyFalse.preDestroy方法不會執(zhí)行,當(dāng)前目錄不會生成目錄。

          3.5.3.3.2. 使用Tomcat實例停止腳本停止Tomcat進(jìn)程(應(yīng)用實例可以接收到Web容器銷毀通知)

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

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

          3.5.3.4. 調(diào)試Web應(yīng)用

          以下在IDEA創(chuàng)建遠(yuǎn)程調(diào)試配置并獲取調(diào)試參數(shù)的過程,可以參考前文對應(yīng)內(nèi)容。

          3.5.3.4.1. 進(jìn)程啟動后調(diào)試

          • 啟動Tomcat進(jìn)程

          獲取到調(diào)試參數(shù)如下所示:

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

          在執(zhí)行Gradle “startTomcat”任務(wù)時,添加以上參數(shù)至arg4Tomcat參數(shù)中(可添加到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"

          執(zhí)行以上Gradle命令后,啟動Tomcat進(jìn)程。

          • 啟動IDEA調(diào)試

          之后可以在IDEA中啟動調(diào)試。

          對URI“/testrest/get”對應(yīng)的TestRestController.get方法設(shè)置斷點(diǎn),通過瀏覽器訪問后,IDEA調(diào)試器進(jìn)入斷點(diǎn),可在“Debug”“Debugger”窗口查看。

          3.5.3.4.2. 從進(jìn)程啟動開始調(diào)試(操作兩次)

          以上使用的調(diào)試參數(shù)中的suspend參數(shù)值為“n”,被調(diào)試的進(jìn)程在啟動時不會暫停線程,會正常啟動。只支持先啟動被調(diào)試進(jìn)程,再進(jìn)行調(diào)試。

          當(dāng)需要從進(jìn)程啟動開始調(diào)試時,需要將調(diào)試參數(shù)中的suspend參數(shù)值設(shè)為“y”,被調(diào)試的進(jìn)程在啟動時會暫停線程,等待調(diào)試器連接address指定的端口后,才會繼續(xù)啟動。

          • 啟動Tomcat進(jìn)程

          當(dāng)需要從進(jìn)程啟動開始調(diào)試時,調(diào)試參數(shù)示例如下。

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

          將Gradle任務(wù)“startTomcat”的“arg4Tomcat”參數(shù)中配置的“suspend”參數(shù)設(shè)置為“y”,再通過該命令啟動Tomcat,Tomcat窗口只顯示“Listening for transport dt_socket at address: 5555”,未顯示其他內(nèi)容,即Tomcat進(jìn)程此時在等待調(diào)試器連接address參數(shù)對應(yīng)的端口,未完成啟動。

          • 啟動IDEA調(diào)試

          在Web應(yīng)用初始化階段會執(zhí)行的代碼設(shè)置斷點(diǎn),例如在示例工程的帶有@PostConstruct注解的TestPostConstructLazyFalse.postConstruct方法設(shè)置斷點(diǎn)。

          在IDEA啟動調(diào)試,查看Tomcat窗口日志已更新,說明Tomcat進(jìn)程已啟動。

          查看IDEA調(diào)試窗口,已進(jìn)入以上設(shè)置的斷點(diǎn),證明可以從Web應(yīng)用啟動開始調(diào)試。

          3.5.3.4.3. 從進(jìn)程啟動開始調(diào)試(一鍵完成)

          以上從進(jìn)程啟動開始調(diào)試的操作需要先啟動Tomcat進(jìn)程,再啟動IDEA調(diào)試,可以優(yōu)化為一鍵完成。

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

          彈出“Select Gradle Task”窗口,“Gradle project”“Tasks”“VM options”參數(shù)配置,可參考在IDEA添加Gradle配置,通過“startTomcat”任務(wù)啟動Tomcat進(jìn)程的步驟,需要確保“VM options”參數(shù)填寫的“arg4Tomcat”參數(shù)中的調(diào)試參數(shù)“suspend”為“y”。

          “Before launch: Activate tool window”下方的列表會出現(xiàn)配置的Gradle任務(wù)。

          完成以上配置后,在啟動IDEA調(diào)試之前,會執(zhí)行指定的Gradle任務(wù)“startTomcat”,以“suspend=y”的調(diào)試參數(shù)啟動Tomcat進(jìn)程。可以實現(xiàn)一鍵從進(jìn)程啟動開始調(diào)試,與IDEA Ultimate版或Eclipse對Web應(yīng)用從啟動開始調(diào)試的效果類似。

          3.5.3.4.4. 調(diào)試Tomcat的類

          當(dāng)需要對Tomcat的類進(jìn)行調(diào)試時,需要將Tomcat的lib目錄添加至IDEA的Web應(yīng)用工程的依賴中,否則調(diào)試時無法查看Tomcat的類。

          打開IDEA的“Project Structure”窗口,選擇“Project Settings”“Modules”標(biāo)簽頁,在打開的窗口中選擇Web項目主模塊,選擇“Dependencies”標(biāo)簽頁,點(diǎn)擊加號按鈕,選擇“JARs or directories...”菜單。

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

          完成添加后,Tomcat的lib目錄會出現(xiàn)在“Dependencies”標(biāo)簽頁的最下方。

          當(dāng)刷新Gradle后,項目配置會重置,以上添加的依賴會被清理,需要重新添加。

          完成以上配置后,在Tomcat的org.apache.catalina.startup.HostConfig$DeployDescriptor類run方法設(shè)置斷點(diǎn),從進(jìn)程啟動開始調(diào)試,可以在IDEA的Debug窗口看到已進(jìn)入斷點(diǎn)。該方法是Tomcat啟動時執(zhí)行的第一個Tomcat的類的方法。

          3.6. 其他說明

          • 生成Web應(yīng)用所需文件調(diào)整

          runTomcat.gradle腳本中buildFiles4WebApp方法用于生成Web應(yīng)用所需文件,拷貝的目錄與文件可以根據(jù)實際情況調(diào)整。

          • 調(diào)試端口需要確保未被監(jiān)聽

          被調(diào)試Java進(jìn)程的調(diào)試參數(shù)中指定的adderss參數(shù)對應(yīng)的調(diào)試端口,需要確保未被監(jiān)聽,否則被調(diào)試Java進(jìn)程會啟動失敗,窗口會自動消失,Tomcat的提示如下。

          • 重新創(chuàng)建Tomcat實例

          當(dāng)因為需要修改使用的Tomcat版本,或其他原因,導(dǎo)致需要重新創(chuàng)建Web應(yīng)用使用的Tomcat實例時,需要將對應(yīng)的Tomcat實例目錄刪除,如“C:\Users\user.tomcat_idea\test-tomcat”,之后再執(zhí)行Gradle的startTomcat任務(wù)。

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

          當(dāng)前Web應(yīng)用對應(yīng)的Tomcat實例目錄,在執(zhí)行Gradle “startTomcat”任務(wù)時會輸出,如“C:\Users\user.tomcat_idea\test-tomcat”。

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

          當(dāng)需要同時啟動多個Tomcat進(jìn)程分別加載不同的Web應(yīng)用時,需要先修改對應(yīng)Tomcat實例的“conf\server.xml”文件中的監(jiān)聽端口,避免不同的Tomcat實例使用同一個端口導(dǎo)致不可用。

          Tomcat實例目錄的“l(fā)ogs”目錄保存了Tomcat日志文件,使用默認(rèn)配置時,包括“catalina.log”“l(fā)ocalhost.log”“l(fā)ocalhost_access_log.txt”“host-manager.log”“manager.log”等。

          3.7. 原理說明

          通過runTomcat.gradle腳本啟動Tomcat進(jìn)程并加載Web應(yīng)用,與Eclipse或IDEA Ultimate(2018.3及之前版本)的原理類似,如下所示。

          3.7.1. 生成Web應(yīng)用所需文件

          當(dāng)noBuild參數(shù)未指定或為空時,會先執(zhí)行Gradle的classes任務(wù)完成編譯,再執(zhí)行buildFiles4WebApp方法,完成以下操作:

          • 將編譯生成的class文件拷貝至“build/tomcat/WEB-INF/classes”目錄中

          • 將“src/main/resources/”目錄(配置文件)拷貝至“build/tomcat/WEB-INF/classes”目錄中

          • 將“src/main/webapp/”目錄(靜態(tài)資源與WEB-INF/web.xml文件)拷貝至“build/tomcat”目錄中

          • 將依賴的jar包拷貝至“build/tomcat/WEB-INF/lib”目錄中

          3.7.2. 生成Tomcat實例

          判斷當(dāng)前應(yīng)用使用的Tomcat實例目錄是否已存在,若已存在時則不再處理。

          當(dāng)前應(yīng)用使用的Tomcat實例目錄不存在時,進(jìn)行以下操作生成Tomcat實例:

          在“TOMCAT_INSTANCE_4IDEA”環(huán)境變量參數(shù)值對應(yīng)的目錄,或當(dāng)前用戶目錄的“.tomcat_idea”目錄中,創(chuàng)建當(dāng)前Web應(yīng)用使用的Tomcat實例目錄,使用Gradle “startTomcat”任務(wù)執(zhí)行時的“appName”參數(shù)值作為目錄名稱;

          將“TOMCAT_HOME_4IDEA”環(huán)境變量參數(shù)值指定的,需要使用的Tomcat安裝目錄的bin、conf目錄拷貝至當(dāng)前Web應(yīng)用使用的Tomcat實例目錄中;

          在當(dāng)前Web應(yīng)用使用的Tomcat實例目錄創(chuàng)建logs、temp、work目錄。

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

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

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

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

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

          Tomcat實例啟動/停止腳本會保存在當(dāng)前Web應(yīng)用對應(yīng)的Tomcat實例目錄中。

          runTomcat.gradle腳本會檢查對應(yīng)的腳本文件,在需要寫入時進(jìn)行寫入操作。

          在啟動腳本中會調(diào)用Tomcat實例目錄的“bin\startup.bat”腳本;在停止腳本中會調(diào)用Tomcat實例目錄的“bin\shutdown.bat”腳本。

          3.7.5. 啟動Tomcat

          runTomcat.gradle腳本會執(zhí)行生成的Tomcat實例啟動腳本,以啟動Tomcat。

          3.7.6. 調(diào)試Web應(yīng)用

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

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

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

          參考

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

          根據(jù)以上說明可知,當(dāng)Java進(jìn)程的調(diào)試參數(shù)中的suspend參數(shù)為“y”時,在啟動時會暫時全部線程;suspend參數(shù)為“n”時,在啟動時不會暫時線程。

          作者:鄭祎,Java后臺開發(fā)

          ive Templates 是什么,聽上去感覺挺玄乎的。有的同學(xué)用過之后覺得簡直太好用了,不能說大大提高了開發(fā)效率吧,至少也是小小的提高一下,節(jié)省了很多敲重復(fù)代碼的時間。有的同學(xué)用過之后說:沒什么用,奇技淫巧罷了。

          就算你沒聽過這個概念,但是或多或少你可能都用到過一點(diǎn),就算沒有用過的話,也可能見到過一些,沒吃過豬肉可能也見過豬跑,就像下面這樣的操作。

          總結(jié)一下呢,它就類似于一種快捷指令(神奇代碼),只要你在 IDEA 中輸入特定的字母組合,IDEA 就會幫你在當(dāng)前輸入的位置插入一段預(yù)先定義好的代碼,代碼可以是固定的,也可以定義一些上下文變量,適用于那些常用的、使用頻率較高的聲明或重復(fù)代碼段。

          比如聲明靜態(tài) finalString,再不用 Live Tmeplates 的情況下,我們會手動在 IDEA 中依次敲出 "public static final String" 這一行代碼,當(dāng)然可能借助 IDEA 的智能提示,每個單詞只需要敲前兩個字母。在使用了 Live Tmeplates 的情況下, 我們只需要敲出 psfs這四個字母,然后按回車鍵,IDEA 就會幫我們在 psfs這個位置插入 "public static final String" 這一行。

          沒用過的同學(xué)是不是趕緊打開 IDEA 試一下呢?在設(shè)置界面,輸入 Live Templates,然后找到右側(cè)的 Java就可以看到內(nèi)置的模板。不光有 Java 的,對于多種文件類型都有支持,比如 SQL 、JavaScript、JSP 、Kotlin 等。

          下面介紹幾個 IDEA 內(nèi)置的、常用的模板。

          常用的 Live Templates

          main 和 psvm

          main 方法插入,雖然我們已經(jīng)可以很熟練的盲打出下面這一段代碼,但是只敲四個字母是不是會更快呢。

          public static void main(String[] args){
          }
          

          變量聲明

          下面一些是常用的變量聲明

          psfs

          public static final String 
          

          psfi

          public static final int 
          

          prsf

          private static final 
          

          St

          String 
          

          控制臺輸出

          下面是控制臺輸出,還有一些,不一一列舉了。

          sout

          文本輸出,最常用到的。

          System.out.println();
          

          souf

          帶格式化的文本輸出。

          System.out.printf();
          

          循環(huán)迭代

          fori

          輸入完,按回車后,光標(biāo)會在 i<的位置,等待輸入臨界值。

              for (int i=0; i < ; i++) {
          
              }
          

          iter

          用 forEach 的方式循環(huán),在一個數(shù)組或者列表變量下方使用。

          List<String> array=new ArrayList<>();
          for (String s1 : array) {
          
          }
          

          itco

          用迭代器的方式迭代,同樣是在一個列表變量下方使用。

          List<String> array=new ArrayList<>();
          for (Iterator<String> iterator=array.iterator(); iterator.hasNext(); ) {
            String next=iterator.next();
          }
          

          Surround Templates

          這種模板是在選中一段代碼后,然后使用快捷鍵 option+command+j調(diào)出提示框,然后選擇一個模板類型。

          這個快捷鍵是 MAC 系統(tǒng)下的,如果你用的是 windows,可以通過點(diǎn)擊 code菜單項,找到 Sorround With,看看快捷鍵是什么。

          C

          實現(xiàn)一個 Callable

          Callable<Object> callable=new Callable<Object>() {
            public Object call() throws Exception {
              System.out.println("hello");
            }
          };
          

          RL 和 WL

          插入一段讀鎖或?qū)戞i加解鎖代碼。

          // 要先聲明一個讀寫鎖實例
          ReadWriteLock readWriteLock=new ReentrantReadWriteLock();
          readWriteLock.readLock().lock();
          try {
            System.out.println("hello");
          } finally {
            readWriteLock.readLock().unlock();
          }
          

          自定義 Template

          有時候我們經(jīng)常會高頻詞的使用一段相似的代碼, 比如做網(wǎng)絡(luò)開發(fā)的同學(xué),會經(jīng)常用到 Socket 相關(guān)的初始化代碼。

          對于這種我們自己經(jīng)常要寫的某些類似的代碼段,就可以抽取出一個 Template 出來,方便我們使用。

          下面我就實現(xiàn)一個自定的 Template,來看一下是不是大大簡化了重復(fù)性勞動。有的同學(xué)可能覺得無所謂的事兒,復(fù)制、粘貼也挺省事兒。見仁見智吧,覺得有用的可以嘗試一下,覺得雞肋的也無所謂,反正也不影響最后的功能實現(xiàn)。

          比如我最新在做一些系統(tǒng)優(yōu)化的工作,這個過程中,我會頻繁的用 commons-lang3StopWatch來看某些方法或者某些代碼段的執(zhí)行時間。比如下面的代碼段:

          StopWatch stopWatch=new StopWatch("代碼段");
          stopWatch.start();
          try {
            Thread.sleep(1000);
          } catch (InterruptedException e) {
            throw new RuntimeException(e);
          }
          stopWatch.stop();
          System.out.printf("執(zhí)行時間 %s%n",stopWatch.toString());
          

          由于我比較懶,所以我不想每次都敲重復(fù)的內(nèi)容,連粘貼復(fù)制都不想。所以就想到了 Live Template。

          1、打開 IDEA 的設(shè)置窗口,找到 Editor 下的 Live Templates,在右側(cè)找到 Java,點(diǎn)擊最右側(cè)的加號。

          2、輸入這個 Template 的名字,到時候可以在編輯器中通過輸入這個名字來插入這個模板。

          輸入描述,幫助我們記憶。

          最后輸入模板的內(nèi)容。

          我給這個模板起名為 watch,模板內(nèi)容如下:

          StopWatch stopWatch=new StopWatch("$MESSAGE$");
          stopWatch.start();
          $SELECTION$
          stopWatch.stop();
          System.out.printf("執(zhí)行時間 %s%n",stopWatch.toString());
          

          $SELECTION$表示選中的部分,我們要監(jiān)控的正好是某個方法或者某個代碼段,所以正好可以用 Surround Templates,并且在內(nèi)容中用了 $SELECTION$,模板就默認(rèn)為 Surround Templates了。

          $MESSAGE$就是一個占位符的作用,當(dāng)我們插入這個模板后,光標(biāo)會定位到這個占位符,我們就可以在需要定制的地方輸入我們想要的內(nèi)容了。在這里呢,由于我的一個方法中可能用到多個 StopWatch,所以正好在這兒占位,給不同的 StopWatch 賦予不同的名字。

          可以通過下面的演示看一下效果。

          Live Template 支持的變量

          有一些情況下,我們希望插入的內(nèi)容不只是固定不變的代碼段,而是希望加入一些上下文相關(guān)的內(nèi)容,比如當(dāng)前方法的入?yún)ⅲ热绠?dāng)前類名,比如當(dāng)前方法名等。用下面這個例子說明一下。

          有一個內(nèi)置的模板叫做 soutm,它的描述是這樣的:Prints current class and method names to System.out,打印當(dāng)前類和方法名,我們看一下效果,直接將當(dāng)前類和方法名 Study.main填充到了println參數(shù)位置上。

          模板內(nèi)容是這樣的,其中用到了兩個變量是表示當(dāng)前類名的 $CLASS_NAME$和表示當(dāng)前方法名的$METHOD_NAME$

          System.out.println("$CLASS_NAME$.$METHOD_NAME$");
          

          更多的可用變量可以到 IDEA 官網(wǎng)查看,看到這些變量后,可能會打開你的思路,更近一步的為你提高開發(fā)效率。不過不用這些變量也沒關(guān)系,上面這寫其實差不多也夠用了。

          官網(wǎng)地址:https://www.jetbrains.com/help/idea/template-variables.html#predefined_functions

          原文:https://mp.weixin.qq.com/s/Dur9IeuasDjpAyHye0pR8Q

          如果感覺本文對你有幫助,點(diǎn)贊關(guān)注支持一下

          欲善其事,必先利其器。在Java開發(fā)中挑選一款好的Ide環(huán)境能大大提升我們的開發(fā)效率,IntelliJ IDEA正是一個不二選擇。本教程會介紹怎么對idea進(jìn)行配置、使用idea進(jìn)行debug和經(jīng)常使用的快捷鍵,最后會推薦幾個牛逼的idea插件,大大提升開發(fā)體驗和效率。

          一、安裝

          IntelliJ IDEA 有旗艦版和社區(qū)版本之分,其中旗艦版(Ultimate Edition)為收費(fèi)版本,有 30 天試用期。如果你是學(xué)生、老師、開源項目參與者都可以向官網(wǎng)免費(fèi)試用旗艦版。社區(qū)版(Community Edition)為免費(fèi)版本,功能較旗艦版少了很多。

          收費(fèi)版本比Community的免費(fèi)版本多了很多功能,這些功能可以大大提升我們的開發(fā)效率。下載完成后需要自己安裝激活。

          關(guān)于怎么永久激活可以見地址:

          https://www.yuque.com/docs/share/12a88ca7-c665-45ad-82bc-8bfbc1718567?# 《IntelliJ IDEA2022.2最新最細(xì)指導(dǎo)教程》


          • 申請免費(fèi)版本:https://www.jetbrains.com/idea/buy/
          • 旗艦版和社區(qū)版差異細(xì)節(jié):https://www.jetbrains.com/idea/features/editions_comparison_matrix.html

          系統(tǒng)要求:

          • JDK 版本:Apple Java 6 或 Oracle Java 7 以上
          • 內(nèi)存:最低要求 1 G,推薦 2 G 以上
          • 硬盤:最低要求 2 G
          • 顯示器:最低要求 1024 X 768 分辨率


          IntelliJ IDEA 相關(guān)核心文件和目錄介紹:

          • IntelliJ IDEA 的安裝目錄并不復(fù)雜,上圖為最常改動的 bin 目錄,經(jīng)常會改動的文件或是必須介紹就是如圖紅色框中的幾個。
          • idea64.exe 文件是 IntelliJ IDEA 64 位的可行執(zhí)行文件,要求必須電腦上裝有 JDK 64 位版本。64 位的系統(tǒng)也是建議使用該文件。
          • idea64.exe.vmoptions 文件是 IntelliJ IDEA 64 位的可執(zhí)行文件的 VM 配置文件,具體配置修改會下面進(jìn)行專門講解。
          • idea.properties 文件是 IntelliJ IDEA 的一些屬性配置文件,具體配置修改會下面進(jìn)行專門講解。

          • 強(qiáng)烈推薦不要直接修改安裝目錄下的這幾個配置文件,因為 IDEA 升級/重裝可能會導(dǎo)致修改完全失效!

          • 強(qiáng)烈推薦使用 IDEA 自帶菜單中的 Help -> Edit Custom VM Options 和 Help -> Edit Custom Properties 來進(jìn)行參數(shù)個性化配置!

          二、配置、

          2.1 樣式主題配置

          第一次安裝完IDEA之后,第一步往往需要設(shè)置一個合適自己的樣式主題,這部分配置主要包括:

          • 整體的主題配置;
          • 菜單欄字體大小樣式配置;
          • 代碼區(qū)字體大小樣式配置;
          • 輸出控制臺字體大小樣式配置。

          1. 主題和菜單欄配置

          如上圖,F(xiàn)ile>>Settings>>Appearance&Behavior>>Appearance,進(jìn)入主題設(shè)置頁面。選擇我們喜歡的主題,這個可以根據(jù)個人愛好自己選擇。然后圖中"override default fonts by"這欄,選擇字體,字體大小自己選擇。注意,這個配置只會影響主題和最上面菜單欄的顯示。

          2. 代碼區(qū)字體大小樣式配置

          如上圖,進(jìn)入Color Scheme Font標(biāo)簽頁進(jìn)行代碼編輯區(qū)的字體樣式設(shè)置。

          3. 輸出控制臺字體大小樣式配置

          2.2 設(shè)置編碼字符集

          2.3 配置JDK

          1. 項目編譯的JDK版本


          2. 配置Project的Jdk版本

          項目的SDK默認(rèn)會被項目中的每個module使用,當(dāng)然我們也可以為每個module配置專有的SDK類型和版本。

          3. 配置每個module依賴的JDK版本

          每個module會默認(rèn)使用project配置的jdk版本,當(dāng)然我們也可以自己指定。

          4. 檢查平臺的JDK版本(也就是你電腦上安裝的JDK)

          我們在給project創(chuàng)建jdk的時候其實用的就是這個jdk。

          2.4 鍵盤習(xí)慣配置

          如果你之前用慣的是Eclipse,可能用不慣IDEA的快捷鍵.沒事,idea可以將快捷鍵設(shè)置為eclipse模式。你之前用的是windows電腦,現(xiàn)在轉(zhuǎn)為mac了,idea也提供了相應(yīng)的轉(zhuǎn)換設(shè)置。

          通過keyman標(biāo)簽還可以設(shè)置快捷鍵,但是個人不建議改變IDEA默認(rèn)的快捷鍵設(shè)置。

          2.5 構(gòu)建工具配置

          常用的構(gòu)建工具有Maven和Gradle。我們可以選其一。

          2.6 自動編譯配置

          具體步驟:頂部工具欄 File ->Other Settings -> Default Settings -> Auto Import

          說明:開啟自動編譯之后,結(jié)合Ctrl+Shift+F9 會有熱更新效果。

          三. 調(diào)試技巧

          3.1 Debug界面&基本功能

          首先看下IDEA中Debug模式下的界面,隨著idea版本的更新Debug模式的圖標(biāo)設(shè)計雖有微調(diào)改動,但是功能大體相通。

           上圖爬蟲的圖標(biāo)就是Debug模式運(yùn)行鍵,綠色三角形圖標(biāo)是正常的Run模式
            
           如下是在IDEA中啟動Debug模式,進(jìn)入斷點(diǎn)后的界面,我這里是Windows,可能和Mac的圖標(biāo)等會有些不一樣。就簡單說下圖中標(biāo)注的8個地方:

          ① 以Debug模式啟動服務(wù),左邊的一個按鈕則是以Run模式啟動。在開發(fā)中,我一般會直接啟動Debug模式,方便隨時調(diào)試代碼。

          ② 斷點(diǎn):在左邊行號欄單擊左鍵,或者快捷鍵Ctrl+F8 打上/取消斷點(diǎn),斷點(diǎn)行的顏色可自己去設(shè)置。

          ③ Debug窗口:訪問請求到達(dá)第一個斷點(diǎn)后,會自動激活Debug窗口。如果沒有自動激活,可以去設(shè)置里設(shè)置。

          ④ 調(diào)試按鈕:調(diào)試的主要功能就對應(yīng)著幾個按鈕,鼠標(biāo)懸停在按鈕上可以查看對應(yīng)的快捷鍵。在菜單欄Run里可以找到同樣的對應(yīng)的功能。

          ⑤ 服務(wù)按鈕:可以在這里關(guān)閉/啟動服務(wù),設(shè)置斷點(diǎn)等。

          ⑥ 方法調(diào)用棧:這里顯示了該線程調(diào)試所經(jīng)過的所有方法,勾選右上角的[Show All Frames]按鈕,就不會顯示其它類庫的方法了,否則這里會有一大堆的方法。

          ⑦ Variables:在變量區(qū)可以查看當(dāng)前斷點(diǎn)之前的當(dāng)前方法內(nèi)的變量。

          ⑧ Watches:查看變量,可以將Variables區(qū)中的變量拖到Watches中查看

          在設(shè)置里勾選Show debug window on breakpoint,則請求進(jìn)入到斷點(diǎn)后自動激活Debug窗口

          如果你的IDEA底部沒有顯示工具欄或狀態(tài)欄,可以在View里打開,顯示出工具欄會方便我們使用。可以自己去嘗試下這四個選項。

          在菜單欄Run里有調(diào)試對應(yīng)的功能,同時可以查看對應(yīng)的快捷鍵。

          3.2 基本用法&快捷鍵

          Debug調(diào)試的功能主要對應(yīng)著圖中兩組按鈕:

          1、首先說第一組按鈕,從左到右依次如下:

          > Show Execution Point (Alt + F10):如果你的光標(biāo)在其它行或其它頁面,點(diǎn)擊這個按鈕可跳轉(zhuǎn)到當(dāng)前代碼執(zhí)行的行。

          > Step Over (F8):步過,一行一行地往下走,如果這一行上有方法不會進(jìn)入方法。

          > Step Into (F7):步入,如果當(dāng)前行有方法,可以進(jìn)入方法內(nèi)部,一般用于進(jìn)入自定義方法內(nèi),不會進(jìn)入官方類庫的方法。

          > Force Step Into (Alt + Shift + F7):強(qiáng)制步入,能進(jìn)入任何方法,查看底層源碼的時候可以用這個進(jìn)入官方類庫的方法。

          > Step Out (Shift + F8):步出,從步入的方法內(nèi)退出到方法調(diào)用處,此時方法已執(zhí)行完畢,只是還沒有完成賦值。

          > Drop Frame (默認(rèn)無):回退斷點(diǎn),后面章節(jié)詳細(xì)說明。

          > Run to Cursor (Alt + F9):運(yùn)行到光標(biāo)處,你可以將光標(biāo)定位到你需要查看的那一行,然后使用這個功能,代碼會運(yùn)行至光標(biāo)行,而不需要打斷點(diǎn)。

          > Evaluate Expression (Alt + F8):計算表達(dá)式,后面章節(jié)詳細(xì)說明。

          2、第二組按鈕,共從上到下依次如下:

          > Rerun ‘xxxx’:重新運(yùn)行程序,會關(guān)閉服務(wù)后重新啟動程序。

          > Update ‘tech’ application (Ctrl + F5):更新程序,一般在你的代碼有改動后可執(zhí)行這個功能。

          > Resume Program (F9):恢復(fù)程序,比如,你在第20行和25行有兩個斷點(diǎn),當(dāng)前運(yùn)行至第20行,按F9,則運(yùn)行到下一個斷點(diǎn)(即第25行),再按F9,則運(yùn)行完整個流程,因為后面已經(jīng)沒有斷點(diǎn)了。

          > Pause Program:暫停程序,啟用Debug。

          > Stop ‘xxx’ (Ctrl + F2):連續(xù)按兩下,關(guān)閉程序。有時候你會發(fā)現(xiàn)關(guān)閉服務(wù)再啟動時,報端口被占用,這是因為沒完全關(guān)閉服務(wù)的原因,你就需要查殺所有JVM進(jìn)程了。

          > View Breakpoints (Ctrl + Shift + F8):查看所有斷點(diǎn),后面章節(jié)會涉及到。

          > Mute Breakpoints:靜啞斷點(diǎn),啞的斷點(diǎn),選擇這個后,所有斷點(diǎn)變?yōu)榛疑瑪帱c(diǎn)失效,按F9則可以直接運(yùn)行完程序。再次點(diǎn)擊,斷點(diǎn)變?yōu)榧t色,有效。如果只想使某一個斷點(diǎn)失效,可以在斷點(diǎn)上右鍵取消Enabled。

          更新程序,On ‘Update’ actions,執(zhí)行更新操作時所做的事情,一般選擇’Update classes and resources’,即更新類和資源文件。

          一般配合熱部署插件會更好用,如JRebel,這樣就不用每次更改代碼后還要去重新啟動服務(wù)。

          下面的On frame deactivation,在IDEA窗口失去焦點(diǎn)時觸發(fā),即一般你從idea切換到瀏覽器的時候,idea會自動幫你做的事情,一般可以設(shè)置Do nothing,頻繁切換會比較消耗資源的。

          常用的調(diào)試快捷鍵如下:

          Run Shift + F10 運(yùn)行最近一次運(yùn)行的函數(shù)、Debug Shift + F9 運(yùn)行debug最近一次運(yùn)行的函數(shù)

          Run Alt + Shift + F10 初次運(yùn)行指定的函數(shù)
          Debug Alt + Shift + F9 初次debug運(yùn)行指定的函數(shù)
          Stop Ctrl + F2 停止項目
          Step Over F8 越過當(dāng)前函數(shù)
          Forcce Step Over Alt + Shift + F8 強(qiáng)制越過
          Step Into F7 步入當(dāng)前函數(shù)
          Force Step Into Alt + Shift + F7 強(qiáng)行進(jìn)入當(dāng)前函數(shù)
          Smart Step Into Shift + F7 只能進(jìn)入當(dāng)前函數(shù)
          Step out Shift + F8 步出
          Resume Program F9 恢復(fù)程序
          Evaluate Expression Alt + F8 計算表達(dá)式


          3.3 變量查看

          在Debug過程中,跟蹤查看變量的變化是非常必要的,這里就簡單說下IDEA中可以查看變量的幾個地方,相信大部分人都了解。

          1、如下,在IDEA中,參數(shù)所在行后面會顯示當(dāng)前變量的值。

            2、光標(biāo)懸停到參數(shù)上,顯示當(dāng)前變量信息。點(diǎn)擊打開詳情如圖。我一般會使用這種方式,快捷方便。



            3、在Variables里查看,這里顯示當(dāng)前方法里的所有變量。



            4、右鍵添加到watch, 可以查看值

          3.4 計算表達(dá)式

          在前面提到的計算表達(dá)式的按鈕,Evaluate Expression (Alt + F8) 。可以使用這個操作在調(diào)試過程中計算某個表達(dá)式的值,而不用再去打印信息。
          求值計算功能在我們debug過程中,可以很方便的查看程序中所有變量的值,也可以臨時修改程序中變量的值,這個功能能在一定程度上輔助我們進(jìn)行代碼調(diào)試。


            1、按Alt + F8或按鈕,或者,你可以選中某個表達(dá)式再Alt + F8,彈出計算表達(dá)式的窗口,如下,回車或點(diǎn)擊Evaluate計算表達(dá)式的值。

          這個表達(dá)式不僅可以是一般變量或參數(shù),也可以是方法,當(dāng)你的一行代碼中調(diào)用了幾個方法時,就可以通過這種方式查看查看某個方法的返回值。

          3.5 智能步入

          想想,一行代碼里有好幾個方法,怎么只選擇某一個方法進(jìn)入。之前提到過使用Step Into (Alt + F7) 或者 Force Step Into (Alt + Shift + F7)進(jìn)入到方法內(nèi)部,但這兩個操作會根據(jù)方法調(diào)用順序依次進(jìn)入,這比較麻煩。

          那么智能步入就很方便了,智能步入,這個功能在Run里可以看到,Smart Step Into (Shift + F7),如圖

            按Shift + F7,會自動定位到當(dāng)前斷點(diǎn)行,并列出需要進(jìn)入的方法,如圖點(diǎn)擊方法進(jìn)入方法內(nèi)部。

          如果只有一個方法,則直接進(jìn)入,類似Force Step Into。

          3.6 斷點(diǎn)條件設(shè)置

          條件斷點(diǎn)就是當(dāng)滿足某個條件(通常是表達(dá)式)時,debug斷點(diǎn)才會生效;這在循環(huán)中debug是非常有用的;例如我們想要在循環(huán)體中調(diào)試:當(dāng)某個變量滿足某個條件時,需要斷點(diǎn)調(diào)試,來查看詳細(xì)的執(zhí)行流程及變化情況。通過設(shè)置斷點(diǎn)條件,在滿足條件時,才停在斷點(diǎn)處,否則直接運(yùn)行。

          通常,當(dāng)我們在遍歷一個比較大的集合或數(shù)組時,在循環(huán)內(nèi)設(shè)置了一個斷點(diǎn),難道我們要一個一個去看變量的值?那肯定很累,說不定你還錯過這個值得重新來一次。

          1、在斷點(diǎn)上右鍵直接設(shè)置當(dāng)前斷點(diǎn)的條件,如圖,當(dāng)name為eamon:23時,程序執(zhí)行到斷點(diǎn)處停下來。

          有了條件斷點(diǎn),這樣一來,那些不相關(guān)和我們不關(guān)心的代碼就可以直接跳過了。

          2、點(diǎn)擊View Breakpoints (Ctrl + Shift + F8),查看所有斷點(diǎn)。

          Java Line Breakpoints 顯示了所有的斷點(diǎn),在右邊勾選Condition,設(shè)置斷點(diǎn)的條件。

          勾選Log message to console,則會將當(dāng)前斷點(diǎn)行輸出到控制臺,如圖

          勾選Evaluate and log,可以在執(zhí)行這行代碼是計算表達(dá)式的值,并將結(jié)果輸出到控制臺。

          3、再說說右邊的Filters過濾,這些一般情況下不常用,簡單說下意思。

          Instance filters:實例過濾,輸入實例ID。

          Class filters:類過濾,根據(jù)類名過濾

          Pass count:用于循環(huán)中,如果斷點(diǎn)在循環(huán)中,可以設(shè)置該值,循環(huán)多少次后停在斷點(diǎn)處,之后的循環(huán)都會停在斷點(diǎn)處。

          4、異常斷點(diǎn),通過設(shè)置異常斷點(diǎn),在程序中出現(xiàn)需要攔截的異常時,會自動定位到異常行。

          如圖,點(diǎn)擊+號添加Java Exception Breakpoints,添加異常斷點(diǎn)。然后輸入需要斷點(diǎn)的異常類,之后可以在Java Exception Breakpoints里看到添加的異常斷點(diǎn)。

          3.7 多線程調(diào)試

          一般情況下我們調(diào)試的時候是在一個線程中的,一步一步往下走。但有時候你會發(fā)現(xiàn)在Debug的時候,想發(fā)起另外一個請求都無法進(jìn)行了?

          那是因為IDEA在Debug時默認(rèn)阻塞級別是ALL,會阻塞其它線程,只有在當(dāng)前調(diào)試線程走完時才會走其它線程。可以在View Breakpoints里選擇Thread,如圖,然后點(diǎn)擊Make Default設(shè)置為默認(rèn)選項。

          切換線程,在Frames的下拉列表里,可以切換當(dāng)前的線程,如下我這里有兩個Debug的線程,切換另外一個則進(jìn)入另一個Debug的線程。

          3.10 中斷Debug

          想要在Debug的時候,中斷請求,不要再走剩余的流程了?

          有些時候,我們看到傳入的參數(shù)有誤后,不想走后面的流程了,尤其是后面的流程要刪除數(shù)據(jù)庫數(shù)據(jù),這種情況可以通過Force Return,即強(qiáng)制返回來避免后續(xù)的流程。

          點(diǎn)擊Force Return,彈出Return Value的窗口,我這個方法的返回類型為Map,所以,我這里直接返回 results,來強(qiáng)制返回,從而不再進(jìn)行后續(xù)的流程。或者你可以new HashMap<>()。

          四、常用快捷鍵

          IntelliJ IDEA 于 2001 年 1 月誕生,并在 3.0 版本之后屢次獲得各類大獎,從而奠定了它在 IDEA 中地位。而IDEA的快捷鍵能大大提升我們的開發(fā)效率和編程體驗,讓開發(fā)者為之著迷。

          4.1 搜索相關(guān)

          • alt+F7(右鍵“find usage”)/ctr+鼠標(biāo)左擊:查找當(dāng)前類、方法和變量在哪些地方使用過;
          • ctrl+N: 查找類;
          • ctrl+N+:行號(比如String:10 指跳轉(zhuǎn)到String類的第10行 )
          • ctrl+F/alt+f3:在當(dāng)前編輯的文檔中查找;
          • ctrl+shitf+F :在所有文件中查找;
          • ctrl+shift+N :查找文件;
          • double shift:search everywhere;
          • search struct:按照模板搜索代碼。

          4.2 代碼編輯相關(guān)

          • alt+insert:插入構(gòu)造函數(shù),setter/getter方法;
          • ctrl+alt+space :自動補(bǔ)全代碼;
          • ctrl+shift+enter:補(bǔ)全代碼
          • ctrl+/ :代碼注釋;
          • ctrl+shirt+/ : 代碼注釋;
          • ctrl+X:剪切行;
          • ctrl+D:賦值行;
          • ctrl+W:智能選中相關(guān)代碼;
          • ctrl+alt+t : 選中代碼塊 可以添加try catch if-else塊
          • ctrl+J :提示縮寫
          • alt+J: 逐個選中并高亮一個變量
          • shift+F6: rename變量和方法等;
          • ctrl+P:顯示一個方法的參數(shù)情況
          • ctrl+O :重載一個父類或接口的方法
          • alt+1 -->ctrl+shift+> : 首先alt+1定位project,然后再調(diào)整分割線
          • F11:添加書簽,收藏關(guān)鍵業(yè)務(wù)代碼
          • shift+F11:顯示書簽
          • ctrl+enter:重命名書簽
          • ctrl+z/ctrl+shift+z
          • ctrl+shift+f7結(jié)合f3:ctrl+shift+f7可以高亮某個變量,而且隨著鼠標(biāo)的移動,這個高亮是不會消失的(這個很重要)。然后使用f3找到下一個使用該變量的地方。
          • ctrl+shift+. 折疊代碼塊,ctrl++號;還原代碼塊;
          • CTRL+SHIFT+F7:把光標(biāo)放在某個元素中,按下快捷鍵之后,IDE將高亮顯示所選元素所有出現(xiàn)過的地方。

          4.3 導(dǎo)航相關(guān)

          • ctrl+反點(diǎn)號 : 基礎(chǔ)設(shè)置;
          • Ctrl+Shift+V :使用最近復(fù)制過的文本;
          • ctrl+tab :歷史tab導(dǎo)航;
          • ctrl+E :最近瀏覽過的文件;
          • ctrl+shift+e :最近編輯過的文件;
          • ctrl + F12 :列舉類的成員變量和方法;
          • ctrl + H : 查看類的繼承關(guān)系
          • Ctrl+Shift+Backspace(Go to | Last Edit Location)讓你調(diào)轉(zhuǎn)到代碼中所做改變的最后一個地方,多按幾次Ctrl-Shift-Backspace查看更深的修改歷史;
          • ctrl+alt+< / ctrl+alt+> : 可以在前兩次操作之間切換,有點(diǎn)像瀏覽器的前進(jìn)后退功能
          • Ctrl-Alt-Down/Ctrl-Alt-Up快捷鍵則可以在編譯器錯誤信息或者查找操作結(jié)果間跳轉(zhuǎn);
          • ESC :將焦點(diǎn)移到編輯器窗口
          • shift+esc :將焦點(diǎn)移動到編輯器窗口,并且關(guān)閉工具窗口
          • F12 打開上次使用的工具窗口
          • alt+home:瀏覽導(dǎo)航欄;
          • ctrl+]或者ctrl+[:括號匹配:這個也非常有用,因為代碼太長,某個for循環(huán),可能已經(jīng)撐滿整個屏幕了。這個時候,找到某個大括號對應(yīng)的另外一邊就很費(fèi)勁。你可以將光標(biāo)定位在某個大括號一邊,然后使用ctrl+]或者ctrl+[來回定位即可。

          這邊貼上一個思維導(dǎo)圖:

          五、插件推薦

          • 阿里巴巴規(guī)約插件;
          • Key promoter(快捷鍵提示);
          • jrebel(熱部署);
          • findbugs(幫助尋找代碼可能潛在的bug);
          • grep console;
          • .ignore(生成各種ignore文件);
          • lombok(支持各種注解,省略代碼);
          • GsonFormat(一鍵根據(jù)json文本生成java類);
          • Maven Helper;
          • VisualVM Launcher;(jvm調(diào)優(yōu)必備工具);
          • MyBatisCodeHelperPro(mybatis代碼自動生成插件);
          • Rainbow Brackets(彩虹顏色的括號,代碼看起來比較舒服);
          • Translation(翻譯插件);
          • String Manipulation(提供強(qiáng)大的文本轉(zhuǎn)換操作);
          • Nyan progress bar(進(jìn)度條);
          • Background Image Plus(背景圖插件);
          • activate-power-mode OR Power mode II(字節(jié)跳動插件);
          • JUnitGenerator(單元測試生成工具);
          • SequenceDiagram(時序圖生成工具);
          • ledis(Redis可視化工具
          • easyCode

          主站蜘蛛池模板: 亚洲av鲁丝一区二区三区 | 国产一区二区三区在线免费| 无码精品国产一区二区三区免费| 国产日韩一区二区三免费高清 | 国产亚洲一区二区精品| 无码少妇A片一区二区三区| 亚洲视频在线一区二区| 亚洲熟女综合色一区二区三区| 国产女人乱人伦精品一区二区| 亚洲视频一区二区三区四区| 本免费AV无码专区一区| 国产视频一区二区在线观看| 麻豆亚洲av熟女国产一区二| 高清国产精品人妻一区二区| 日本精品一区二区三区在线视频一 | 99久久精品国产免看国产一区 | 午夜福利无码一区二区| 乱色精品无码一区二区国产盗| 国产精品毛片一区二区| 波多野结衣久久一区二区| 麻豆精品久久久一区二区| 久久99国产一区二区三区| 国模一区二区三区| 亚洲国产欧美国产综合一区 | 成人免费视频一区二区三区| 蜜臀AV一区二区| 日韩一区二区在线观看视频 | 国产在线无码一区二区三区视频| 亚洲中文字幕丝袜制服一区| 男人的天堂精品国产一区| 日本韩国一区二区三区| 日美欧韩一区二去三区| 精品国产免费观看一区| 午夜视频一区二区| 无码少妇一区二区三区芒果| 人妻少妇精品视频三区二区一区 | 无码av免费毛片一区二区| 亚洲av乱码一区二区三区| 亚洲男女一区二区三区| 中文字幕一区一区三区| 亚洲福利一区二区|