我如何使用依赖于 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>
我在 build.xml 中创建了一个 taskdef,它依赖于驻留在 Ivy 导入的 jar 中的 class。
我想了解是否有可能以任何方式实现,因为我的构建在开始之前就中断了,因为它找不到任务定义的 class。
这似乎是先有鸡还是先有蛋的问题,因为我得不到 class 因为我必须先解决我的依赖关系(这需要构建才能正常工作)。
是的,这是可能的。但是,这意味着您必须在执行 <taskdef>
任务之前解析并检索 jars。有两种方法可以做到这一点:
将
<ivy:resolve>
和<ivy:retrieve>
任务放在<typedef/>
任务之前。这三个都可以在<target>
之外。然而,在那种情况下,如果你 运行 a clean,这三个任务将在clean
之前首先执行,这意味着一个简单的clean
将需要更长的时间,并且您必须确保在<ivy:resolve>
和<ivy:retrieve>
. 期间没有 将这三个都放在自己的目标中,然后使依赖于第三方 jar 的目标依赖于检索 Ivy jar 并定义任务的目标。对于几乎所有任务都可能使用的 Ant-Contrib 任务,这可能很困难,但对于在构建过程的最后使用的某种打包任务,这应该更容易。
clean
做任何事情
只是记录我的解决方案,以防对任何人有帮助。像 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>