[备忘] Apache Ant 运行时传递控制变量

How to pass control variable from shell to Apache ant XML

[原创链接: http://www.smithfox.com/?e=177 转载请保留此声明, 谢谢!! ]

在用Ant, 有时需要在运行时传递控制性的变量, 听上去比较拗口.

看一个常见的需求: 编译成 debug版本 还是 release版本, 我希望可以通过在运行编译脚本时, 通过命令行参数来控制, 而不是写在 ant xml, 或是 build.properties文件中, 因为那样每次编译都要改文件, 相对比较麻烦.

有两种方式: 一种是通过 ANT_OPTS, 另一种是通过Ant内置 <property environment="env" />

先需要澄清一个到现在还在误传的"环境变量" 问题: "Windows下环境变量需在操作系统设置"

网上有太多的教程和例子是N年前的out的东东, 将环境变量设置在操作系统是有很多的问题的, 所以一般情况下不要设置 系统环境变量, 包括 JAVA_HOME, ANT_HOME, 这些. 

就以windows为例:

build.bat: (环境变量的设置和改变, 全部在batch 脚本中, 而不是在操作系统中)

@echo off
@set JAVA_HOME=D:\java\jdk1.6.0_26
@set ANT_HOME=D:\apache-ant-1.8.2
@set PATH=%JAVA_HOME%\bin;%PATH%;%ANT_HOME%\bin
@set ANT_OPTS="-Xmx1024m"
@rem default release
@set DEBUG=false
@rem if ( arg[1].equalsIgnoreCase("debug") )
if /i "%1" == "debug" (
    @set DEBUG=true
) else (
    @set DEBUG=false
)
echo DEBUG=%DEBUG%
rem @ant.bat -f build4.5_all.xml

上面这个build.bat usage:

# build.bat [debug|DEBUG]
 

这里有一个学习windows批处理的好网站:  http://commandwindows.com/index.html

build4.5_all.xml ( 和本主题不相关略去了 )

<?xml version="1.0" encoding="UTF-8"?>
<project default="dist">
	<!-- 环境变量, property前缀设置为 env -->
	<property environment="env" />
	
	<!-- 用 env.DEBUG, 就能引用 DEBUG 这个环境变量了 -->
	<property name="debug" value="${env.DEBUG}" />
	
	<!-- if( ! debug ) omittrace=true else omittrace=false -->
	<target name="set_omit_trace">
        <condition property="omittrace" else="false">
            <isfalse value="${debug}" />
        </condition>
    </target>
	
	<!-- 用 depends 来触发 set_omit_trace 这个task, 从而达到: omittrace= !debug 这样的效果 -->
	<target name="dist" depends="set_omit_trace" >
        <mxmlc file="${SRC_DIR}/com/smithfox/main.mxml"
				output="${BIN_DIR}/main.swf"
				incremental="false">
			<load-config filename="${FLEX_HOME}/frameworks/flex-config.xml"/>
			
			<!-- 条件编译宏, 根据 debug 属性来设置 -->
			<define name="CONFIG::debug" value="${debug}" />
			<!-- debug option, 根据 debug 属性来设置 -->
			<debug>${debug}</debug>
			<!-- mxmlc 命令行支持, 但是 flexTasks.tasks 这个 flex ant task却不支持!!!!! Adobe, 让我怎么说你呢
			<compiler.omit-trace-statements>${omittrace}</compiler.omit-trace-statements>
			-->
			<source-path path-element="${SRC_DIR}" />
		</mxmlc>
    </target>
</project>

实际上, 在Java中, 说 "system environment" 其实是指 System.getProperty("key") 这种情况, 我们知道ANT是基于Java的, 所以和大部分基于Java的库或是工具一样(比如Spring), 可以用 ${user.root} 表达式来引用环境变量,

但此处所说的 "环境变量", 其实和 windows bat, linux shell中的变量没有直接关系, 而是指 System.getProperty("user.root"); 

和 windows bat, linux shell 的关联是通过 java 命令 "java -Duser.root=xxxx"  这种方式来指定的.

回到 ANT, ant.bat 或是 ant.sh已经封装过 java启动命令, 所以我们不便直接改这两个script, 但是ant.bat(ant.sh) 已经用了另一个变量来让你设置: 那就是 ANT_OPTS

所以另一种方式就是 @set ANT_OPTS="-Ddebug=true -Xmx1024m", (怎么将 %1 转成true就略去了)

而在ant xml中, 可以直接引用 ${debug}

[原创链接: http://www.smithfox.com/?e=177 转载请保留此声明, 谢谢!! ]

smithfox | Wednesday 10 August 2011 at 1:54 pm | | other        | Used tags: , , , , , , , ,

One comment

Chanel iPhone 6 Plus Cases

You can put virtually any static image on the back of the case you want. The screen is powered separately from your phone, so it will also work when your battery is dead.

Chanel iPhone 6 Plus Cases, (URL) - 23-04-’15 14:32
(optional field)
(optional field)
为阻止垃圾广告, 请在提交评论前, 回答一个简单问题(Please answer an simple question)
Remember personal info?
Notify
Small print: All html tags except <b> and <i> will be removed from your comment. You can make links by just typing the url or mail-address.