導航:首頁 > 源碼編譯 > ant編譯缺點

ant編譯缺點

發布時間:2022-08-18 12:42:01

1. hudson一個有關問題,為什麼 ant 執行成功 Hudson去執行失敗

安裝好後,打開hudson,選中Depoly war/ear to Container(發布war/ear到容器),在WAR/EAR files中填寫打包後生成的war/ear文件名;在Container中選擇Tomcat6.x;在Tomcat URL中填入要備份的中國址(要發布到的地址及應用上下文名稱);如果tomcat安裝了自身的管理應用,則需要填入管理員名稱和密碼。 保存配置再重新構建一次,打開tomcat的webapps目錄,就會發現web.war自動過來了,大功告成。 當然也可以調用批處理, 構建設置-build選項-Execute Windows batch command,使用批處理命令直接移war包。不過這樣的缺點在於,移動失敗的時候,會顯示批處理命令執行成功,hudson是不會報錯的,需要人工檢查

2. 英語當中-ant的後綴和-ent的後綴有什麼區別

1、-ant 的意思有:
(1)表形容詞,「 …的,如:exuberant a 茂盛的(ex出+uber果實累累;參考:uberty豐饒)vibrant a 振動的,生氣勃勃的(vibr振動;參考:revibrate再震動)extravagant a 奢侈的(extra出+vag走…走過頭…奢侈)intoxicant a 醉人的(in進入+toxic毒…酒精中毒)discordant a 不一致的(dis不+cord心…不是一條心)resistant a 抵抗的(resist抵抗,對抗)
(2)表名詞,「…人」,如:accountant n 會計(ac+count計數)assistant n 助手(assist幫助)inhabitant n 居民(inhabit居住)participant n 參與者(participate參加)
(3)表名詞,「…劑「,如:disinfectant n 消毒劑(disinfect消毒)deodorant n 除臭劑(de去掉+odor氣味)stimulant n 興奮劑(stimul=sting刺)coagulant n 凝結劑(co 一起+agul凝聚)retardant n 阻化劑(retard阻止)
2、-ent 的意思有:

(1)表示形容詞,「…的」,如:transient a 短暫的(trans轉移+I+ent)sentient a 有知覺的(sent感覺+I+ent)prevalent a 流行的,盛行的(來自動詞prevail.pre+vail力量)

(2)表名詞,「…葯劑」 ,如:detergent n 洗滌劑(deterg擦凈+ent;參考:deterge擦凈,洗凈)absorbent n 吸收劑(absorb吸收)solvent n 溶劑(solve溶解)

(3)表名詞,「…人」,如:student n 學生(study學習)president n 總統;校長(preside主持)antecedent n 先行者(ante前+ced走+ent)resident n 居民(inhabit居住)
correspondent n 通信者(correspond通信)

3. android uiautomator 自動化測試如何打log,方便查看測試結果

互相學習android自動化測試,請關注我的微博:weibo.com/ganchaojiang
一、一個BUG引發的問題
如果研發過程中有一個BUG:「不斷的切換手機語言出現花屏現象」。這個問題我們如何驗證呢?我想,最好的方式應該是自動化測試。
那麼,自動化測試可以完成哪些任務呢?
簡單的說,那些重復性的測試工作,都可以交給自動化完成:
1、設置手機的語言
2、添加、刪除、收藏聯系人
3、撥號、掛斷
4、甚至發送簡訊、收藏簡訊

如果需要上面的功能,那麼就開始自動化之旅吧。

二、Android自動化測試簡單介紹
Android自動化測試主要分為Monkeyrunner、Rubotium、UiAutomator、Monkey(在我看來這個不算)等。主要特點:
1、Monkeyrunner:優點:操作最為簡單,可以錄制測試腳本,可視化操作;缺點:主要生成坐標的自動化操作,移植性不強,功能最為局限;
2、Rubotium:主要針對某一個APK進行自動化測試,APK可以有源碼,也可以沒有源碼,功能強大;缺點是針對APK操作,而且需要對APK重新簽名(有工具),因此操作相對復雜;
3、UiAutomator:優點:可以對所有操作進行自動化,操作簡單;缺點:Android版本需要高於4.0,無法根據控制項ID操作,相對來說功能較為局限,但也夠用了;
4、Monkey:准確來說,這不算是自動化測試,因為其只能產生隨機的事件,無法按照既定的步驟操作;
由上面介紹可以有這樣的結論:測試某個APK,可以選擇Rubotium;測試過程可能涉及多個APK,選擇UiAutomator;一些簡單的測試,選擇Monkeyrunner;

