【问题标题】:Running JUnit from Apache Ant with included jar file results in "JUnitTask was not found"使用包含的 jar 文件从 Apache Ant 运行 JUnit 会导致“找不到 JUnitTask”
【发布时间】:2016-09-21 09:02:18
【问题描述】:

我正在使用 Apache Ant 编译和运行 JUnit 测试。目前,它正在将 ant JUnit 库作为 Ant 的一部分安装的环境中工作,但不在其他环境中。我想解决这个问题。我试过包括需要的罐子(junit-4.12.jarhamcrest-core-1.3.jar,如果我理解正确的话),但它不起作用。我的build.xml的相关部分如下:

  <property name="build.path" location="build/src"/>
  <property name="build.test.path" location="build/test"/>
  <property name="lib.path.rel" value="lib"/>
  <property name="junit.file" value="${lib.path.rel}/junit/junit-4.12.jar"/>
  <property name="hamcrest.file" value="${lib.path.rel}/junit/hamcrest-core-1.3.jar"/>

  <path id="junit.class.path">
    <pathelement location="${junit.file}"/>
    <pathelement location="${hamcrest.file}"/>
    <pathelement location="${build.path}"/>
  </path>

  <target name="test-compile" depends="test-clean">
    <mkdir dir="${build.test.path}"/>

    <javac srcdir="${test.path}"
           destdir="${build.test.path}"
           includeantruntime="false">
      <classpath refid="junit.class.path" />
    </javac>
  </target>

  <target name="test" depends="test-compile">
    <junit>
      <classpath>
        <path refid="junit.class.path"/>
        <pathelement location="${build.test.path}"/>
      </classpath>
      <batchtest>
        <fileset dir="${build.test.path}">
          <include name="**/*Test*"/>
        </fileset>
      </batchtest>
      <formatter type="brief" usefile="false"/>
    </junit>
  </target>

任务test-compile 成功构建测试。
但是,任务 test 会导致以下错误:
Problem: failed to create task or type junit Cause: the class org.apache.tools.ant.taskdefs.optional.junit.JUnitTask was not found.

我正在使用带有 Ant 1.9.2 的 CentOS 7,尽管我认为要求用户将 Ant 更新到可用的最新版本是合理的,但我无法控制他们安装了哪些操作系统和库。因此,我不想通过yum install something 或其他方式解决问题,而是通过找到正确使用 JUnit jar 文件的方法(如果可能的话)。然后,当他们拉取 git 存储库并运行任务时,它将在任何操作系统或环境上运行(因为他们将使用他们刚刚拉取的 jar 文件)。显然,这也意味着“只将 jars 放在 Ant lib 目录中”将不是一个可行的解决方案。
谢谢。

【问题讨论】:

标签: java junit ant build.xml


【解决方案1】:

要修复此错误,您必须将定义 JUnitTask 的 jar 传递给 ant。这个罐子叫做ant-junit.jar,你可以(来自JUnit task documentation):

  1. 将 junit.jar 和 ant-junit.jar 都放在 ANT_HOME/lib 中。
  2. 不要将它们放在 ANT_HOME/lib 中,而是将它们的位置包含在您的 CLASSPATH 环境变量中。
  3. 使用 -lib 将两个 JAR 添加到您的类路径中。
  4. 在构建文件的&lt;taskdef&gt; 中使用&lt;classpath&gt; 元素指定两个JAR 的位置。
  5. 将 ant-junit.jar 保留在 ANT_HOME/lib 中的默认位置,但将 junit.jar 包含在传递给 . (自 Ant 1.7 起)

对于选项 4,您只需在 ant build 中添加如下声明:

<taskdef name="junit" classname="org.apache.tools.ant.taskdefs.optional.junit.JUnitTask">
  <classpath>
    <pathelement location="${lib}/ant-junit.jar"/>
    <pathelement location="${lib}/ant-junit4.jar"/>
  </classpath>
</taskdef>

【讨论】:

  • 也许我误解了你,但你的解决方案似乎将问题推向了正确的方向,但没有解决它:我得到的结果是,如果我将 ant-junit 用于 JUnit 4:@987654326 @ 和前 4 的测试实际运行但给出错误 junit.framework.AssertionFailedError: No tests found。我的测试是为 JUnit 4 编写的(没有 extends TestCase,使用 @Test 注释)并且我正在使用 JUnit 4 库,所以如果您对如何使其适用于 JUnit 4 有更多建议,将不胜感激.
  • @StubbornShowaGuy 您是对的:对于 JUnit 4 测试,您还需要将 ant-junit4.jar 添加到 taskdef 的类路径中(请参阅我编辑的答案)。我还从该类路径中删除了junit-4.12.jarhamcrest-core-1.3.jar,因为taskdef 声明不需要它们,并且您已经将它们添加到构建中的junit 任务类路径中。希望它能解决你的问题
  • 我刚刚这样做了,现在它可以完美运行了。谢谢!
【解决方案2】:

在我将 jar 文件复制到我的测试 Linux 机器后,这对我也很有效。由于之前没有显示布局,这是我的。

ls -l /usr/share/ant/lib
total 0
lrwxrwxrwx. 1 root root 32 Mar 24  2021 ant-bootstrap.jar -> ../../java/ant/ant-bootstrap.jar
lrwxrwxrwx. 1 root root 28 Oct 12 19:10 ant-junit.jar -> ../../java/ant/ant-junit.jar
lrwxrwxrwx. 1 root root 29 Oct 12 19:11 ant-junit4.jar -> ../../java/ant/ant-junit4.jar
lrwxrwxrwx. 1 root root 31 Mar 24  2021 ant-launcher.jar -> ../../java/ant/ant-launcher.jar
lrwxrwxrwx. 1 root root 22 Mar 24  2021 ant.jar -> ../../java/ant/ant.jar

ls /usr/share/java/ant
ant-bootstrap.jar  ant-junit.jar  ant-junit4.jar  ant-launcher.jar  ant.jar

【讨论】:

    猜你喜欢
    • 2012-04-04
    • 1970-01-01
    • 2021-06-22
    • 1970-01-01
    • 2017-06-15
    • 2014-10-08
    • 1970-01-01
    • 1970-01-01
    • 2020-06-05
    相关资源
    最近更新 更多