我如何使用依赖于 ivy 导入的 lib 的 Ant taskdef

How can I use an Ant taskdef that depends on lib imported by ivy

我在 build.xml 中创建了一个 taskdef,它依赖于驻留在 Ivy 导入的 jar 中的 class。

我想了解是否有可能以任何方式实现,因为我的构建在开始之前就中断了,因为它找不到任务定义的 class。

这似乎是先有鸡还是先有蛋的问题,因为我得不到 class 因为我必须先解决我的依赖关系(这需要构建才能正常工作)。

是的,这是可能的。但是,这意味着您必须在执行 <taskdef> 任务之前解析并检索 jars。有两种方法可以做到这一点:

  • <ivy:resolve><ivy:retrieve> 任务放在 <typedef/> 任务之前。这三个都可以在 <target> 之外。然而,在那种情况下,如果你 运行 a clean,这三个任务将在 clean 之前首先执行,这意味着一个简单的 clean 将需要更长的时间,并且您必须确保在 <ivy:resolve><ivy:retrieve>.

  • 期间没有 clean 做任何事情
  • 将这三个都放在自己的目标中,然后使依赖于第三方 jar 的目标依赖于检索 Ivy jar 并定义任务的目标。对于几乎所有任务都可能使用的 Ant-Contrib 任务,这可能很困难,但对于在构建过程的最后使用的某种打包任务,这应该更容易。

只是记录我的解决方案,以防对任何人有帮助。像 David 的回答那样干净地做这件事可能是正确的方法,但以防万一您需要快速解决方案...

1) 将 taskdef 移到要调用的宏中,而不是在外部定义它。这将避免它被评估和构建立即中断。

2) 将您的依赖项解析添加为包含对宏的调用的任务的依赖项。

以下是使用 ivy 检索 groovy 任务依赖项的示例。正如 David 所说,诀窍是在 ivy 解决依赖关系并创建路径引用后调用 taskdef:

  • Harsh Jarring with ivy

下面是比较正常的例子build

  • integrating JaCoCo in sonar using Ant

我创建配置以匹配我需要的构建类路径。请特别注意 "build" 配置的映射。这就是与 ANT 任务关联的 jar 可以与用于编译的 jar 分开的方式。

引导常春藤

对您的先有鸡还是先有蛋的评论的反应。

我使用 ivy 来管理所有构建依赖项。以下目标确保在我的构建机器上安装了 ivy。

<available classname="org.apache.ivy.Main" property="ivy.installed"/>

<target name="install-ivy" description="Install ivy" unless="ivy.installed">
    <mkdir dir="${user.home}/.ant/lib"/>
    <get dest="${user.home}/.ant/lib/ivy.jar" src="http://search.maven.org/remotecontent?filepath=org/apache/ivy/ivy/2.3.0/ivy-2.3.0.jar"/>
    <fail message="Ivy has been installed. Run the build again"/>
</target>