Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用依赖于ivy导入的lib的Ant taskdef_Java_Ant_Ivy - Fatal编程技术网

Java 如何使用依赖于ivy导入的lib的Ant taskdef

Java 如何使用依赖于ivy导入的lib的Ant taskdef,java,ant,ivy,Java,Ant,Ivy,我在build.xml中创建了一个taskdef,它依赖于驻留在由Ivy导入的jar中的类 我想知道这是否有可能,因为我的构建在开始之前就中断了,因为它找不到taskdef的类 这似乎是一个鸡蛋和鸡的问题,因为我不能得到这个类,因为我必须首先解决我的依赖关系(这需要构建工作)。是的,这是可能的。但是,这意味着您必须在执行任务之前解析并检索JAR。有两种方法可以做到这一点: 将和任务放在任务之前。所有三个都可以位于之外。但是,在这种情况下,如果您运行clean,这三个任务将在clean之前首先执

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

我想知道这是否有可能,因为我的构建在开始之前就中断了,因为它找不到taskdef的类


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

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

  • 任务放在
    任务之前。所有三个都可以位于
    之外。但是,在这种情况下,如果您运行clean,这三个任务将在
    clean
    之前首先执行,这意味着简单的
    clean
    将花费更长的时间,并且您必须确保在
    过程中没有执行
    任何操作

  • 将所有三个放在各自的目标中,然后使依赖于第三方jar的目标依赖于检索Ivy jar并定义任务的目标。这对于像Ant Contrib任务这样的任务来说可能很困难,几乎所有的任务都可以使用它,但是对于构建过程最后使用的某种打包任务来说应该更容易


仅记录我的解决方案,以防对任何人都有帮助。像大卫的回答一样,做得干净可能是正确的方法,但只是为了防你需要快速解决方案

1) 将taskdef移到要调用的宏内部,而不是在外部定义它。这将避免对其进行评估,并避免立即中断构建


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

下面是一个使用ivy检索groovy任务依赖项的示例。正如David所说,诀窍是在ivy解析依赖项并创建路径引用后调用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>


完全同意。我们仍在探索一些选择,但似乎我们正朝着这个方向前进。在遗留思想上这样做相当麻烦…我们使用常春藤和蚂蚁,我所做的是创建一个特殊的项目(名为
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是如何工作的)