从Gradle运行Ant脚本

时间:2014-09-23 16:33:54

标签: java ant gradle

我正在尝试从Gradle运行ant脚本,但我有这个例外:

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

我宁愿使用本地libs的ant-junit,但我不知道怎么样,我对Gradle很新。

我找到了这段代码

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()) 
} 

但是如果jar已经在mt lib文件夹中,我不知道要改变什么。我不想使用maven repo。

2 个答案:

答案 0 :(得分:1)

这只是评论的重新发布,它解决了我的问题:感谢Opal

没有网络连接运行gradle可能不是一个好主意。然而,如果你在本地目录中有你需要的jar,只需使用文件依赖项将id添加到脚本依赖项。请参阅:Opal​​的http://www.gradle.org/docs/current/userguide/dependency_management.html#file-dependencies

答案 1 :(得分:1)

我修复了以下Gradle错误:

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

在我的Ant任务build.xml

之前的Ant脚本<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"
/>

这是完整的Ant目标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>

来自answer about "JUnitTask was not found"oers对查找我的上述修复程序提供了有用的帮助。

确定问题

为了理解这个问题,我调整了脚本build.xmlbuild.gradle,以便比较Ant和Gradle输出。有关详细信息,另请参阅answer of How to get “gradle” have similar output details as “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的符号链接。)

长期

this discussion about integration of Ant JUnit taskdef中,Luke Daley在2013年11月11日确认;

  

Gradle使用自己的“ant”实例,并且不会使用$ANT_HOME

上安装的内容

this discussion about JUnit 5中,Eric Wendelin表达了将更多JUnit集成到Gradle核心中的优先权。

因此,长期解决方案是停止在Ant脚本中使用JUnit并将其转换为Gradle语法。