从 Gradle 运行 Ant 脚本 [英] Run Ant script from Gradle

查看:25
本文介绍了从 Gradle 运行 Ant 脚本的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试从 Gradle 运行 ant 脚本,但出现此异常:

 原因:找不到类 org.apache.tools.ant.taskdefs.optional.junit.JUnitTask.

而且我宁愿使用本地库中的 ant-junit,但我不知道如何使用,我对 Gradle 还很陌生.

我找到了这个代码

配置{蚂蚁类路径}依赖{antClasspath 'org.apache.ant:ant-junit4:1.8.3'}ClassLoader antClassLoader = org.apache.tools.ant.Project.class.classLoaderconfiguration.antClasspath.each { 文件 f ->antClassLoader.addURL(f.toURI().toURL())}

但是如果 jar 已经在 mt lib 文件夹中,我不知道我必须更改什么.我不想使用 maven repo.

解决方案

我已修复以下 Gradle 错误:

任务 ':test' 执行失败.>问题:无法创建任务或键入junit原因:找不到类 org.apache.tools.ant.taskdefs.optional.junit.JUnitTask.这看起来像是 Ant 的可选组件之一.行动:检查适当的可选 JAR 存在于-ANT_HOME/lib-IDE Ant 配置对话框

在我的 Ant 脚本 build.xml 中添加以下几行就在我的 Ant 任务 <junit>

这是完整的 Ant 目标 test:

来自oers关于未找到JUnitTask"的回答 对找到我的上述修复很有帮助.

确定问题

为了理解这个问题,我调整了脚本 build.xmlbuild.gradle 以比较 Ant 和 Gradle 的输出.另请参阅如何获得gradle"的答案与ant"有类似的输出细节?了解一些细节.>

有趣的区别在于 -classpath 参数:

使用 Ant

/some/path/myApplication.jar/usr/share/java/ant-launcher-1.9.7.jar/usr/share/ant/lib/ant.jar/usr/share/ant/lib/junit.jar/usr/share/ant/lib/ant-junit.jar/usr/share/ant/lib/ant-junit4.jar

使用 Gradle

/some/path/myApplication.jar/usr/lib/gradle/3.2.1/lib/ant-launcher-1.9.6.jar/usr/lib/gradle/3.2.1/lib/ant-1.9.6.jar

区别

我们可以观察到 Gradle 使用了自己的 ant-launcher-1.9.6.jarant-1.9.6.jar.但是 Gradle 不使用 Ant 安装中的 JAR(/usr/share/ant/lib/*jar 是到 /usr/share/java/*jar 的符号链接).

长期

关于Ant JUnit taskdef集成的讨论中,卢克·戴利 (Luke Daley) 于 2013 年 11 月确认;

<块引用>

Gradle 使用它自己的 ant '实例',并且不打扰使用 $ANT_HOME

关于 JUnit 5 的讨论 中,Eric Wendelin 表示优先在 Gradle 中集成更多 JUnit核心.

因此,长期的解决方案是停止使用 Ant 脚本中的 JUnit,并将它们转换为 Gradle 语法.

I'm trying to run ant script from Gradle, but I have this exception:

  Cause: the class org.apache.tools.ant.taskdefs.optional.junit.JUnitTask was not found.

And I'd rather use ant-junit from local libs, but I do not know how, I am pretty new to Gradle.

I found this code

configurations { 
  antClasspath 
} 
dependencies { 
  antClasspath 'org.apache.ant:ant-junit4:1.8.3' 
} 
ClassLoader antClassLoader = org.apache.tools.ant.Project.class.classLoader 
configurations.antClasspath.each { File f -> 
  antClassLoader.addURL(f.toURI().toURL()) 
} 

But I don not know what I have to change if the jar is already in mt lib folder. I do not want to use maven repo.

解决方案

I have fixed the following Gradle error:

Execution failed for task ':test'.
> Problem: failed to create task or type junit
  Cause: the class org.apache.tools.ant.taskdefs.optional.junit.JUnitTask was not found.
          This looks like one of Ant's optional components.
  Action: Check that the appropriate optional JAR exists in
          -ANT_HOME/lib
          -the IDE Ant configuration dialogs

by adding the following lines in my Ant script build.xml just before my Ant task <junit>

<taskdef name="junit"
  classname="org.apache.tools.ant.taskdefs.optional.junit.JUnitTask"
  classpath="/usr/share/ant/lib/ant-junit.jar:/usr/share/ant/lib/ant-junit4.jar"
/>

This is the full Ant target test:

<target name="test" depends="test_compile">
  <mkdir dir="${test.report.dir}" />

  <!-- Required for Gradle -->
  <taskdef name="junit"
  classname="org.apache.tools.ant.taskdefs.optional.junit.JUnitTask"
  classpath="/usr/share/ant/lib/ant-junit.jar:/usr/share/ant/lib/ant-junit4.jar"
  />

  <junit printsummary="yes" fork="true" haltonfailure="on">
      <classpath refid="classpath_test"/>
      <batchtest>
          <fileset dir="${test.src.dir}">
              <include name="**/*Tester.java" />
          </fileset>
      </batchtest>
  </junit>
</target>

The answer about "JUnitTask was not found" from oers has been a useful help to find my above fix.

Identify the issue

To understand the issue, I have tweaked the scripts build.xml and build.gradle in order to compare the Ant and Gradle outputs. See also the answer of How to get "gradle" have similar output details as "ant"? for some details.

The interesting difference is in the -classpath parameter:

Using Ant

/some/path/myApplication.jar
/usr/share/java/ant-launcher-1.9.7.jar
/usr/share/ant/lib/ant.jar
/usr/share/ant/lib/junit.jar
/usr/share/ant/lib/ant-junit.jar
/usr/share/ant/lib/ant-junit4.jar

Using Gradle

/some/path/myApplication.jar
/usr/lib/gradle/3.2.1/lib/ant-launcher-1.9.6.jar
/usr/lib/gradle/3.2.1/lib/ant-1.9.6.jar

Difference

We can observe that Gradle uses its own ant-launcher-1.9.6.jar and ant-1.9.6.jar. But Gradle does not use the JARs from Ant installation (/usr/share/ant/lib/*jar are symbolic links to /usr/share/java/*jar).

Long term

In this discussion about integration of Ant JUnit taskdef, Luke Daley confirms in Novembre 2013;

Gradle uses its own 'instance' of ant and does not bother using what's installed at $ANT_HOME

In this discussion about JUnit 5 Eric Wendelin expressed the priority to integrate more JUnit within Gradle core.

Threfore, solution for long term is to stop using JUnit from Ant scripts and convert them into Gradle syntax.

这篇关于从 Gradle 运行 Ant 脚本的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