使用Eclipse進行遠程調試 外加 ant 直接打包到服務器

今天決定做件有意義的事,寫篇圖文並茂的blog,爲什麼要圖文並茂?因爲很多事可能用語言也說不明白,從以前我發表的一篇文章可以看得出來,http://blog.csdn.net/sunyujia/archive/2008/03/23/2211109.aspx 我的朋友們普通反應看完後覺得不知所云,可能是我寫的太簡單,下面步入正題。

       什麼是遠程調試,就是在A機器上利用Eclipse單步跟蹤調試B機器上的Web應用,當然調試A機器上Web應用也是沒有問題的,90%我都是調試本機的Web應用,遠程調試的意義我想我不用說了,大家都會想到它的好處,你可以在本地調試非本地測試環境上的應用,這是件多麼美妙的事,所以我就不說它的好處了,那麼本地調試呢,我喜歡本地調試也採用下面要介紹的方法,爲什麼不用myeclipse,WTP,TomcatPlugin等。

         下面我闡述下在eclipse中啓動Web應用的缺陷:

我本身是非常喜歡使用Myeclipse 做WEB部署的,但是我不喜歡使用Myeclipse啓動tomcat,當然WTP,TomcatPlugin等也不喜歡,使用Myeclipse做部署的好處就是非常靈活,不僅可以部署到Web應用裏面還可以任意部署到某一指定路徑下。但是使用Myeclipse啓動tomcat的話,有如下問題:

         a.卡,比較慢,尤其是同時啓動多個應用.

         b.如果斷點比較多的時候例如100多個,必須把每個不需要使用的斷點先禁用掉或乾脆刪掉,也就是說web應用啓動的時候就已經決定了是debug模式還是run模式。中間不可以切換。

c.一旦eclipse死掉了,web應用也就斷掉了。

d.對於程序來說相對路徑,類加載路徑都是和系統正式運行的情況下完全不同的(要視具體插件而論,每個插件的部署方式都不太一樣),即和Web應用獨立運行的相對路徑和類加載環境有差異,當然熟練的老手可以輕鬆搞定,但是就目前國內情況看,很多初學者在這個問題上還是很苦惱的。

e.順便說一句和本話題無關的,eclipse的console並不能完全模擬cmd控制檯,一些流操作會有問題。例如:PushbackInputStream

那麼使用遠程調試的方法做本地調試有什麼好處呢?

a.       運行速度比較好。

b.       運行期間可以使用eclipse連接web應用做調試,調試完成後可以斷開連接,需要調試的時候可以再重新進行連接,斷點的禁用功能可能就很少派上用場了,因爲相對於在debug模式和run模式間自由切換。

c.       Web應用是獨立運行的,不用擔心eclipse死掉即玩完了。

d.       從開發到上線運行,環境一直可以保持一致。

說了半天,沒有使用過的人可能還是不瞭解,沒關係,可以看完下面的,再回過頭看上面的。

下面我舉一個小例子介紹如何進行遠程調試.

環境:tomcat,Eclipse,做遠程調試不需要任何插件。當然可以使用MyEclipse把Web應用部署到tomcat上面,注意只是部署,一般來講使用遠程調試就不需要配置MyEclipse的Web Server了,MyEclipse在這裏只起到一個copy文件的作用,好在現在Myeclipse可以隨意指定目錄copy了。即 Deployment 對話框中的Custom Location,在這裏推薦大家一個copy文件的小插件,有了這個插件就不需要Myeclipse部署了。

FileSync plugin for Eclipse http://andrei.gmxhome.de/filesync/index.html 這個插件的作者還寫了很多其他好用的插件,大家可以順便看下。

       這次例子的源碼很簡單:

Jsp 源碼如下index.jsp

<%com.syj.test.DebugTest.test("sunyujia test");%>

Hello Remote Debug

DebugTest類的test方法中做個斷點既可測試

 

下面按步驟進行講解

1.    web應用部署到Tomcatwebapp目錄下

2.    修改Tomcat/bin/startup.bat文件,在最前面加上如下代碼

SET CATALINA_OPTS=-server -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8000

注意上面命令必須寫成一行中間不能有換行,-前是空格-後是非空格,由於顯示器分辨率不同,該文章在顯示的時候可能會有換行的情況。

更多Web服務器遠程調試參數可參見

