我怎样才能使用依赖于ivy导入的lib的Ant taskdef

时间:2015-01-27 19:24:21

标签: java ant ivy

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

我想知道是否有可能以任何方式,因为我的构建在启动之前中断,因为它找不到taskdef的类。

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

3 个答案:

答案 0 :(得分:1)

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

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

  • 将所有三个放在他们自己的目标中,然后使依赖于第三方jar的目标依赖于检索常春藤罐的目标并定义任务。对于几乎所有任务都可以使用的Ant-Contrib任务这样的事情可能会很困难,但是在构建过程的最后阶段使用的某些打包任务应该更容易。

答案 1 :(得分:1)

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

以下是更正常的示例构建

我创建配置以匹配我需要的构建类路径。特别注意&#34; build&#34;的映射。组态。这就是与ANT任务相关的罐子可以与用于编译的罐子分开。

引导常春藤

对鸡肉和鸡蛋的反应评论。

我使用常春藤来管理所有构建依赖项。以下目标确保我的构建计算机上安装了常春藤。

<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>

答案 2 :(得分:0)

记录我的解决方案,以防它对任何人都有帮助。干净利落地完成大卫的回答可能是正确的方法,但万一你需要快速解决方案...

1)将taskdef移动到要调用的宏中,而不是在外部定义。这样可以避免评估和构建中断。

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