ant build Project

来源:互联网 发布:入骨相思知不知 txt 编辑:程序博客网 时间:2024/05/29 16:11

命令行


ant
使用当前目录下的build.xml运行Ant,执行缺省的target。


ant -buildfile test.xml
使用当前目录下的test.xml运行Ant,执行缺省的target。


ant -buildfile test.xml dist
使用当前目录下的test.xml运行Ant,执行一个叫做dist的target。


ant -buildfile test.xml -Dbuild=build/classes dist
使用当前目录下的test.xml运行Ant,执行一个叫做dist的target,并设定build属性的值为build/classes。


3.1 Project

<project name="demo" default="all" basedir=".">

</project>

project有下面的属性:
(1) name --项目名称(Required:No)
(2) default --当没有指定target时使用的缺省target (Required:No)
(3) basedir --用于计算所有其他路径的基路径。该属性可以被basedir property覆盖。如果属性和basedir property都没有设定,就使用buildfile文件的父目录。 (Required:No)


3.2 Targets

<target name="A"/>
<target name="B" depends="A"/>
<target name="C" depends="B"/>
<target name="D" depends="C,B,A"/>
假定我们要执行target D。C依赖于B,B依赖于A,所以先执行A,然后B,然后C,最后D被执行。
一个target只能被执行一次,即时有多个target依赖于它。
<target name="build-module-A" if="module-A-present"/>
<target name="build-own-fake-module-A" unless="module-A-present"/>
module-A-present有值,执行target build-module-A,不执行target build-own-fake-module-A。
target有下面的属性:
(1) name --target的名字 (Required Yes)
(2) depends --用逗号分隔的target的名字列表,也就是依赖表。 (Required No)

(3) if --满足条件执行(true)。 (Required No)

(4) unless --不满足条件执行(false)。 (Required No)

(5) description --关于target功能的简短描述。 (Required No)

(6) extensionOf --把当前target加入到指定target的依赖中。(Required No) --ant 1.8.0

(7) onMissingExtensionPoint --如果(6)中指定的target不存在怎么办("fail","warn","ignore")。(Required No ,必须设置了extensionOf才能用,默认“fail”.) --ant 1.8.2

 

3.3 Tasks
一个task是一段可执行的代码。
可以给task赋一个id属性:
<taskname id="taskID" ... />
这里taskname是task的名字,而taskID是这个task的唯一标识符。通过这个标识符,你可以在脚本中引用相应的task。例如,在脚本中你可以这样:
<script ... >
task1.setFoo("bar");
</script>
设定某个task实例的foo属性。在另一个task中(用java编写),你可以利用下面的语句存取相应的实例。
project.getReference("task1").
注意:如果task1还没有运行,就不会被生效(例如:不设定属性),如果你在随后配置它,你所作的一切都会被覆盖。


3.4 Properties

(1) <property file="sample.properties"/>
在属性文件 sample.properties中: 
dir.build=builddir.src=srcjdom.home=../java-tools/jdom-b8jdom.jar=jdom.jarjdom.jar.withpath=${jdom.home}/build/${jdom.jar}

(2) <property name="builddir" value="build" />

${builddir} /classes可被解析为build/classes

 

内置属性
例如,${os.name}对应操作系统的名字。

 

java.versionJava Runtime Environment versionjava.vendorJava Runtime Environment vendorjava.vendor.urlJava vendor URLjava.homeJava installation directoryjava.vm.specification.versionJava Virtual Machine specification versionjava.vm.specification.vendorJava Virtual Machine specification vendorjava.vm.specification.nameJava Virtual Machine specification namejava.vm.versionJava Virtual Machine implementation versionjava.vm.vendorJava Virtual Machine implementation vendorjava.vm.nameJava Virtual Machine implementation namejava.specification.versionJava Runtime Environment specification versionjava.specification.vendorJava Runtime Environment specification vendorjava.specification.nameJava Runtime Environment specification namejava.class.versionJava class format version numberjava.class.pathJava class pathjava.library.pathList of paths to search when loading librariesjava.io.tmpdirDefault temp file pathjava.compilerName of JIT compiler to usejava.ext.dirsPath of extension directory or directoriesos.nameOperating system nameos.archOperating system architectureos.versionOperating system versionfile.separatorFile separator ("/" on UNIX)path.separatorPath separator (":" on UNIX)line.separatorLine separator ("\n" on UNIX)user.nameUser's account nameuser.homeUser's home directoryuser.dirUser's current working directory


