2013-07-18 118 views
1

已運行數月的Ant junit任務突然失敗,因爲曾經發現類的NoClassDefFoundError。有沒有辦法顯示在junit任務中構建的類路徑?如何在Ant Junit任務中顯示類路徑構建

<target name="basic-junit-test" description="Run a single JUnit test. "> 

    <junit printsummary="yes" fork="no" haltonfailure="yes"> 
     <classpath> 
      <pathelement location="target/WEB-INF/lib/log4j-1.2.16.jar"/> 
      . 
      . many other pathelements 
      . 
     </classpath> 
     <test name="com.mycompany.command.TestUNLOCKACCOUNTCommand" outfile="${report.dir}/junit_test_results" /> 
    </junit> 
</target> 

回答

5

我很喜歡在構建的頂部聲明我的Ant路徑,並在各種任務中使用類路徑引用。

pathconvert任務可用於打印的classpath內容屬性:

<path id="test.path"> 
    <pathelement location="target/WEB-INF/lib/log4j-1.2.16.jar"/> 
    . 
    . many other pathelements 
    . 
</path> 

<target name="echo-path" description="Echo test path"> 
    <pathconvert targetos="unix" property="test.path.unix" refid="test.path"> 
    <echo message="Test path: ${test.path.unix}"/> 
</target> 

<target name="basic-junit-test" depends="echo-path" description="Run a single JUnit test. "> 

    <junit printsummary="yes" fork="no" haltonfailure="yes"> 
     <classpath> 
      <path refid="test.path"/> 
     </classpath> 
     <test name="com.mycompany.command.TestUNLOCKACCOUNTCommand" outfile="${report.dir}/junit_test_results" /> 
    </junit> 
</target> 

更新

只是突然想到:一個更簡單的解決方案可能是在調試模式下運行Ant。

+0

Mark,感謝您的回覆。我會試一試。你能告訴我如何在調試模式下從Eclipse運行Ant嗎? – user903724

+2

要在調試模式下在Eclipse中運行Ant,請在Ant編輯器中使用=> AntFile |上下文菜單|運行爲| 2 Ant Build ... |主標籤|參數=> -debug然後運行 – Rebse

+0

Rebse,這是非常有用的。在調試模式下打印的信息正是我所需要的。 – user903724

0

這不是我的問題的答案,Mark O'Connor和Rebse給出了很好的答案,相反,這是一個更徹底的解釋,讓我首先提出問題。我有一個ANT Junit任務,我曾用它來開發大約100個控制器類。我在幾個月內第一次使用它,每次測試都失敗,出現classNotFound異常。沒有找到的類是我確定應該放在類路徑中的類,它是一個本地創建的jar文件,可以自動爲構建找到它。我認爲類路徑有問題,所以我想在測試運行時顯示它。

經過多次嘗試弄清楚發生了什麼之後,我在產生classNotFound異常的代碼周圍放了一個try塊,並且我看到本地類不是未找到的類。這導致我搜索lib目錄,最終(大約六個小時後),我意識到問題在於我用一個更新的版本替換了舊版本的slf4j-api。有一個依賴於舊版本但不是新版本的方法。

+0

哎唷!我可以推薦使用像ivy這樣的依賴管理工具。它會管理你的所有版本的第三方jar,並確保同一個jar的兩個版本不存在。這是Maven引入的Java構建的關鍵改進之一。請參閱:http://ant.apache.org/ivy/ –

+0

馬克,在這種情況下,常春藤會保護我免於我自己的愚蠢嗎?它會知道新的jar沒有包含在舊jar中使用的方法嗎? – user903724

+0

在這種情況下,常春藤會確保只使用每個依賴項的一個版本。通常這是最新的版本,假設大多數版本將向後兼容幷包含最新的方法。當然這並不能保護你,但這無疑是一個開始。關於ivy的真正重要之處在於它插入到Maven存儲庫基礎結構中,這意味着可以自動下載具有所有依賴關係的開源庫。這有點神奇,但值得一看。 –

0

Mark的回答只是幫助我,但只是一個快速筆記,因爲我需要在複製答案中的示例時關閉pathconvert xml元素。

<pathconvert targetos="unix" property="test.path.unix" refid="test.path" />