http://blog.csdn.net/sunyujia/archive/2008/03/23/2211109.aspx

3.必須先啓動Tomcat啓動tomcat/bin/startup.bat參下圖

4.在com.syj.test.DebugTest.test方法中設置斷點

5在eclipse中配置debug,配置完成後點擊debug按鈕。如圖:

6.打開瀏覽器訪問在第1步部署的web應用,訪問index.jsp

7.當瀏覽器訪問index.jsp時,由於調用了com.syj.test.DebugTest.test,又因在test方法中設置了斷點,所以程序會被斷點攔截,如圖:

8.不需要調試的時候點擊斷開,需要調試的時候再點擊debug,非常方便,當調試過程中出現引用非本project的源碼時(例如跟蹤到tomcat裏面或spring,hibernate裏面),會提示找不到源碼,點擊相應提示的按鈕(到時候editor區只有一個按鈕,所以大家就不要問哪個按鈕了)可以添加源碼繼續調試,或在配置debug前就把需要的源碼都添加上,在source選項卡里面,因爲具體的基本調試這方面知識不屬於本話題討論範圍內,就不過多介紹了。

遠程調試就介紹到這裏吧。打了這麼多字還是比較辛苦的,轉載請註明出處,謝謝!

2、在用ant可以直接將code 打包到 war 併發送到服務器,下面是一個配置:

[html] view plaincopy

  1. <?xml version="1.0" encoding="UTF-8"?>  

  2. <project default="Sync2-build" name="Sync_test" basedir=".">  

  3.       

  4.     <property file="conf/build_test.properties" />  

  5.       

  6.     <path id="classpath">  

  7.         <fileset dir="${lib}" includes="**/*.jar" />  

  8.         <fileset dir="${tomcat_dir}/lib" includes="**/*.jar" />  

  9.     </path>  

  10.       

  11.     <target name="Sync2-build" depends="make-war,scpWarToServer" description="Building wrapper">  

  12.         <echo message="[${project.name}] Build Completed (deploy.phase is ${deploy.phase})" />  

  13.     </target>  

  14.       

  15.     <target name="src-compile" description="Compile Source">  

  16.   

  17.         <echo message="[${project.name}] Start : Compile Source" />  

  18.         <mkdir dir="${dist}/classes" />  

  19.         <javac srcdir="${src}" destdir="${dist}/classes" encoding="${javac.encoding}" debug="${javac.debug}" debuglevel="${javac.debuglevel}">  

  20.             <classpath refid="classpath" />  

  21.             <include name="**/*.java" />  

  22.         </javac>  

  23.         <echo message="[${project.name}] Complete : Compile Source" />  

  24.     </target>  

  25.       

  26.     <target name="make-war" depends="src-compile" description="Creating .war file">  

  27.         <echo message="[${project.name}] Start : Creating War file"/>  

  28.         <mkdir dir="${WebContent}/WEB-INF/classes"/>  

  29.         <move todir="${WebContent}/WEB-INF/classes">  

  30.             <fileset dir="${dist}/classes" />  

  31.         </move>  

  32.         <copy todir="${WebContent}/WEB-INF/classes">  

  33.             <fileset dir="${src}" excludes="**/*.java" />  

  34.         </copy>  

  35.         <copy todir="${WebContent}/WEB-INF/classes/conf" overwrite="true">  

  36.             <fileset dir="${configDir}" />  

  37.         </copy>  

  38.         <war destfile="${dist}/${project.war}" >  

  39.             <fileset dir="${WebContent}" />  

  40.         </war>  

  41.         <delete dir="${WebContent}/WEB-INF/classes"></delete>  

  42.         <echo message="[${project.name}] Complete : Creating War file"/>  

  43.     </target>  

  44.       

  45.     <target name="scpWarToServer" description="Copy Cmpp.war to Servers">  

  46.         <echo message="[${project.name}] Start : SCP War file To ${IPADDR}@${IPADDR}:${targetDir}"/>  

  47.         <scp todir="${USERNAME}:${PASSWORD}@${IPADDR}:${targetDir}" trust="true" >  

  48.             <fileset dir="${dist}">  

  49.                 <include name="${project.war}"/>  

  50.             </fileset>  

  51.         </scp>  

  52.         <echo message="[${project.name}] Complete : SCP War file"/>  

  53.     </target>  

  54.       

  55. </project>  


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