【发布时间】:2017-07-31 00:22:56
【问题描述】:
我在 build.xml 中创建了一个 taskdef,它依赖于 Ivy 导入的 jar 中的类。
考虑到我的构建在开始之前中断,因为它找不到 taskdef 的类,我想了解它是否有可能。
这似乎是鸡蛋和鸡肉的问题,因为我无法获得课程,因为我必须首先解决我的依赖项(这需要构建工作)。
【问题讨论】:
我在 build.xml 中创建了一个 taskdef,它依赖于 Ivy 导入的 jar 中的类。
考虑到我的构建在开始之前中断,因为它找不到 taskdef 的类,我想了解它是否有可能。
这似乎是鸡蛋和鸡肉的问题,因为我无法获得课程,因为我必须首先解决我的依赖项(这需要构建工作)。
【问题讨论】:
是的,这是可能的。但是,这意味着您必须在执行 <taskdef> 任务之前解析并检索 jar。有两种方法可以做到这一点:
将<ivy:resolve> 和<ivy:retrieve> 任务放在<typedef/> 任务之前。这三个都可以在<target> 之外。但是,在这种情况下,如果您运行 clean,这三个任务将在 clean 之前首先执行,这意味着简单的 clean 将花费更长的时间,并且您必须确保您不要在<ivy:resolve> 和<ivy:retrieve> 期间不要在clean 做任何事情。
将所有三个放在各自的目标中,然后使依赖于第三方 jar 的目标依赖于检索 Ivy jar 并定义任务的目标。这对于几乎所有任务都可以使用的 Ant-Contrib 任务之类的东西可能会很困难,但对于在构建过程的最后使用的某种打包任务之类的东西应该会更容易。
【讨论】:
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 等。
以下是使用 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>
【讨论】:
只是记录我的解决方案,以防它对任何人有所帮助。像大卫的回答那样干净利落地做可能是正确的方法,但以防万一您需要快速解决方案......
1) 将您的 taskdef 移动到您要调用的宏内部,而不是在外部定义它。这将避免它被评估并立即破坏构建。
2) 将您的依赖项解析添加为包含对宏的调用的任务的依赖项。
【讨论】: