我创建了3个ant文件build.xml
,build-client.xml
和build-server.xml
.(单击任何文件名以查看它们)文件build-client.xml
和build-server.xml
包含在build.xml
中,以便它可以从它们运行目标.
我遇到的问题是basedir变量从构建文件更改为构建文件.因此,如果我从build.xml
开始在build-client.xml
中运行目标,则basedir变量相对于build.xml
.
如何在Ant脚本中多次更改basedir变量?
另外,看看这些构建文件,您是否看到了更好的方法来做我正在尝试做的事情?现在,我想我必须在同一个位置同时拥有客户端战争和服务器耳朵,然后才能制作最终的捆绑耳朵.我对此的想法可能有缺陷,因为这些脚本似乎不必要地复杂.
解决方法
假设名为imports.xml的主构建文件导入位于文件系统任何位置的构建文件imported.xml,并且imported.xml从imported.properties中读取一组属性:
<!-- importing.xml --> <project name="importing" basedir="." default="..."> <import file="${path_to_imported}/imported.xml"/> </project> <!-- imported.xml --> <project name="imported" basedir="." default="..."> <property file="imported.properties"/> </project>
但是,此片段将针对imported.xml的basedir解析imported.properties,因为Ant会忽略imported.xml的basedir.使用imported.properties的正确方法是:
<!-- imported.xml --> <project name="imported" basedir="." default="..."> <dirname property="imported.basedir" file="${ant.file.imported}"/> <property file="${imported.basedir}/imported.properties"/> </project>
如上所述,${ant.file.imported}存储构建脚本的路径,该脚本定义了名为imported的项目(简而言之,它存储了imported.xml的路径)和< dirname>获取其目录.此技术还允许将imported.xml用作独立文件(不在其他项目中导入).
基本上,您不能真正使用${basedir}变量,也不能使用项目标记中的basedir =“./../ GrahamsProjClient”属性,而是可以构造它:
<!-- build-client.xml --> <project name="GPClient" default="dist" > <dirname property="client.root.dir" file="${ant.file.GPClient}"/> <property name="real.basedir" value="${client.root.dir}/../GrahamsProjClient"/> <!-- Then from then on,replace ${basedir} with ${real.basedir} --> ... </project>
您可以对build-server.xml执行相同的操作,唯一需要注意的是项目名称在< dirname />的${ant.file.[project name]}文件属性中.