2013-07-18 76 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" />