Java 如何使用依赖于ivy导入的lib的Ant taskdef
我在build.xml中创建了一个taskdef,它依赖于驻留在由Ivy导入的jar中的类 我想知道这是否有可能,因为我的构建在开始之前就中断了,因为它找不到taskdef的类Java 如何使用依赖于ivy导入的lib的Ant taskdef,java,ant,ivy,Java,Ant,Ivy,我在build.xml中创建了一个taskdef,它依赖于驻留在由Ivy导入的jar中的类 我想知道这是否有可能,因为我的构建在开始之前就中断了,因为它找不到taskdef的类 这似乎是一个鸡蛋和鸡的问题,因为我不能得到这个类,因为我必须首先解决我的依赖关系(这需要构建工作)。是的,这是可能的。但是,这意味着您必须在执行任务之前解析并检索JAR。有两种方法可以做到这一点: 将和任务放在任务之前。所有三个都可以位于之外。但是,在这种情况下,如果您运行clean,这三个任务将在clean之前首先执
这似乎是一个鸡蛋和鸡的问题,因为我不能得到这个类,因为我必须首先解决我的依赖关系(这需要构建工作)。是的,这是可能的。但是,这意味着您必须在执行
任务之前解析并检索JAR。有两种方法可以做到这一点:
- 将
和
任务放在
任务之前。所有三个都可以位于
之外。但是,在这种情况下,如果您运行clean,这三个任务将在
之前首先执行,这意味着简单的clean
将花费更长的时间,并且您必须确保在clean
和
过程中没有执行任何操作
- 将所有三个放在各自的目标中,然后使依赖于第三方jar的目标依赖于检索Ivy jar并定义任务的目标。这对于像Ant Contrib任务这样的任务来说可能很困难,几乎所有的任务都可以使用它,但是对于构建过程最后使用的某种打包任务来说应该更容易
2) 将依赖项解析添加为包含宏调用的任务的依赖项。下面是一个使用ivy检索groovy任务依赖项的示例。正如David所说,诀窍是在ivy解析依赖项并创建路径引用后调用taskdef:
<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>
完全同意。我们仍在探索一些选择,但似乎我们正朝着这个方向前进。在遗留思想上这样做相当麻烦…我们使用常春藤和蚂蚁,我所做的是创建一个特殊的项目(名为ivy.dir
的文件名为ivy.tasks.xml
。由于我们使用Subversion,我让所有开发人员定义一个svn:externals
来包含ivy.dir
,然后对ivy.tasks.xml使用
。这个文件定义了所有的ivy依赖项。在我使用它的时候,我还将它包含在ivy.dir`中JAR用于诸如Antcontrib、Findbugs等。ivy.tasks.xml也定义了宏来设置它们。这使得ivy集成到我的项目中变得简单,并且有一种简单的方法来运行Findbugs、PMD等。看起来我们刚刚做了……真正有帮助的是将taskdef标记移动到宏中,这样ant就不会计算不精确的参数初始化类,直到实际需要它。然后我们可以将依赖项解析添加为任务的依赖项。如果调用该宏两次,是否调用taskdef两次?如果调用该宏会发生什么?Ant失败吗?我不知道,因为我从未尝试过。好问题…在我们的情况下,这不会是问题,因为这是一个文件生成任务。我会检查它例如:不必使用宏(见上面的例子)。如果你真的要努力创建宏,你应该考虑把它们打包成ANTLIB并让它们在整个构建中重复使用。你真的知道当你下载包含你的构建宏的JAR时,你做的是正确的!!(-)(Maven是如何工作的)