【问题标题】:How can I use an Ant taskdef that depends on lib imported by ivy如何使用依赖于 ivy 导入的 lib 的 Ant taskdef
【发布时间】:2017-07-31 00:22:56
【问题描述】:

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

考虑到我的构建在开始之前中断,因为它找不到 taskdef 的类,我想了解它是否有可能。

这似乎是鸡蛋和鸡肉的问题,因为我无法获得课程,因为我必须首先解决我的依赖项(这需要构建工作)。

【问题讨论】:

标签: java ant ivy


【解决方案1】:

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

  • <ivy:resolve><ivy:retrieve> 任务放在<typedef/> 任务之前。这三个都可以在<target> 之外。但是,在这种情况下,如果您运行 clean,这三个任务将在 clean 之前首先执行,这意味着简单的 clean 将花费更长的时间,并且您必须确保您不要在<ivy:resolve><ivy:retrieve> 期间不要在clean 做任何事情。

  • 将所有三个放在各自的目标中,然后使依赖于第三方 jar 的目标依赖于检索 Ivy jar 并定义任务的目标。这对于几乎所有任务都可以使用的 Ant-Contrib 任务之类的东西可能会很困难,但对于在构建过程的最后使用的某种打包任务之类的东西应该会更容易。

【讨论】:

  • 完全同意。我们仍在探索一些选择,但似乎我们正朝着那个方向前进。在传统思想上这样做非常麻烦......
  • 我们使用 Ivy 和 Ant,我所做的是创建一个特殊项目(称为 ivy.dir,其中有一个名为 ivy.tasks.xml 的文件。由于我们使用 Subversion,我让所有开发人员定义一个svn:externals 包含 ivy.dir,然后使用 <import/> 为 ivy.tasks.xml. This file defines all ivy dependencies. While I was at it, I also include in the ivy.dir` jar 用于 Antcontrib、Findbugs 等。ivy.tasks.xml 定义了宏来设置这些. 这使得将 Ivy 集成到我的项目中变得简单,并且可以轻松地运行 findbugs、PMD 等。
  • 看来我们刚刚做到了...真正有帮助的是将我们的 taskdef 标签移动到宏内部,这样 ant 在实际需要之前不会评估不存在的类。然后我们可以将依赖解析添加为我们任务的依赖。
  • 如果你调用那个宏两次,你调用taskdef两次吗?如果你这样做会发生什么?蚂蚁失败了吗?我不知道,因为我从未尝试过。
  • 好问题...在我们的例子中这不是问题,因为它是一个文件生成任务。我稍后会检查它...
【解决方案2】:

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

以下是比较正常的构建示例

我创建配置以匹配我需要的构建类路径。请特别注意“构建”配置的映射。这就是与 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>

【讨论】:

    【解决方案3】:

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

    1) 将您的 taskdef 移动到您要调用的宏内部,而不是在外部定义它。这将避免它被评估并立即破坏构建。

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

    【讨论】:

    • 不必使用宏(参见我上面的示例)。如果您确实努力创建宏,您应该考虑将它们打包为 antlibs 并使它们在构建中可重用。当您让 ivy 下载包含构建宏的 jar 时,您真的知道自己做对了! :-)(Maven 的工作原理)
    猜你喜欢
    • 1970-01-01
    • 2011-05-14
    • 2010-09-24
    • 1970-01-01
    • 2011-11-07
    • 2011-12-11
    • 2011-01-18
    • 2013-11-25
    相关资源
    最近更新 更多