我有一个构建脚本,作为该脚本的一部分,它将一个jar文件复制到一个目录,为了方便我们将其称为utils jar。 utils jar由另一个构建脚本构建,该脚本位于另一个目录中。我试图做的是让我的构建脚本运行utils构建脚本,以便我可以确保utils jar是最新的。
所以我知道我需要导入utils构建文件。
<import file="../utils/build/build.xml" />
哪个不起作用,因为导入任务与几乎所有其他ant taks不同,不是从basedir运行,而是从pwd运行。因此,为了解决这个问题,我有一个小小的小调,它确实成功导入了构建文件
<property name="baseDirUpOne" location=".." />
<import file="${baseDirUpOne}/utils/build/build.xml" />
所以现在我已经解决了我需要调用任务的导入问题,那应该很容易:
<antcall target="utils.package" />
请注意,在上面,utils是项目名称../ utils / build / build.xml
我现在遇到的问题是蚂蚁调用没有在../utils/build中执行,所以我需要的,并且无法找到,是一个runat属性或类似的东西,基本上:
<antcall target="utils.package" runat="../utils/build" />
我需要这个的原因是在我的utils构建文件中,选择要复制到jar的代码的步骤是基于相对路径,以避免我的ant文件中的硬编码路径。有任何想法吗?
答案 0 :(得分:33)
我有一些类似的设置:我有一个主Ant build.xml,它调用一个单独的build.xml来负责构建我的测试。我就是这样做的:
<target name="build-tests">
<subant target="build">
<fileset dir="${test.home}" includes="build.xml"/>
</subant>
</target>
诀窍是使用subant
代替antcall
。您不必导入其他构建文件。
答案 1 :(得分:6)
尝试使用"ant" task代替“antcall”任务,该任务直接运行导入的构建,而不是将其导入当前构建文件。它有一个“dir”参数:
用作basedir的目录 为新的Ant项目。默认为 除非是当前项目的基础 inheritall已被设置为false,in 在哪种情况下它没有默认值 值。这将覆盖基础 设置被调用的项目。
所以你可以这样做:
<ant antfile="${baseDirUpOne}/utils/build/build.xml" dir="../utils/build" />
或类似的东西。
答案 2 :(得分:0)
您可以使用嵌套在antcall块中将params传递给antcall。因此,您可以通过这种方式传递属性(可能甚至是基于属性,因为属性是不可变的)。