Java Ant使用Manifestclasspath运行junit ClassNotFoundException

Java Ant使用Manifestclasspath运行junit ClassNotFoundException,java,junit,ant,classpath,jacoco,Java,Junit,Ant,Classpath,Jacoco,我正试图在由ant任务启动的junit测试中集成codecoverage和jacoco。jacoco强迫我分叉junit的事实给了我一些问题,因为我的类路径很长,分叉崩溃了。 我正在使用manifestclasspath将我的类路径添加到jar文件中,并将我的新jar作为参数发送到VM,但它不起作用。我的测试运行,但它们都返回ClassNotFoundException。 下面是我如何配置ant进程的一个部分 <path refid="bin.classpath"/> 如果打开创建

我正试图在由ant任务启动的junit测试中集成codecoverage和jacoco。jacoco强迫我分叉junit的事实给了我一些问题,因为我的类路径很长,分叉崩溃了。 我正在使用manifestclasspath将我的类路径添加到jar文件中,并将我的新jar作为参数发送到VM,但它不起作用。我的测试运行,但它们都返回ClassNotFoundException。 下面是我如何配置ant进程的一个部分

<path refid="bin.classpath"/>

如果打开创建的binManifest.jar,我会发现一个MANIFEST.MF文件,其所有路径都位于Class Path属性中,格式为:../../Class1/bin../../Class2/bin../../ClassN/bin。但是由于某种原因,我的所有测试都失败了,因为找不到我的类。我错过了什么?谢谢。

让我们从没有JaCoCo的情况开始-下面是一个使用
junit fork=“true”
manifestclasspath
的示例

main/Example.java

class Example {
  public static void sayHello() {
    System.out.println();
  }
}
public class ExampleTest {
  @org.junit.Test
  public void test() {
    Example.sayHello();
  }
}
test/ExampleTest.java

class Example {
  public static void sayHello() {
    System.out.println();
  }
}
public class ExampleTest {
  @org.junit.Test
  public void test() {
    Example.sayHello();
  }
}
build.xml

<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>
一开始,

<jacoco:coverage destfile="bin/jacoco.exec" xmlns:jacoco="antlib:org.jacoco.ant">
...
</jacoco:coverage>

到最后不是什么大不了的事。执行
ant
将在目录
bin/report

中生成报告,因为路径是相对的(
。/../Class1/bin
),猜测可能是工作目录不正确。感谢您的回答@Godin。我也这么认为,但我已经尝试将manifest.mf内容更改为放置绝对路径,或将.jar文件更改为根文件夹。对于第一种情况,测试因相同的错误而崩溃,对于第二种情况,显示的相对路径完全相同
<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>