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

使用Ivy下载JUnit供Ant使用

曾典
2023-03-14

我目前有一个私有的Java项目,我正在努力使其成型,以供其他开发人员使用。我尝试做的一件事是让Ant自己下载像JUnit、PMD和FindBugs这样的东西所需要的JAR,这样开发人员就不必自己安装它了。因此,我已经卸载了所有这些内容的RPM包(以确保我使用的是Ivy下载的版本),并且Ivy可以很好地下载JUnit相关的JAR文件。然而,我有两个(可能相关的)问题:

1)如果为junit任务输入taskdef,则会收到警告尝试重写datatype junit的旧定义。但是,如果不这样做,则会出现错误:

failed to create task or type junit
Cause: the class org.apache.tools.ant.taskdefs.optional.junit.JUnitTask was not found.

2)当我重写JUnittaskdef时,在尝试运行JUnit测试时会出现以下错误:

junit.framework.AssertionFailedError: No tests found

搜索该错误意味着在4.x下运行时为JUnit3.x编写的测试会发生这种情况。但是,我的JUnit测试都使用4.x@test方式进行测试,当我使用RPM包提供的JUnit4.11JAR文件时,测试运行良好,而且Ivy下载的JUnit JAR文件是4.11版的JUnit,1.9.4版的Ant-JUnit。我正在使用的安装Ant的RPM包(1.9.2)和Ivy下载的Ant JAR文件(1.9.4)之间存在不匹配,但我认为这不是问题所在。

我的JUnit任务DEF是:

<taskdef name="junit"
    classname="org.apache.tools.ant.taskdefs.optional.junit.JUnitTask">
        <classpath location="lib/ant-junit.jar"/>
        <classpath location="lib/junit.jar"/>
        <classpath location="lib/hamcrest-core.jar"/>
</taskdef>

运行Ant并打开调试会产生与问题相关的输出:

Finding class org.apache.tools.ant.taskdefs.optional.junit.JUnitTask
Loaded from /BlahBlah/lib/ant-junit.jar org/apache/tools/ant/taskdefs/optional/junit/JUnitTask.class
Class org.apache.tools.ant.Task loaded from parent loader (parentFirst)
Class org.apache.tools.ant.taskdefs.optional.junit.JUnitTask loaded from ant loader (parentFirst)
[...]
Class org.apache.tools.ant.util.FileUtils loaded from parent loader (parentFirst)
Could not load class (org.apache.tools.ant.taskdefs.optional.junit.JUnitTask) for type junit
Could not load class (org.apache.tools.ant.taskdefs.optional.junit.JUnitTask) for type junit
Trying to override old definition of datatype junit
 +Datatype junit org.apache.tools.ant.taskdefs.optional.junit.JUnitTask

那么,有什么办法可以解决这个问题吗?或者我应该采取完全不同的方法?

共有1个答案

戚俊健
2023-03-14

我建议使用ivy配置来管理您的测试类路径。下面的示例包含一个工作示例:

  • 未找到包含Ant、Ivy和JUnit的类-build.xml中的错误?

您的ivy文件包含一个依赖项,其中配置映射到“test”:

<configurations>
    <conf name="compile" description="Required to compile application"/>
    <conf name="runtime" description="Additional run-time dependencies" extends="compile"/>
    <conf name="test"    description="Required for test only" extends="runtime"/>
</configurations>

<dependencies>
    ..
    ..

    <!-- test dependencies -->
    <dependency org="junit" name="junit" rev="4.11" conf="test->default"/>
</dependencies>
<target name="resolve" depends="...." description="Use ivy to resolve classpaths">
    ..
    ..

    <ivy:cachepath pathid="test.path"    conf="test"/>
</target>
<target name="test" depends="compile-tests" description="Run unit tests">
    ..
    ..
    <junit printsummary="yes" haltonfailure="yes">
        <classpath>
            <path refid="test.path"/>
            <pathelement path="${classes.dir}"/>
            <pathelement path="${test.classes.dir}"/>
        </classpath>
        ..
        ..
    </junit>
</target>
 类似资料:
  • 最后是如何编写ivy.xml来获取我正在使用的库的最新版本。例如,我正在使用jgraph.jar、commons-codec-1.6.jar等,有人能演示一下如何在ivy.xml文件中编写代码来获取这些文件的最新版本吗?这些都在maven中央存储库中可用,我可以通过ivy.xml连接到它吗?如果是,怎么做?

  • 问题内容: 我已经为此花了一段时间(用Google搜索了一堆,浏览了其他相关的SO帖子都无济于事)。我有一个包含两个文件的Java程序,并且。包含上百JUnit测试,我已经通过调用得到与上述试验成功率100% ,随后。但是,当我用一个简单的命令运行(为了跟踪输出,因为我是这一切的新手)时,我得到以下输出: 我的如下: 目录结构非常简单。,,,,,和引用的文件都在同一个文件夹。Java代码引用了外部

  • 如果我在运行ant-task时查看控制台日志,我可以看到新的.jar文件是如何发送的: 如果打开创建的binmanifest.jar,我会发现一个manifest.mf文件,其中包含Class-Path属性中的所有路径,格式为:../../class1/bin../../class2/bin../../classn/bin。但是由于某些原因,我的所有测试都失败了,因为我的类找不到。我错过了什么?谢

  • 我用gradle下载常春藤罐子,gradle脚本如下: } } 我的常春藤配置是这样的: 常春藤上的罐子名称是: http://my.company/his-libs/org.slf4j/slf4j-api/1.6.4/slf4j-api-1.6.4.jar 但是当我使用gradle下载它们时,jar的名称是: D:\Users\myname。gradle\caches\artifacts-23\

  • 我尝试使用Zip4j生成一个zip文件供下载。但我总是得到错误:

  • 我在我的build.xml中创建了一个taskdef,它依赖于驻留在Ivy导入的jar中的类。 我想了解这是否可能,因为我的构建在开始之前会中断,因为它找不到 taskdef 的类。 这似乎是一个鸡蛋和鸡肉的问题,因为我不能得到这个类,因为我必须首先解决我的依赖关系(这需要构建工作)。