运行 来自 Apache Ant 的包含 jar 文件的 JUnit 结果 "JUnitTask was not found"

Running JUnit from Apache Ant with included jar file results in "JUnitTask was not found"

我正在使用 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.

我正在使用 CentOS 7 和 Ant 1.9.2,虽然我认为要求用户将 Ant 更新到可用的最新版本是合理的,但我无法控制他们拥有的 OS 和库安装。因此,我不想通过 yum install something 或诸如此类的东西来解决问题,而是通过找到一种正确使用 JUnit jar 文件的方法(如果可能的话)。然后,当他们拉取 git 存储库和 运行 任务时,它将在任何 OS 或环境中工作(因为他们将使用他们刚刚拉取的 jar 文件)。显然,这也意味着 "just put the jars in the Ant lib dir" 将不是一个可行的解决方案。
谢谢。

要修复此错误,您必须将定义 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. 在构建文件的 <taskdef> 中使用 <classpath> 元素指定两个 JAR 的位置。
  5. 将 ant-junit.jar 保留在 ANT_HOME/lib 中的默认位置,但在传递给 . (自 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>

在我将 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