我在build.xml中创建了一个taskdef,它依赖于一个驻留在Ivy导入的jar中的类。
我想知道是否有可能以任何方式,因为我的构建在启动之前中断,因为它找不到taskdef的类。
这似乎是一个鸡蛋和鸡肉问题,因为我无法获得该类,因为我必须首先解决我的依赖关系(这需要构建工作)。
答案 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)将依赖项解析添加为包含对宏的调用的任务的依赖项。