build.xml详解

本文详细介绍了构建软件开发流程的关键步骤,包括设置环境、编译源码、测试、打包、部署等,确保从源码到部署的每一个环节都能高效完成。
<?xml version="1.0" ?>
<!--  
        默认任务 default 可以指定直接执行ant
        命令的时候默认的任务可以通过指定任务
        名称(target name)运行不同的任务 比如:
        ant package
-->
<project name="tax-calculator" default="package" basedir=".">

        <!--
                设置property 可以在其他地方通过${xxx} 的方式引用 也可以通过 property file设 置具体的properties文件
                这里有个优先级 的问题 首先你可以在执行ant命令 这个优 先级是最大的 其次的是properties 文件 中的属性
                最后的优先级是写在build.xml 中的property(很怪)
        -->
        <property name="project.name" value="exampleant" />
        <property name="project.version" value="snapshot" />

        <property name="base.dir" value="." />
        <property name="dist.dir" value="${base.dir}/dist" />
        <property name="wardist.dir" value="${base.dir}/wardist" />

        <property name="testlog.dir" value="${base.dir}/testlog" />
        <property name="testlog.html.dir" value="${testlog.dir}/html" />

        <property name="source.dir" value="${base.dir}/src" />
        <property name="webroot.dir" value="${base.dir}/web" />

        <property name="build.dir" value="${base.dir}/build" />
        <property name="build.classes.dir" value="${build.dir}/classes" />
        <property name="build.test.classes.dir" value="${build.dir}/test-classes" />
        <property name="build.classes.main" value="com.javapowertools.taxcalculator.Main" />
        <property name="source.main.dir" value="${source.dir}/main" />
        <property name="source.test.dir" value="${source.dir}/test" />
        <property name="lib.dir" value="${base.dir}/lib" />

        <!--
                taskdef 可以用taskdef自定义一个任务 比如远程部署等(回去有空的话再研究下cargo)
                http://hi.baidu.com/giter/blog/item/d9fcd6431446f41673f05d1f.html
         -->
        <!--
                ant     引用其他构建文件中的任务(加载顺序由上到下  尤其要注意不要引用不存在的property 这里用的是basedir)
                        再者当前构建文件内的任务无法直接引用其他构建文件的任务(比如前置任务) 分开文件固然比较好 但是这里依旧要注意
                       
                        antfile:构建文件位置
                        target:任务名称
        -->
        <ant antfile="${base.dir}/targets/init.xml" target="init" />
        <ant antfile="${base.dir}/targets/bootstrap-findbugs.xml" target="display-properties" />

        <!--
                target  任务
                        name:任务名称
                        depends:前置任务(强调该任务执行前必须执行depends指定的任务)
                        description:描述
        -->

        <!--
                设置类路径
        -->
        <path id="compile.classpath">
                <fileset dir="${lib.dir}" includes="*.jar" />
                <pathelement path="${build.classes.dir}" />
        </path>

        <path id="test.compile.classpath">
                <path refid="compile.classpath" />
                <pathelement path="${build.test.classes.dir}" />
        </path>

        <!--
                javac   编译Java源文件
                        srcdir:源文件目录
                        destdir:输出目录
                        classpathref:classpath信息
                        includes:告诉Ant编译过程中编译哪些位置的源文件(其他位置被忽视)
                        excludes:告诉Ant编译过程中忽略那些位置的源文件
                        debug:是否开启调试信息
                        source:强调开发源代码的JDK版本
                        target:强调编译后的Class文件应该支持的JDK版本
                        compiler:指定编译器(不一定非得使用Sun的标准编译器进行编译)
        -->
        <target name="compile" description="Compile Java code">
                <javac srcdir="${source.main.dir}/resources" destdir="${build.classes.dir}" source="1.6" target="1.6" debug="true" includes="com.javapowertools.taxcalculator.**" />
                <javac srcdir="${source.main.dir}/java" destdir="${build.classes.dir}" />
        </target>

        <target name="compile-test" depends="compile" description="Compile Unit Tests">
                <javac srcdir="${source.test.dir}/resources" classpathref="test.compile.classpath" destdir="${build.test.classes.dir}" />
                <javac srcdir="${source.test.dir}/java" classpathref="test.compile.classpath" destdir="${build.test.classes.dir}" />
        </target>

        <!--
                jar             打包Java文件
                        destfile:指定输出文件
                        basedir:类文件所在位置
                       
                        tstamp  生成时间戳
                                format:设置指定格式
                        manifest        设置MANIFEST.MF信息
                                attribute       属性对象
                                        name:属性名
                                        value:属性值
        -->
        <target name="package" depends="compile,test,test-report" description="Create Jar file">
                <tstamp>
                        <format property="build.date" pattern="yyyy-MM-dd" />
                        <format property="build.time" pattern="hh:mm:ss" />
                </tstamp>
                <jar destfile="${dist.dir}/${project.name}-${project.version}.jar" basedir="${build.classes.dir}">
                        <manifest>
                                <attribute name="Main-Class" value="${build.classes.main}" />
                                <attribute name="Built-By" value="${user.name}" />
                                <attribute name="Specification-Title" value="${project.name}" />
                                <attribute name="Specification-Version" value="${project.version}" />
                                <attribute name="Specification-Vendor" value="ACME Incorporated" />
                                <attribute name="Implementation-Title" value="common" />
                                <attribute name="Implementation-Version" value="${project.version} - built at ${build.time} on ${build.date}" />
                                <attribute name="Implementation-Vendor" value="ACME Incorporated" />
                        </manifest>
                </jar>
        </target>

        <!--
                junit   单元测试
                        printsummary:是否显示单元测试类列表,如果是否的话Ant将运行测试但不显示测试结果,除非有单元测试失败
                        haltonfailure:是否测试失败就停止构建,默认为否,也就是即使测试失败也继续构建
                        fork:是否重新启用一个JVM进程进行测试(默认为false 正常情况下重新启用一个JVM进程进行测试会有意想不到的效果)
                        failureproperty:创建一个指定名称的变量 变量值为false或true 取决于junit的测试结果 并可以在其他target中被fail标签
                        assertions      指定断言机制
                                enable  该属性为所有非系统类激活断言
                                        package:指定某一个包下的类激活断言
                                        class:指定具体某一个类激活断言
                                       
                               
                        test    指定单元测试的类
                                name:类名
                               
                        batchtest       批量测试
                       
                                todir:指定日志输出目录
                               
                                fileset 文件信息
                                        dir:所在目录
                                        includes:包含的测试类
                        formatter       指定详细信息输出格式
                       
                                type:有三种格式      brief只提供失败测试的详细信息       plain提供了通过的和失败的测试数量,并列出实际成功的测试
                                         xml则用于生成报告
                                usefile:是否创建文件,默认为true
        -->
        <target name="test" depends="compile-test" description="Run unit tests">
                <junit printsummary="true" haltonfailure="false" fork="false" failureproperty="test.failures">
                        <assertions>
                                <enable />
                        </assertions>
                        <classpath refid="test.compile.classpath" />
                        <formatter type="xml" usefile="true" />
                        <!--
                                <test name="com.javapowertools.taxcalculator.TaxRateTest" />
                        -->
                        <batchtest todir="${testlog.dir}">
                                <fileset dir="${build.test.classes.dir}" includes="**/*Test.class" />
                        </batchtest>
                </junit>
        </target>

        <!--
                关于生成测试报告的建议
                        如果开发人员选择了生成测试报告 也就表示不能在测试出现问题的时候简单的停止构建(这样会影响报告的完整性)
                        但是将haltonfailure属性设置为true并不是好的解决方式,另一方面,如果测试失败就停止构建是个好主意,
                        事实上持续构建系统是依赖这一点的
                        解决方式参考Java开发超级工具集中文版50页
        -->

        <!--
                junitreport     生成报告(通过打包在ant-junit.jar内的xsl样式表来生成 有必要的话可以自行更改)
                        todir:源文件(XML)目录
                       
                        report  HTML生成模板信息定义
                                format:指定是否使用Frame 有noframes和frames两种
                                todir:指定HTML文件输出位置
                                styledir:可以自己指定HTML使用的样式
        -->
        <target name="test-report" depends="test" description="Generate HTML unit test reports">
                <junitreport todir="${testlog.dir}">
                        <fileset dir="${testlog.dir}">
                                <include name="TEST-*.xml" />
                        </fileset>
                        <report format="frames" todir="${testlog.html.dir}" />
                </junitreport>
                <fail if="test.failures" message="There were test failures." />
        </target>
        <!--
                war     打包war文件
                        destfile:指定输出文件
                        webxml:指定web.xml位置
                       
                        classes 指定类文件位置
                       
                        lib             指定lib文件位置
                               
                       
        -->
        <target name="war" depends="test-report" description="Generate WAR file">
                <war destfile="${wardist.dir}/${project.name}-${project.version}.war" webxml="${webroot.dir}/WEB-INF/web.xml">
                        <fileset dir="${testlog.html.dir}" />
                        <classes dir="${build.classes.dir}" />

                        <lib dir="${lib.dir}">
                                <include name="*.jar" />
                        </lib>
                </war>
        </target>

        <!--
                copy    复制文件
                        file:被复制的文件(也可以用fileset指定多个被复制的目录,具体用法参考前面fileset的用法)
                        todir:目标目录
                        tofile:目标文件(当原始文件需要重命名的时候)
        -->
        <target name="depoly" depends="war" description="Depoly to local Tomcat instance">
                <copy file="${wardist.dir}/${project.name}-${project.version}.war" todir="D:/Tomcat6/webapps" />
        </target>

        <target name="clean" description="Deletes generated dire ctories">
                <delete dir="${build.dir}" />
                <delete dir="${dist.dir}" />
                <delete dir="${testlog.dir}" />
        </target>
</project>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值