baseddir --project基目录的绝对路径 (与<project>的basedir属性一样)

ant.file --buildFile的绝对路径

ant.version --Ant的版本

ant.project.name --当前执行的project的名字,由<project>的name属性设

ant.project.default-target --当前执行的project的default-target名字

ant.project.invoked-targets --a comma separated list of the targets that have been specified on                      the command line (the IDE, an <ant> task ...) when invoking the current project.

ant.java.version --Ant版本(“1.2”,“1.3”,“1.4”,“1.5”,“1.6”)

ant.core.lib --ant.jar文件的绝对路径

 

3.5 Path-like Structures
你可以用":"和";"作为分隔符,指定类似PATH和CLASSPATH的引用。Ant会把分隔符转换为当前系统所用的分隔符。

当需要指定类似路径的值时,可以使用嵌套元素。一般的形式是
<classpath>
<pathelement path="${classpath}"/>
<pathelement location="lib/helper.jar"/>
</classpath>
location属性指定了相对于project基目录的一个文件和目录,而path属性接受逗号或分号分隔的一个位置列表。path属性一般用作预定义的路径--其他情况下,应该用多个location属性。

为简洁起见,classpath标签支持自己的path和location属性。所以:
<classpath>
<pathelement path="${classpath}"/>
</classpath>
可以被简写作:
<classpath path="${classpath}"/>
也可通过<fileset>元素指定路径。构成一个fileset的多个文件加入path-like structure的顺序是未定的。
<classpath>
<pathelement path="${classpath}"/>
<fileset dir="lib">
<include name="**/*.jar"/>
</fileset>
<pathelement location="classes"/>
</classpath>
上面的例子构造了一个路径值包括:${classpath}的路径,跟着lib目录下的所有jar文件,接着是classes目录。

如果你想在多个task中使用相同的path-like structure,你可以用<path>元素定义他们(与target同级),然后通过id属性引用。

path-like structure可能包括对另一个path-like structurede的引用(通过嵌套<path>元素):
<path id="base.path">
<pathelement path="${classpath}"/>
<fileset dir="lib">
<include name="**/*.jar"/>
</fileset>
<pathelement location="classes"/>
</path>
<path id="tests.path">
<path refid="base.path"/>
<pathelement location="testclasses"/>
</path>
前面所提的关于<classpath>的简洁写法对于<path>也是有效的,如:
<path id="base.path">
<pathelement path="${classpath}"/>
</path>
可写成:
<path id="base.path" path="${classpath}"/>

 

命令行变量
有些task可接受参数,并将其传递给另一个进程。为了能在变量中包含空格字符,可使用嵌套的arg元素。

value --一个命令行参数;可包含空格字符。
line --空格分隔的命令行参数列表。 
file --作为命令行变量的文件名;会被文件的绝对名替代。 
path --...

pathref --...

prefix --...

suffix --...

例子
<arg value="-l -a"/>
是一个含有空格的单个的命令行变量,不分“-l”和"-a"
<arg line="-l -a"/>,“-l”和"-a"
是两个空格分隔的命令行变量。
<arg path="/dir;/dir2:\dir3"/>
是一个命令行变量,其值在DOS系统上为\dir;\dir2;\dir3;在Unix系统上为/dir:/dir2:/dir3 。

References
buildFile元素的id属性可用来引用这些元素。如果你需要一遍遍的复制相同的XML代码块,这一属性就很有用--如多次使用<classpath>结构。

下面的例子:
<project ... >
<target ... > 
<rmic ...> 
<classpath> 
<pathelement location="lib/"/> 
<pathelement path="${java.class.path}/"/> 
<pathelement path="${additional.path}"/> 
</classpath> 
</rmic> 
</target>
<target ... >
<javac ...>
<classpath>
<pathelement location="lib/"/>
<pathelement path="${java.class.path}/"/>
<pathelement path="${additional.path}"/>
</classpath>
</javac>
</target>
</project>
可以写成如下形式:
<project ... > 
<path id="project.class.path"> 
<pathelement location="lib/"/>
<pathelement path="${java.class.path}/"/> 
<pathelement path="${additional.path}"/> 
</path>
<target ... >
<rmic ...>
<classpath refid="project.class.path"/>
</rmic>
</target>
<target ... > 
<javac ...>
<classpath refid="project.class.path"/>
</javac>
</target>
</project>
所有使用PatternSets, FileSets 或 path-like structures嵌套元素的task也接受这种类型的引用。