本文主要介紹UiAutomator的使用方法。

三、環境搭建
3.1、必備條件:
1、JDK
2、SDK(API高於15)
3、Eclipse(安裝ADT插件)
4、ANT(用於編譯生成jar)

3.2、簡要步驟:
1、安裝JDK並添加環境變數。
安裝後,一定要通過java_HOME的方式添加環境變數,即先建立JAVA_HOME變數,然後在path中添加%JAVA_HOME%\bin;
2、添加SDK環境變數。
一定要先建立ANDROID_HOME,然後把%ANDROID_HOME%\tools添加到path中;
3、安裝Eclipse,並安裝ADT插件。
4、安裝ANT工具,並添加環境變數。

同樣一定要先建立%ANT_HOME%變數,然後在path中添加%ANT_HOME%\bin

四、詳細操作
4.1、建立工程
用Eclipse新建Java Project,注意,不是Android Project!
4.2、添加JUnit庫
next->Libraries->Add Library

4.3、添加Android庫
Add External JARs:
找到路徑Android-sdk\platforms\android-17\下面的android.jar和uiautomator.jar添加進來:
所有庫添加完應該是這個樣子:

4.4、在src中添加包,然後添加class文件
文件內容為:

[java] view plain
package com;
import com.android.uiautomator.core.UiObject;
import com.android.uiautomator.core.UiObjectNotFoundException;
import com.android.uiautomator.core.UiScrollable;
import com.android.uiautomator.core.UiSelector;
import com.android.uiautomator.testrunner.UiAutomatorTestCase;

