当前位置: 首页 > 知识库问答 >
问题:

Ant使用Manifestclasspath运行junit ClassNotFoundException

高展
2023-03-14
<path refid="bin.classpath"/>
<target name="run-unit-tests" depends="init" description="Runs all the unit tests">
  <taskdef uri="antlib:org.jacoco.ant" resource="org/jacoco/ant/antlib.xml">
    <classpath path="jacocoant.jar" />
  </taskdef>

  <manifestclasspath property="binjar" jarfile="binManifest.jar">
    <classpath refid="bin.classpath" />
  </manifestclasspath>

  <jar destfile="manifestJars/binManifest.jar">
    <manifest>
      <attribute name="Class-Path" value="${binjar}" />
    </manifest>
  </jar>

  <jacoco:coverage destfile="results/jacoco.exec" xmlns:jacoco="antlib:org.jacoco.ant">
    <junit fork="true" reloading="false" showoutput="true">
      <classpath>
        <pathelement path="${projects.dir}/AntProject/manifestJars/binManifest.jar" />
      </classpath>

      <batchtest todir="${test.data.dir}" fork="true">
        <fileset dir="${projects.dir}/ProjectFolder1/src" />
        <fileset dir="${projects.dir}/ProjectFolder2/src" />
      </batchtest>
    </junit>
  </jacoco:coverage>
</target>

如果我在运行ant-task时查看控制台日志,我可以看到新的.jar文件是如何发送的:

-classpath''C:\Users\XXX\Project\AntProject\manifestJars\binManifest.jar;

如果打开创建的binmanifest.jar,我会发现一个manifest.mf文件,其中包含Class-Path属性中的所有路径,格式为:../../class1/bin../../class2/bin../../classn/bin。但是由于某些原因,我的所有测试都失败了,因为我的类找不到。我错过了什么?谢了。

共有1个答案

王泓
2023-03-14

下面是一个完整且可验证的示例,它使用JUnit fork=“true”Manifestclasspath

main/example.java:

class Example {
  public static void sayHello() {
    System.out.println();
  }
}

test/exampletest.java:

public class ExampleTest {
  @org.junit.Test
  public void test() {
    Example.sayHello();
  }
}
<project xmlns:jacoco="antlib:org.jacoco.ant" default="build">
  <target name="build">
    <delete dir="bin" />
    <mkdir dir="bin/main-classes" />
    <mkdir dir="bin/test-classes" />

    <javac target="1.5" debug="true" destdir="bin/main-classes">
      <src path="main" />
    </javac>

    <javac target="1.5" debug="true" destdir="bin/test-classes">
      <src path="test" />
      <classpath>
        <pathelement path="bin/main-classes"/>
        <pathelement path="lib/junit-4.12.jar"/>
        <!-- otherwise "java.lang.NoClassDefFoundError: org/hamcrest/SelfDescribing" -->
        <pathelement path="lib/hamcrest-core-1.3.jar"/>
      </classpath>
    </javac>

    <manifestclasspath property="binjar" jarfile="bin/manifest.jar">
      <classpath>
        <pathelement path="bin/main-classes"/>
        <pathelement path="bin/test-classes"/>

        <pathelement path="lib/junit-4.12.jar"/>
        <!-- otherwise "java.lang.NoClassDefFoundError: org/hamcrest/SelfDescribing" -->
        <pathelement path="lib/hamcrest-core-1.3.jar"/>
      </classpath>
    </manifestclasspath>

    <jar destfile="bin/manifest.jar">
      <manifest>
        <attribute name="Class-Path" value="${binjar}" />
      </manifest>
    </jar>

    <junit fork="true" showoutput="true">
      <formatter type="brief" usefile="false" />
      <classpath>
        <pathelement path="bin/manifest.jar" />
      </classpath>
      <batchtest>
        <fileset dir="test" includes="**/*Test.java" />
      </batchtest>
    </junit>
  </target>
</project>

让我们通过执行Ant来确认它在没有异常的情况下工作。

在添加JaCoCo后通过添加

<taskdef uri="antlib:org.jacoco.ant" resource="org/jacoco/ant/antlib.xml">
  <classpath path="jacocoant.jar" />
</taskdef>

到开头,

<jacoco:coverage destfile="bin/jacoco.exec" xmlns:jacoco="antlib:org.jacoco.ant">
...
</jacoco:coverage>
<jacoco:report>
  <executiondata>
    <file file="bin/jacoco.exec"/>
  </executiondata>
  <structure name="JaCoCo Ant Example">
    <classfiles>
      <fileset dir="bin/main-classes"/>
    </classfiles>
    <sourcefiles encoding="UTF-8">
      <fileset dir="main"/>
    </sourcefiles>
  </structure>
  <html destdir="bin/report"/>
</jacoco:report>
 类似资料:
  • 我想通过html显示Jmeter结果。html仪表板信息不够丰富,所以我想使用ant解决方案。 < li >我按预期安装了ant < li >我将testplan.jmx复制到C:\ Jmeter _ 4.0 \ Apache-Jmeter-4.0 \ extras < li >我将testplan.jmx更改为Test.jtl < li >我进入了cmd CD C:\ Jmeter _ 4.0

  • 问题内容: 这是我到目前为止的内容: 但是我猜这个错误: 我尝试使用以下方法指定项目: 但是没有运气。 指定的ant文件是正确的,因为它可以从命令行正常运行。 更新 经过更多搜索后,我到达了这里:http : //onjava.com/pub/a/onjava/2002/07/24/antauto.html?page=1 这是一个很棒的教程。 这是我在下面的答案中看到代码之前得到的代码: 但是由于

  • 我是一名承包商,他们正在使用MyEclipse 10.0和Ant进行构建。自从我使用Ant作为构建工具以来已经有很长时间了,因为我主要在Maven上已经有一段时间了。 它们的源代码被分解为多个项目,每个项目都链接回一个具有公共构建的公共项目。由每个项目的构建导入的xml。xml。ant脚本用于与应用程序作战,并使用WebLogic基于java的部署工具在本地和测试环境上进行部署。他们使用的是Web

  • 问题内容: 是否可以从Jenkins执行我的QUnit(javascript)单元测试?我的构建脚本是Apache Ant。Jenkins是将其作为单独的构建步骤执行,还是需要在Ant构建脚本的配置中添加一些内容? 问题答案: 因此,我终于设法弄清楚了。 这是我的端到端实施: 安装PhantomJS(http://phantomjs.org/)-我将其安装在build / tools文件夹中 安装

  • 问题内容: 我的程序正在获取命令行参数。使用Ant时如何通过? 问题答案: 扩展了Richard Cook的答案。 这是运行任何程序(包括但不限于Java程序)的任务: 这是从文件运行Java程序的任务: 您可以像这样从命令行调用: 确保使用语法;如果运行此命令: 然后将尝试运行目标和。