環(huán)境
服務(wù)器:
- 操作系統(tǒng):centos6
- jdk:1.7
- tomcat:8.5.9
本地:
- 操作系統(tǒng):mac osx 10.11.6
- jdk:1.7
- intellij:2016.2
- tomcat:8.5.9(本地也需要下載tomcat)
應(yīng)用調(diào)試步驟
java應(yīng)用遠(yuǎn)程調(diào)試都是基于jpda體系帚称,所以我們需要將tomcat通過jpda的方式啟動(dòng),即可對(duì)tomcat進(jìn)行遠(yuǎn)程調(diào)試埋涧。
一碘勉、服務(wù)端tomcat配置
假設(shè)服務(wù)端tomcat所在目錄為:/etc/tomcat/
巷挥。對(duì)于tomcat來說,所有運(yùn)行相關(guān)的腳本都位于bin文件夾下验靡,而catalina.sh是啟動(dòng)tomcat最為核心的腳本倍宾。為了使得tomcat能夠支持遠(yuǎn)程調(diào)試雏节,我們需要設(shè)置jpda相關(guān)的參數(shù),但是tomcat官方建議我們不要直接修改catalina.sh里面定義的參數(shù)高职,而是將自定義的參數(shù)值設(shè)置在setenv.sh腳本中钩乍,證據(jù)如下:
# Environment Variable Prerequisites
#
# Do not set the variables in this script. Instead put them into a script
# setenv.sh in CATALINA_BASE/bin to keep your customizations separate.
tomcat里定義的jpda參數(shù)有:
- JPDA_TRANSPORT:設(shè)置jpda傳輸方式,默認(rèn)為dt_socket怔锌,此參數(shù)一般保持默認(rèn)值即可寥粹。
- JPDA_ADDRESS:服務(wù)端jpda監(jiān)聽的地址和端口,默認(rèn)為localhost:8000埃元,即本地的8000端口涝涤。此參數(shù)需根據(jù)實(shí)際情況進(jìn)行修改。比如在本文場(chǎng)景中岛杀,我們需要遠(yuǎn)程調(diào)試tomcat阔拳,所以不能監(jiān)聽在本地,否則外網(wǎng)無法訪問楞件。
- JPDA_SUSPEND:設(shè)置應(yīng)用程序是否一啟動(dòng)就掛起衫生,等待客戶端調(diào)試器連接,默認(rèn)為"n"也就是不掛起土浸,若需要設(shè)置為掛起則修改為"y"罪针。
- JPDA_OPTS:若用戶設(shè)置了該參數(shù),則腳本執(zhí)行時(shí)會(huì)忽略上述三個(gè)參數(shù)黄伊,直接拿JPDA_OPTS的值作為jpda的啟動(dòng)參數(shù)泪酱。
默認(rèn)情況下,tomcat的jpda啟動(dòng)配置為:
-agentlib:jdwp=transport=dt_socket,address=localhost:8000,server=y,suspend=n
我們需要根據(jù)自己的實(shí)際情況設(shè)置合適的參數(shù)还最,具體設(shè)置的步驟如下:
-
在bin文件夾下新建setenv.sh并編輯:
# cd /etc/tomcat/bin # vim setenv.sh
-
設(shè)置JPDA_ADDRESS的值為0.0.0.0:8000:
JPDA_ADDRESS=0.0.0.0:8000
保存退出墓阀。
-
以jpda的方式啟動(dòng)tomcat:
# ./catalina.sh jpda start
此時(shí)tomcat已經(jīng)以jpda的方式啟動(dòng),并且向外網(wǎng)開放了8000端口等待客戶端發(fā)送調(diào)試命令拓轻。
二斯撮、Intellij配置
接下來我們需要配置intellij,具體步驟如下:
-
首先打開Run/Debug Configuration窗口:
-
點(diǎn)擊左上角的?號(hào)扶叉,添加一個(gè)Remote Tomcat:
-
填寫Server配置項(xiàng)勿锅,需要配置的有配置名稱、本地tomcat路徑以及tomcat所在的host和開放的端口:
-
配置debug所需的參數(shù)枣氧。在本例中溢十,由于我們?cè)诜?wù)端的tomcat配置的是dt_socket,端口為8000达吞,所以在這里我們也需要配置為socket和8000端口:
-
選擇剛才的配置(比如在本例中為開發(fā)機(jī))张弛,然后點(diǎn)擊debug圖標(biāo),打斷點(diǎn),開始遠(yuǎn)程調(diào)試:
調(diào)試tomcat源碼
在某些情況下吞鸭,我們需要調(diào)試tomcat自己的運(yùn)行情況寺董,比如為何應(yīng)用里配置的listener沒有加載成功,或者想研究tomcat的應(yīng)用機(jī)制瞒大,這個(gè)時(shí)候螃征,我們就需要直接調(diào)試tomcat的源碼搪桂。
一透敌、下載源碼
俗話說,巧婦難為無米之炊踢械,我們首先需要下載tomcat的源碼酗电。在本例中,我們tomcat的版本為8.5.9内列,下載地址請(qǐng)點(diǎn)擊撵术。下載成功后解壓,我們假設(shè)源碼目錄位于:~/tomcat/
话瞧。
二嫩与、導(dǎo)入源碼
我們需要將源碼導(dǎo)入到intellij中,為接下來的調(diào)試打好基礎(chǔ)交排。
-
下載下來的tomcat是一個(gè)ant工程划滋,為了方便,我們首先將其轉(zhuǎn)化為一個(gè)maven工程埃篓,這樣我們就不需要關(guān)心依賴包的下載問題处坪。我們?cè)谠创a目錄下新建pom.xml文件,pom的內(nèi)容如下:
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.apache.tomcat</groupId> <artifactId>Tomcat8.0</artifactId> <name>Tomcat8.0</name> <version>8.0</version> <build> <finalName>Tomcat8.0</finalName> <sourceDirectory>java</sourceDirectory> <testSourceDirectory>test</testSourceDirectory> <resources> <resource> <directory>java</directory> </resource> </resources> <testResources> <testResource> <directory>test</directory> </testResource> </testResources> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>2.3</version> <configuration> <encoding>UTF-8</encoding> <source>1.7</source> <target>1.7</target> </configuration> </plugin> </plugins> </build> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> <dependency> <groupId>ant</groupId> <artifactId>ant</artifactId> <version>1.7.0</version> </dependency> <dependency> <groupId>wsdl4j</groupId> <artifactId>wsdl4j</artifactId> <version>1.6.2</version> </dependency> <dependency> <groupId>javax.xml</groupId> <artifactId>jaxrpc</artifactId> <version>1.1</version> </dependency> <dependency> <groupId>org.eclipse.jdt.core.compiler</groupId> <artifactId>ecj</artifactId> <version>4.5</version> </dependency> <!-- https://mvnrepository.com/artifact/org.easymock/easymock --> <dependency> <groupId>org.easymock</groupId> <artifactId>easymock</artifactId> <version>3.2</version> <scope>test</scope> </dependency> </dependencies> </project>
-
然后我們將源碼導(dǎo)入到intellij中:
在彈出來的對(duì)話框中選擇剛才源碼所在的目錄架专,并且作為Maven工程導(dǎo)入同窘,即可導(dǎo)入成功。
為了避免待會(huì)執(zhí)行test時(shí)出現(xiàn)問題部脚,我們需要?jiǎng)h除test/util/TestCookieFilter.java文件想邦。
三、配置遠(yuǎn)程調(diào)試
配置步驟與第二部分介紹的配置步驟相同委刘。唯一需要注意的是丧没,服務(wù)端的tomcat在配置jpda參數(shù)時(shí),可以將JPDA_SUSPEND設(shè)置為y钱雷,這樣tomcat啟動(dòng)之后不會(huì)執(zhí)行任何代碼骂铁,而是掛起,直到客戶端連上來后才會(huì)繼續(xù)執(zhí)行罩抗。
其他
如果存在服務(wù)端jpda已經(jīng)啟動(dòng)拉庵,但是客戶端無法連接的情況,請(qǐng)檢查防火墻套蒂。