public class Runner extends UiAutomatorTestCase {

public void testDemo() throws UiObjectNotFoundException {
getUiDevice().pressHome();
// 進入設置菜單
UiObject settingApp = new UiObject(new UiSelector().text("Settings"));
settingApp.click();
//休眠3秒
try {
Thread.sleep(3000);
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
// 進入語言和輸入法設置
UiScrollable settingItems = new UiScrollable( new UiSelector().scrollable(true));

UiObject languageAndInputItem = settingItems.getChildByText(
new UiSelector().text("Language & input"), "Language & input", true);
languageAndInputItem.clickAndWaitForNewWindow();

}
}
上面工程路徑在e:\workspace\AutoRunner,類全名為com.Runner,至於具體的作用我們現在不去關心。

4.5、找到SDK ID
CMD進入\Android-sdk\tools\目錄下,運行命令:

android list

查看對應android版本的SDK的ID值,當前是60;

4.6、創建build文件
仍然在\Android-sdk\tools\目錄下,運行命令:
android create uitest-project -n <name> -t <android-sdk-ID> -p <path>
比如:
android create uitest-project -n AutoRunner -t 60 -p e:\workspace\AutoRunner
上面的name就是將來生成的jar包的名字,可以自己定義,android-sdk-ID就是上面看到的6;path是Eclipse新建的工程的路徑;運行命令後,將會在工程的根目錄下生成build.xml文件。如果沒生成,檢查上面的步驟。

4.7、編譯生成jar
CMD進入項目的工程目錄,然後運行ant build,將使用ant編譯生成jar,成功將會提示:

然後會在bin目錄下生成jar文件。

4.8、push並運行jar
adb push <jar文件路徑> data/local/tmp
adb shell uiautomator runtest <jar文件名> -c <工程中的類名,包含包名>
比如:
adb push e:\workspace\AutoRunner\bin\AutoRunner.jar data/local/tmp
adb shell uiautomator runtest AutoRunner.jar -c com.Runner

然後就能看到手機會按照Runner中的步驟自動執行。具體效果就是,進入設置菜單,然後再進入「語言和輸入法」菜單

五、代碼分析
我們從幾個最重要的對象來介紹。

5.1、UiDevice對象
getUiDevice()的方法可以得到一個UiDevice的對象,通過這個對象可以完成一些針對設備的動作:
click(int x, int y)
----在(x,y)表示的像素地方點擊
pressBack()
pressDelete()
pressEnter()
pressHome()
pressMenu()
pressSearch()
----點擊相應的按鍵
wakeUp()
----當手機處於滅屏狀態時,喚醒屏幕,並解鎖。
swipe(startX, startY, endX, endY, steps)
----在手機上滑動,從(startX,startY)到(endX,endY)。steps表示滑動的這個距離分為幾步完成,數目越少,滑動幅度越大。
setOrientationLeft()
setOrientationRight()
----將手機向相應方向旋轉。
setOrientationNatural()
----將手機旋轉狀態回歸正常。

5.2、UiSelector對象
這個對象可以理解為一種條件對象,描述的是一種條件,經常配合UiObject使用,可以得到某個(某些)符合條件的控制項對象。
checked(boolean val)
----描述一種check狀態為val的關系。
className(className)
----描述一種類名為className的對象關系
clickable(boolean val)

http://blog.csdn.net/g19920917/article/details/16131565

4. 怎麼在ant中調用javascript

有兩種方法, 一個是用java寫自定義的ant task來解密傳給ant script的密碼. 然後用明文密碼來連接資料庫. 寫java的缺點在於每次都要事先編譯好這個ant task. 還有一種方法是在ant script寫一個javascript task. 當然javascript可以調用java的解密函數, 這樣不用每次運行ant script前都編譯task. 具體腳本如下:

<project name="sfamx.cleanupdb" default="cleanup.db.logging"> <dirname property="sfamx.ddl.dir" file="${ant.file.sfamx.ddl.build}"/> <target name="cleanupall" depends="replace.db.password, cleanup.db.logging"/> <path id="jdbc.classpath"> <fileset dir="${db.driver.path}" includes="*.jar"/> </path> <property name="plaintext.password" value="${plainText}"/> <target name="replace.db.password"> <script language="javascript"> <classpath> <!-- for xxx 3.2 --> <pathelement location="${tibco.home}/components/shared/1.0.0/plugins/com.tibco.security.tibcrypt_2.15.0.009.jar"/> <pathelement location="${tibco.home}/components/shared/1.0.0/plugins/co.slf4j.log4j12_1.6.200.001/slf4j-log4j12-1.5.2.jar"/> <pathelement location="${tibco.home}/components/shared/1.0.0/plugins/co.slf4j.log4j12_1.6.200.001/slf4j-api-1.5.2.jar"/> <pathelement location="${tibco.home}/components/shared/1.0.0/plugins/co.apache.log4j_1.2.400.002/log4j-1.2.15.jar"/> <!-- for xxx 3.1.5 --> <pathelement location="${tibco.home}/components/shared/1.0.0/plugins/com.tibco.security.tibcrypt_2.14.300.006.jar"/> <pathelement location="${tibco.home}/components/shared/1.0.0/plugins/co.slf4j.log4j12_1.5.101.001/slf4j-log4j12-1.5.2.jar"/> <pathelement location="${tibco.home}/components/shared/1.0.0/plugins/co.slf4j.log4j12_1.5.101.001/slf4j-api-1.5.2.jar"/> <pathelement location="${tibco.home}/components/shared/1.0.0/plugins/co.apache.log4j_1.2.300.004/log4j-1.2.15.jar"/> </classpath> <![CDATA[ importPackage(com.tibco.security); var encryptedPassword = project.getProperty("admin.db.password"); var decryptedPassword = ObfuscationEngine.decrypt(encryptedPassword); var plainText = new java.lang.String(decryptedPassword); project.setProperty("plaintext.password", plainText) ]]> </script> </target> <target name="cleanup.db.logging" depends="replace.db.password" description="Run ddl to cleanup commonlogging tables in external database for amx administrator"> <sql driver="${admin.db.driver}" url="${admin.db.url}" userid="${admin.db.username}" password="${plaintext.password}" print="yes"> <classpath refid="jdbc.classpath"/> <transaction src="./${db.ddl.path}/drop_commonlogging.ddl"/> </sql> </target> </project>

輸出

05/25/12 18:46:55.406 INFO: [ProcessWrapper] Executing: D:\build\fabric\DSEngine\resources\win32\wrappid.exe,D:\build\fabric\DSEngine\work\yangxiaoming-lt-1\antcall.pid,D:/build/fabric/DSEngine/work/yangxiaoming-lt-1/tibcoamx/tibcojre/1.6.0/bin/java,-cp,D:/build/fabric/DSEngine/work/yangxiaoming-lt-1/tibcoamx/tools/lib/antpackage.jar,org.apache.tools.ant.launch.Launcher,-f,D:\build\fabric\DSEngine\work\yangxiaoming-lt-1\scripts\cleanupDDL\cleanupDB.xml,-Dadmin.db.password=#!Panbl6s1FhkBUM70G9T+okR+fv5Nwoq+fYUx+SLzZi8=,-Dadmin.db.url=jdbc:sqlserver://192.168.71.99:1433;databasename=amxdb,-Dadmin.db.username=sa,-Ddb.ddl.path=mssql300,-Ddb.driver.path=D:\build\fabric\DSEngine\work\yangxiaoming-lt-1/fabric/mssql2008_driver,-Dtibco.home=D:/build/fabric/DSEngine/work/yangxiaoming-lt-1/tibcoamx,-Dadmin.db.driver=com.microsoft.sqlserver.jdbc.SQLServerDriver,cleanup.db.logging,
05/25/12 18:46:55.609 INFO: [ProcessWrapper] [STDOUT] Buildfile: D:\build\fabric\DSEngine\work\yangxiaoming-lt-1\scripts\cleanupDDL\cleanupDB.xml
05/25/12 18:46:55.875 INFO: [ProcessWrapper] [STDOUT]
05/25/12 18:46:55.875 INFO: [ProcessWrapper] [STDOUT] replace.db.password:
05/25/12 18:46:55.984 INFO: [ProcessWrapper] [STDOUT] [script] log4j:WARN No appenders could be found for logger (com.tibco.security.TIBCOSecurity).
05/25/12 18:46:55.984 INFO: [ProcessWrapper] [STDOUT] [script] log4j:WARN Please initialize the log4j system properly.
05/25/12 18:46:56.500 INFO: [ProcessWrapper] [STDOUT] [echo] Tibc02008
05/25/12 18:46:56.500 INFO: [ProcessWrapper] [STDOUT]
05/25/12 18:46:56.500 INFO: [ProcessWrapper] [STDOUT] cleanup.db.logging:
05/25/12 18:46:56.687 INFO: [ProcessWrapper] [STDOUT] [sql] Executing resource: D:\build\fabric\DSEngine\work\yangxiaoming-lt-1\scripts\cleanupDDL\mssql300\drop_commonlogging.ddl
05/25/12 18:46:56.687 INFO: [ProcessWrapper] [STDOUT] [sql] 0 rows affected
05/25/12 18:46:56.687 INFO: [ProcessWrapper] [STDOUT] [sql] 1 of 1 SQL statements executed successfully
05/25/12 18:46:56.703 INFO: [ProcessWrapper] [STDOUT]
05/25/12 18:46:56.703 INFO: [ProcessWrapper] [STDOUT] BUILD SUCCESSFUL
05/25/12 18:46:56.703 INFO: [ProcessWrapper] [STDOUT] Total time: 1 second

在ant中使用javascript, 在javascript又調用了java, 所以一定要注意數據的boxing和unboxing. 比如用java的方法返回decryptedPassword 時, 它其實已經被unboxing了, 失去了java的char[]類型, 但內在傳遞的值是不變的, 所以需要對它重新boxing, 讓它成為java的String類型, 在boxing他的char[]值同時解碼, 獲得實際字元串, 也就是明文. 再將它傳遞給javascript的變數.

5. Ant Design 和 Semi Design 有什麼區別,各自的優劣勢

如下:

位元組的兩個項目網站都不注重鏈接的語義化,相比之下 ali 鏈接的語義化要規范太多。

semi design 官網你能看到的鏈接都適用了 div + pointer 指針樣式 + js 控制跳轉。這還可以說是規范,都是用了 div。

arco design 一半使用了 a 一半使用了 div,可以說毫無規范了。

介紹

前端開發是創建WEB頁面或APP等前端界面呈現給用戶的過程,通過HTML,CSS及JavaScript以及衍生出來的各種技術、框架、解決方案,來實現互聯網產品的用戶界面交互。

前端開發從網頁製作演變而來,名稱上有很明顯的時代特徵。在互聯網的演化進程中,網頁製作是Web1.0時代的產物,早期網站主要內容都是靜態,以圖片和文字為主,用戶使用網站的行為也以瀏覽為主。

6. 比較分析不同Java程序調試環境的異同和優缺點。

充分利用 J2EE 調試工具--Java 開發環境的增強功能有助於調試J2EE 應用程序

我的第一個 Java 項目包括接管由我所在公司的一個部門編寫的一個門戶,該部門現在已經關閉了。當我凝視著運行門戶代碼的伺服器終端時,我看到一行接一行的調試代碼涌現在在屏幕上。進一步的研究之後,我發現 JavaServer Pages ( JSP )和 servlet 中到處都是 System.out.println (「 [Debug Statement] 」)。由於我對我接管的語言和代碼有些陌生,我堅持自己為終端編寫調試語句,因為我不知道調試 Java 代碼的其他方法。

然而,在漫長而乏味的調試過程中,我不斷失敗。我發現在將代碼提交給 QA 之前很難移除所有的調試語句。同樣,調試涉及到重新編譯、重新部署的代碼和在執行代碼時觀察終端也非常困難。為了查找代碼中斷的點,我時常在方法中的每一行代碼後加入 println 語句,在這種情況下,過程常常為找到的每一個故障重復。

最後,在我發現 Java 平台調試架構( Java Platform Debugger Architecture , JPDA )的時候,我擺脫了調試夢魘。 JPDA 是一套組成構建調試應用程序框架的 API 。幸運的是,我們大多數人不需要自己考慮創建調試應用程序的事,因為這些是與主要的 IDE 捆綁在一起提供的。調試在這些新的 IDE 中是一個相當簡單和輕松的過程。

您必須執行幾個步驟才可以使您的開發環境成為您可以進行調試的環境。如果您正在使用 Sun 的 Java Virtual Machine ( JVM )進行調試,您必須在命令行中指定啟動 J2EE 容器的時間,其中, JVM 已經以調試模式啟動。為了執行該操作,只需在 java 命令的後邊添加 -Xdebug 參數。我們隨後將研究一個命令行調試參數的示例。為了載入 Java Debug Wire Protocol ( JDWP ) 的 JPDA 參數實現,需要使用具有隨後指定的 JPDA 選項的 -Xrunjdwp 。該參數載入進行中的調試資料庫,而其子選項提供了調試伺服器如何與調試客戶端交互的細節。我們將研究一份 JPDA 子選項列表,該列表可以幫助設置正確的調試環境。

首先,指定傳輸選項。 transport 用於在調試程序和 VM 使用的進程之間通訊。 Win32 平台的 VM 提供了很多其他平台使用的共享內存傳輸和套接字傳輸。共享的內存傳輸(僅在 Win32 平台中受支持)要求調試應用程序和目標 VM 存放在相同的機器中。套接字傳輸使用標準的 TCP/IP 套接字來與調試信息通信。調試客戶端和調試伺服器可以位於使用套接字傳輸的相同或者不同的機器中。對於遠程調試 Enterprise JavaBeans ( EJB )和 servlet 來說,我們關注於使用套接字傳輸,因為它受所有平台支持:

transport=dt_socket

我們正在啟動的 VM 需要作為調試伺服器執行。如前所述,調試伺服器是運行以調試模式編譯的應用程序的 JVM (以後講述),並具有允許客戶端連接和 監聽 應用程序的開放套接字。為了使 VM 成為一台伺服器,需要提供伺服器選項,並將其值設置為 yes :
server=yes

接下來,我們需要指出調試伺服器將要使用的埠號,同時也是埠客戶端用來連接伺服器的埠號。只有知道正在運行伺服器的埠號的客戶端才可以建立連接,因為不存在標準的調試埠,也就是 HTTP 伺服器。任何未使用的埠都適用。在我們的情況中,我們使用了埠 4000 :

address=4000

避免混亂

您可以提供一個選項,僅在調試客戶端建立連接之後啟動 VM ( suspend=y )。我的 J2EE 容器具有一種服務,它可以在容器登錄之後立即啟動,而不用添加 suspend=y 到參數列表。我發現在我的那項服務啟動之前,啟動客戶端並連接到 VM 有些混亂 。使用該選項,我就可以啟動 VM 。當它暫停的時候,我打開 IDE ,設置中斷點,然後建立調試連接。一旦連接建立,容器繼續登錄,而我可以一步步啟動服務。

onthrow 選項推遲初始化 JDWP 資料庫,直到引發指定類的異常。例如,如果需要在引發異常(如 ServletException )時執行一些操作,您需要包含如下選項:

onthrow=
javax.servlet.ServletException

同樣, JDWP 資料庫初始化也可以推遲,直到引發異常但沒有捕獲時,該操作可以通過提供 onuncaught=y 選項指定。

啟動選項指出 VM 應當基於調試事件來啟動應用程序,該事件與 onthrow 或者 onuncaught 選項一起提供:

launch=/usr/home/mydir/debugapp

讓我們研究一些我經常使用的命令行調試參數的示例。在第一個示例中,我們將指導 VM 使用套接字傳輸。調用的 VM 是伺服器,它應當監聽埠 4000 。我們還指出 VM 應當在調試伺服器建立連接後才可以暫停:

-Xrunjdwp:transport=
dt_socket,server=y,address=4000,
suspend=n

第二套參數類似於前一個示例,不同的是其傳輸現在是一種共享內存傳輸(僅限於 Windows ):

-X runjdwp:transport=
dt_shmem,server=y,address=4000,
suspend=n

第三套參數會導致 VM 通過埠 4000 上的套接字連接附加到正在運行中的調試伺服器中,這將要求 VM 以調試模式運行在埠 4000 上的 SomeHost 中:

-X runjdwp:transport=
dt_socket,server=n,address=
SomeHost:4000, suspend=n

第四套參數將導致 VM 在開始的時候暫停。 VM 將等待建立與調試客戶端的連接,然後再繼續載入。 VM 使用埠 4000 來監聽客戶端,並使用套接字連接:

-X runjdwp:transport=
dt_socket,server=y,address=
4000, suspend=y

使用第五套參數,當引發 javax.management.InstanceNotFoundException 的時候, VM 將暫停,並啟動 c:\debug.bat 。 debug.bat 腳本可以啟動調試應用程序,該應用程序可以連接伺服器,並開始調試會話:

-Xrunjdwp:transport=
dt_socket,address=4000,server=
y,suspend=y,onthrow=
javax.management.
InstanceNotFoundException,
launch=c:\debug.bat

最後一套參數將在引發異常但沒有捕獲的時候執行 debug.bat 腳本:

-Xrunjdwp:transport=
dt_socket,address=4000,server=
y,suspend=n,onuncaught=
y,launch=c:\debug.bat

我們現在可以使用一些現有的通用 IDE 來說明如何調試 J2EE 。我們在示例中使用的 J2EE 容器是 JBoss 伺服器;然而,任何標準的 J2EE 容器都是可用的。 JBoss 伺服器從 bin 目錄中的 run.bat 文件啟動。 BAT 文件可以接受調試命令行自變數,並將它們發送給 JVM 。作為一名開發人員,我發現我很少需要啟動開發環境(除了調試模式),因此我將 run.bat 復制到一個名叫 debug.bat 的新文件中,並且在該文件中添加了調試參數。以下是 JBoss debug.bat 文件的內容:

rem Read all command line
rem arguments
set ARGS=
:loop
if [%1] == [] goto endloop
set ARGS=%ARGS% %1
shift
goto loop
:endloop
set JAVA_OPTS=
-Dprogram.name=run.bat
set JAVAC_JAR=
%JAVA_HOME%\lib\tools.jar
set RUNJAR=.\run.jar
set JBOSS_CLASSPATH=
%JBOSS_CLASSPATH%;%JAVAC_JAR%;
%RUNJAR%
rem Set the debug options here
set DEBUG_OPTS =
-Xdebug -Xnoagent
-Djava.compiler=
NONE -Xrunjdwp:transport=
dt_socket,address=
4000,server=y,suspend=n
Java %JAVA_OPTS% %DEBUG_OPTS%
-classpath "%JBOSS_CLASSPATH%"
org.jboss.Main %ARGS%

調試信息

在將 IDE 的調試程序連接到伺服器之前,將應用程序放在伺服器上。確保使用打開的調試信息對應用程序進行編譯。這樣做可以在已經編譯的類文件中提供行編號方式。如果您使用 Ant 來構建項目,請確保 javac 任務包含:
debug="on"

否則, IDE 應當包含在編譯期間打開調試的選項。

我提供了 從簡單的 DocBook 文件生成 PDF E-Books 的 J2EE 應用程序 。該應用程序由會話 bean 、 JSP 文件和 servlet 組成。會話 bean 可以列舉存儲在伺服器中的 DocBook 文檔和 XSL 樣式表文件。 JSP 使用會話 bean 來顯示書籍和 XSL 文件的列表,以下拉列表的方式顯示。用戶可以選擇他們要將哪些文件轉換成 PDF ,並指定要將哪些樣式表用於轉換。作為最後一個步驟, servlet 將 DocBook 文件轉換為 PDF ,並將 PDF 顯示在用戶的 Web 瀏覽器中。 Apache 的 FOP 資料庫用於轉換文檔(參閱 資源 )。

如果您想使用我構建的應用程序,請編輯 Ebook.properties 文件,並提供到您的機器中某個位置的有效路徑,該位置中存放 DocBook 和 XSL 文件。示例 DocBook 和 XSL 文件還可以下載。請將這些文件存放在您指定的位置中。

我已經提供了一份 Ant build.xml 文件來構建應用程序和將類封裝到企業歸檔文件( EAR )中。將 EAR 文件部署到 JBoss 的目錄中,並啟動具有以下參數的容器:

-Xrunjdwp:transport=
dt_socket,server=y,address=4000,
suspend=n

現在,我們已經准備好在調試模式中連接代碼

Intelli-J IDEA 調試

為了在Intelli-J中連接調試伺服器,只需點擊工具條中的Debug按鈕,打開調試配置界面即可。然後選擇Remote標記,來查看哪些調試配置可用。最初,沒有配置可以使用。點擊屏幕左上方的+按鈕來添加新的遠程調試配置。輸入主機名稱或者IP地址和要連接到的埠(參見圖1)。

圖 1. 遠程 Intelli-J 調試
圖中有一個 Intelli-J 中的連接到本地機器的遠程調試配置。

確保伺服器啟動時具有已經為 VM 進行設置的調試選項,然後點擊 Debug 按鈕。您應當連接到 VM ,並且您的調試屏幕中將出現在 Intelli-J 屏幕的底部。您可以通過點擊 Edit 窗口右邊空白區域來輕松的在 IDE 中設置中斷點。在中斷的地方會出現一個紅點。如果圓點中有一個 X ,則您指定的中斷點無效,或者伺服器中的代碼在編譯時沒有打開調試。如果圓點中有一個校驗標記,則說明您已經成功的連接到調試伺服器,和已經選擇了有效的中斷點位置。您可以進行調試了。如果您使用的是本文提供的 示例代碼 ,則請在 EJB 的 getDocBooks() 方法中設置中斷點。將 Web 瀏覽器指向 http://localhost:8080/DocBookToPDF/DocBook.jsp 。您的瀏覽器應當顯示為懸掛狀態,並且 Intelli-J 在設置中斷點的行中應當有一個藍條。恭喜,您正在調試 EJB ,您的 IDE 已經為進入代碼准備就緒(參見 圖 2)。

圖 2. Intelli-J 中斷點
Intelli-J 中斷點在其設置的地方以藍色突出顯示。圖中,中斷點已經設置,可以進行下一步驟。

們正在調試的方法查找在 DocBookToPDF.properties 文件中指定的目錄,並返回所有以 XML 為結尾的文件。該方法假設每一個文檔都是 DocBook 文件。在我們繼續之前,確保目錄具有有效的 DocBook 和 XSL 文件,以將文檔轉換為 PDF 。

完成進入代碼之後,注意 JSP 在下拉列表中顯示 DocBook 和 XSL 文件。下一步驟是調試 DocBookToPDFServlet servlet 。將中斷點放在 Edit 窗口左邊, processRequest() 方法中的某個位置。在 Web 瀏覽器中選擇 DocBook 文件和有效的 XSL 文件,然後點擊 Web 頁面中的 Generate Book 按鈕。 servlet 中的中斷點將呈現為藍色, servlet 代碼可以進入。

NetBeans/Forte 調試
在 NetBeans 中創建一個項目,該項目包含您需要調試的代碼。使用打開的調試選項編譯它,並像在前面 Intelli-J 部分中討論的那樣,將應用程序部署到伺服器中。我提供的 Ant build XML 文件演示了如何以調試模式編譯代碼。

為了開始調試,請選擇 Debug | Start Session | Attach 菜單選項。這時,將出現一個對話框,要求填寫連接信息。指定 JPDA 為調試程序, SocketAttach 為連接程序, localhost 為主機,埠 4000 為要連接到的器。點擊 OK 按鈕,您應當附加到 J2EE 容器的 VM (參見 圖 3 )中。 Debug 窗口將成為活動窗口,您現在可以使用相同的方式來設置中斷點,就像使用 Intelli-J 那樣。在 EJB 的 getDocBooks() 方法中設置中斷點,並將 Web 瀏覽器指向 http://localhost:8080/DocBookToPDF/DocBook.jsp 。 Web 頁面應當顯示為懸掛狀態,而 NetBeans 中的中斷點將被突出顯示(參見 圖 4 )。您可以在 IDE 中點擊調試工具欄中的 Step Over 和 Step Into 按鈕來進入 NetBeans 中的代碼。您還可以在界面左邊框架中設置觀察。

圖 3. 遠程 NetBeans 調試
圖中是 NetBeans 中本地機器的遠程調試配置

圖 4. NetBeans 中斷點
NetBeans 中斷點在活動狀態時以綠色突出顯示。圖中是已經設置的中斷點,已經准備好進行調試。

為了調試 servlet ,請在 processRequest() 方法中設置中斷點。當 JSP 在 Web 瀏覽器中完成載入,並在機器中顯示 DocBooks 和 XSL 文件的列表之後,選擇 DocBook 文件和 XSL 文件,然後點擊 Web 頁面中的 Generate Book 按鈕。在 NetBeans 中,中斷點將變為突出顯示狀態,您可以開始調試 servlet 代碼了。

Eclipse

為了在Eclipse中調試,需要在Java透視圖中創建一個項目。如果您正在使用DocBook-to-PDF代碼示例,則使用Ant build.xml編譯代碼,以編譯打開調試的類。突出顯示Java應用程序,並選擇Run | Debug菜單項。此時,將出現一個對話框。突出顯示Remote Java Application,然後點擊對話框左手邊底部的New按鈕。對話框項目的名稱應當為在Java透視圖中突出顯示的項目的名稱。對話框中連接部分的主機欄位應當是您需要連接到的伺服器,埠欄位中應當具有容器的VM正在使用的調試埠(參見圖5)

圖 5. 遠程 Eclipse 調試
圖中是 Eclipse 中本地機器的遠程調試配置。

接下來,點擊Debug按鈕。Eclipse將轉到Debug透視圖。為了調試代碼,請返回到Java透視圖中,並在編輯器中打開EJB文件或者servlet。雙擊EJB的getDocBooks()方法的左手邊的窗格來設置一個中斷點。有效的中斷點具有一個藍色的圓球,並且圓球中有一個校驗標記。如果中斷點中沒有校驗標記,雙擊該中斷點,然後嘗試不同的點。

接下來,將Web瀏覽器指向相同的JSP和servlet文件,就像前面NetBeans和Intelli-J中所描述的那樣。當設置中斷點時,中斷點所在的行將被突出顯示,您可以像使用其他IDE那樣來調試代碼(參見圖6)。

圖 6. Eclipse 中斷點
Eclipse 中有效的中斷點以藍色圓球和校驗標記指示。該圖說明了如何在 Eclipse IDE 中調試代碼。當前的調試位置以綠色突出顯示

使用具有流行 IDE 的 JPDA 資料庫應當會縮短開發時間,並且允許您創建包含極少缺陷的更優秀的代碼。如果您仍在代碼中添加 System.out.println() 語句,以發現程序失敗或者中斷的位置,那麼請住手!您是在浪費時間和金錢。 Java IDE 已經推出很長時間了,它可以提供功能強大的調試工具。您僅需要對啟動 VM 的方法做一些小小的改動,就可以輕松地調試 Java 應用程序了。

閱讀全文

與ant編譯缺點相關的資料

熱點內容
vfl90壓縮機是哪個廠家 瀏覽:676
安卓系統游戲怎麼開發 瀏覽:410
抖助力app綁定的銀行卡怎麼辦 瀏覽:466
我的電腦文件夾打開方式 瀏覽:931
東莞加密u盤公司 瀏覽:137
graphvizlinux 瀏覽:438
智能手錶藍牙怎麼下載app 瀏覽:293
女程序員下班菜譜 瀏覽:260
加密貨幣買什麼比較靠譜 瀏覽:277
用圖片的地圖再編譯的地方 瀏覽:462
python監控系統進程 瀏覽:236
群暉怎麼取消照片共享文件夾 瀏覽:156
程序員那麼可愛第幾集陸璃懷孕 瀏覽:615
西門子st編程手冊 瀏覽:59
mt4編程書籍 瀏覽:21
單片機模擬實驗設置電壓 瀏覽:948
如何用電腦打開安卓手機內存 瀏覽:860
java數據訪問層 瀏覽:181
代碼優化是編譯程序的必要階段 瀏覽:623
程序員那麼可愛孩子還在嗎 瀏覽:513