1. 拷贝单个文件到指定目录下。
例:<copy todir="${basedir}/new" file="${basedir}/old/old1.txt1"> 
将${basedir}/old/old.txt文件拷贝到${basedir}/new下

2. 拷贝一批文件到指定目录下
例:<copy todir="${basedir}/new">
           <fileset dir="${basedir}/old">
              <include name="old1.txt" />
              <include name="old2.txt" />
              <exclude name="old8.txt" />
          </fileset>
       </copy>
      这里fileset定义的是原文件的组成形式,<include/>子属性表示包括,<exclude/>子属性表示排除,很简单,通过他们组合实现多文件的筛选,当然我这个例子用得很傻。比如
                <include name="appgen/**"/>
                <include name="ibatis/**"/>
                <exclude name="**/*.log"/>
      拷贝appget目录和ibatis目录下除了.log文件以外的其它所有文件和子目录。

      可以把<fileset/>简写成<fileset dir="${basedir}/old" includes="old1.txt,old2.txt" />,includes可以理解成include的复数形式,包含多个文件时用逗号隔开,excludes也一样。

3. 拷贝一个目录到指定目录下
例:<copy todir="${basedir}/new">
           <fileset dir="${basedir}/old">
             <include name="appgen" />
             <include name="appgen/" />
             <include name=appgen/**" />
             <include name="appgen/***" />
           </fileset>
       </copy>
      同样使用<fileset/>属性,name指定目录名,不过这里要分两种情况,用<include/>子属性和不用<include/>子属性.
      若使用<include/>, 又要分三种情况
          若是“appgen”,则只会拷贝名为appgen的空目录过去,它里面的文件和子目录则不会拷贝。
          若是“appgen/”,或“appgen/**”,则会把整个appgen目录拷贝过去,包括里面的文件和子目录。
          若是“appgen/*”,则只会把该目录和该目录下第一级子目录的所有东西拷贝过去,而不会拷贝第二级和第二级以下的。注:“appgen/*”这儿是一个*号,*号若大于两个,也跟一个*号是同样效果。比如“appgen/*”和“appgen/****”都只拷贝appgen目录下第一级子目录。

注:若appeng这个目录本身就是个空目录,无论怎么写,这个空目录都不会被拷贝。也就是说,copy操作不会产生创建空目录的作用,要想创建空目录,只有用mkdir。

      若不使用任何<include>属性,如
           <fileset dir="${basedir}/old">
           </fileset>
      则会拷贝${basedir}/old下的所有文件和子目录。

注:使用<exclude/>排除目录时,目录名必须写成“appgen/”或“appgen/**”形式,否则不会生效。

      以上是三种拷贝到目录的种类,注意如果计算机中没有todir指定的路径,ant将会自动创建这个路径。

4. 拷贝单个的文件: 
〈copy tofile="old.txt" file="new.txt" /〉就这么简单就行了。
当然也可以写成
  <copy tofile="${basedir}/new/new.txt">
     <fileset dir="${basedir}/old" includes="old.txt" />
  </copy>
      这里includes就只能写一个文件,不能写上多个文件,因为不能将多个文件复制到一个文件中去,所以这样麻烦的写法是没有意义的。



      复制肯定还要涉及到同名覆盖的问题,ant在copy类的API中说明:Files are only copied if the source file is newer than the destination file,这里的newer是指文件的修改时间,即使你在修改时文件内容没有任何变化,只是导致修改时间变了,ant同样会覆盖同名文件,也就是说,ant不会检查文件内容。

      对于是复制目录的情况,由于目录没有修改时间,ant还是通过检查目录内文件的修改时间来决定是否覆盖的,若目录内某文件修改时间有变化,则会覆盖这个文件,而不是整个目录。

如果要强行覆盖,<copy/>有个overwrite属性,默认为false,改成true就行了。


___________________________________________________________________________________________________________________

<target name="jar" depends="myComplie">        <!--获取当前时间-->        <tstamp/>        <!--引用时间-->        <jar destfile="${dist}/user-${TSTAMP}.jar" basedir="${complie}">            <manifest>                <attribute name="Built-By" value="${user.name}"/>                <attribute name="Main-Class" value="cn.lxl.innerclass.test3"/>            </manifest>        </jar>    </target>         <target name="del">        <!--删除单个文件-->        <delete file="${dist}/user.jar"></delete>    </target>    <target name="copy" depends="mk">        <!--copy文件到另一个目录下面,指定文件名-->        <copy file="src/cn/lxl/innerclass/Test3.java" tofile="${xiaolei}/Test3.java"></copy>        <!--在源路径中修改文件名-->        <move file="src/cn/lxl/innerclass/Test3.java" tofile="src/cn/lxl/innerclass/Test13.java"></move>        <!--移动文件到另一个目录-->        <copy file="src/cn/lxl/innerclass/Test13.java" todir="${xiaolei}"></copy>    </target>     </project>


#beanArray值样例: beanArray=com.example.BeanAccount;com.example.BeanPerson;
#beanArray设置后,将会生成Bean的列表,编辑,新增,修改页及删除功能.实现了下拉刷新,缓存,图片压缩,网络图片,ListView优化.
#Bean必须继承自fay.frame.tools.Bean
beanArray=
#--------------------------------------------------------------------------------
#在此输入你的公司名称,Coco框架将会根据此名称,构建Eclipse中java代码自动注释.
name_company=我的公司
#--------------------------------------------------------------------------------
#项目的lib包目录
path_lib=libs
#--------------------------------------------------------------------------------
#Android SDK路径
sdk.dir=D:/soft/eclipse20147/adt-bundle-windows-x86_64-20140702/sdk
#--------------------------------------------------------------------------------
#出现错误: JDK version latest或者类似JDK版本的问题
#请在Cocobuild.xml第375行插入:executable="你的路径/jdk1.7.0/bin/javac.exe"
#--------------------------------------------------------------------------------
#出现错误: Execute failed: java.io.IOException: Cannot run program "...zipalign.exe"
#请把android.tools.dir的值设置为包含zipalign.exe的文件夹
android.tools.dir=${sdk.dir}/tools
android.platform.tools.dir=${sdk.dir}/platform-tools
#android.tools.dir=${sdk.dir}/build-tools/android-4.4W
#android.platform.tools.dir=${sdk.dir}/build-tools/android-4.4W
#########################################################################################


#以下为框架配置,如无特别需要,不用修改
path_root=CocoBuild
path_res =../res
path_layout =${path_res}/layout/
path_assets=../assets
path_src =../src
lib_cocobuild=lib/Cocobuild.jar
lib_cocoframe=lib/Cocoframe.jar
#直接用命令行运行build文件,则需额外配置Cocobuild.xml>>>refreshActicity_mainfest>>>resourcecontains>>>resource属性为"你的项目地址//AndroidManifest.xml"
#如果ant的java命令报class version错误,是因为你的ant和Android的jre版本不一致.设置项目的java compiler和ant一致即可.
#project.properties 以下这句可引起proguard问题.proguard.config=${sdk.dir}/tools/proguard/proguard-android-optimize.txt:proguard-project.txt
#project.properties android.library.reference.1=../COCOFrame 以下这句可引起问题 Target "nodeps" does not exist in the project "Coco". 
#<property name="zipalign" location="${android.tools.dir}/build-tools/android-4.4W/zipalign${exe}" />buildapk.xml中写死的路径
#某些时候, ..(两个点)并不能使目录向上一级,即使他在XML中使用ctrl键真的可以链接过去.例如

//这行代码想引用到上一级目录下的AndroidManifest.xml文件. 他是失败的.
<condition property="ifStrucEclips">
<resourcecontains
resource="../AndroidManifest.xml"
substring="activity" />
</condition>

//这样即可
<property name="parentDir" location=".." />
<condition property="ifStrucEclips">
<resourcecontains
resource="${parentDir}/AndroidManifest.xml"
substring="application" />
</condition>


#某些时候, ..(两个点)并不能使目录向上一级,即使他在XML中使用ctrl键真的可以链接过去.例如resourcecontains的resource,写成../AndroidManifest.xml亦可链接,但其实不可用
#<resourcecontains
# resource="D:\work\Dropbox\COCOFrameTest_black\AndroidManifest.xml"
# substring="service" />




#路径要定义在property中再使用
#<property
# name="PATH_MAINFEST"
# value="D:\work\Dropbox\COCOFrameTest_black\AndroidManifest.xml" />





0 0
原创粉丝点击