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