ANT构建时resolver:artifacts内versionVal变量未定义问题排查求助
问题根因
Ant加载执行build.xml时有固定的顺序:
- 首先全局解析所有顶级节点(即没有放在
<target>标签内的节点),此时会对节点的属性值提前做变量替换求值 - 之后才会按依赖顺序执行你指定的target任务
你现在的versionVal变量是在clean target内部赋值的,而<resolver:artifacts>是顶级节点,解析这个节点的时候clean target还没有执行,versionVal还未定义,所以属性里的${versionVal}不会被替换。而${dist.dir}是你提前在全局区域定义的静态属性,全局解析时已经有值,所以可以正常识别。<target name="nexus">内部的echo是在target执行阶段运行的,此时clean target已经执行完成,versionVal已经完成赋值,所以可以正常打印出值。
可行解决方案
方案1(改动最小,推荐):将<resolver:artifacts>移动到nexus target内部
此时<resolver:artifacts>的解析会延迟到nexus target执行时才进行,此时versionVal已经赋值完成,变量可以正常替换:
<target name="nexus" depends="clean"> <echo>"versionVal: ${versionVal}"</echo> <!-- 原顶级的resolver:artifacts移到此处 --> <resolver:artifacts id="producedArtifacts" > <resolver:artifact file="${dist.dir}/App.${versionVal}.zip"/> </resolver:artifacts> <resolver:deploy artifactsref="producedArtifacts"> <resolver:remoterepo refid="ossrh"/> </resolver:deploy> </target>
方案2:将版本号读取逻辑移到全局顶级区域
把原本写在clean target内的loadfile、loadresource代码移到所有target之外的全局区域,这样build.xml加载时就会提前完成versionVal的赋值,顶级的<resolver:artifacts>解析时就能正常拿到变量值:
<!-- 全局区域,放在所有target标签之前 --> <loadfile property="versionValTxt" srcfile="version.txt"> <filterchain> <filterreader classname="org.apache.tools.ant.filters.HeadFilter"> <param name="lines" value="1" /> </filterreader> </filterchain> </loadfile> <loadresource property="versionVal"> <propertyresource name="versionValTxt"/> <filterchain> <tokenfilter> <filetokenizer/> <replacestring from="V" to=""/> </tokenfilter> <striplinebreaks/> </filterchain> </loadresource> <echo>"Building for version: ${versionVal}"</echo> <!-- 后续的clean target、resolver:artifacts、nexus target保持原写法即可 -->
内容的提问来源于stack exchange,提问作者vick_4444
相关产品推荐
相关产品推荐

