apache ant编译项目的一个通用例子
1.引言
之前有个任务就是写个ant将项目打包成jar文件和war包的配置文件交给测试去进行部署使用,因为项目本身是个web项目,同时还有一些相应的后台独立程序也一起写在这个项目下,使用了一段时间后试着自己写个通用的配置文件专门用户做这种发布打包的事情,一劳永逸
2.目录结构
项目是个web项目,使用svn进行管理,标准的web项目目录结构如下
root
|——confg 配置文件存放目录
|——html webroot根目录
|——lib 引用的jar包存放的目录
|——src java源代码存放目录
我在项目下新建了个bin目录用户存放打包配置文件和打包命令
bin
|——build.xml 通用配置文件模版
|——build.properties 参数配置文件
|——jar.shell 打包成jar包脚本
|——war.shell 打包成war包脚本
使用这种的配置方法我们可以仅仅通过修改参数配置文件就可以不断重复使用这个打包的配置文件了
而不用针对不同的项目反复编写不同的build.xml了
3.例子代码
build.xml:
<?xml version="1.0" encoding="UTF-8"?>
<project name="project" default="process">
<!-- 指定参数配置文件 -->
<property file="build.properties" />
<!-- 指定环境变量参数为:SystemVariable -->
<property environment="SystemVariable" />
<!-- 指定是否配置主类判断条件 -->
<condition property="mainClass.exist">
<isset property="project.mainClass" />
</condition>
<!-- 初始化任务,创建对应的文件夹 -->
<target name="init">
<!-- 删除上次编译产生的缓存文件 和生成的类文件-->
<delete dir="${build.classes.dir}" />
<delete dir="${build.tmp.dir}" />
<!-- 删除上次编译产生打包的依赖包和配置文件包-->
<delete file="${build.dist.dir}/${project.name}_config.jar" />
<delete file="${build.dist.dir}/${project.name}_lib.jar" />
<delete file="${build.dist.dir}/${project.name}.jar" />
<delete file="${build.dist.dir}/${project.name}.war" />
<!-- 创建class文件存放的路径和缓存路径 -->
<mkdir dir="${build.classes.dir}" />
<mkdir dir="${build.tmp.dir}/${project.name}" />
<mkdir dir="${build.tmp.dir}/${project.name}/classes" />
<mkdir dir="${build.tmp.dir}/${project.name}/config" />
<mkdir dir="${build.tmp.dir}/${project.name}/lib" />
<mkdir dir="${build.tmp.dir}/${project.name}/webroot/WEB-INF/lib" />
<mkdir dir="${build.tmp.dir}/${project.name}/webroot/WEB-INF/classes" />
</target>
<!-- 编译任务 -->
<target name="compile" depends="init">
<echo message="开始编译java - ${project.name}" />
<!-- 指定编译时源码的路径,生成的class文件存放的目录,以及 编译时的相关参数-->
<javac fork="true" executable="${SystemVariable.JAVA_HOME}/bin/javac" srcdir="${build.src.dir}" destdir="${build.classes.dir}" debug="true" debuglevel="lines,vars,source" nowarn="true" includeAntRuntime="no" failonerror="true" >
<!--<compilerarg line="-encoding UTF-8 -J-Xms1024m -J-Xmx1024m"/>-->
<!-- 将编译时需要的依赖包添加到classespath中,fileset可以多个 -->
<!-- 如果是web项目注意把对应的servlet-api.jar jsp-api.jar等相关jar包引入,要不干脆直接将tomcat的lib目录直接引入 -->
<classpath>
<fileset dir="${build.lib.dir}" includes="*.jar" />
</classpath>
<!-- 将源码路径下所有的文件全部加载进来-->
<include name="**/*.*" />
<!-- 排除掉不参与编译的文件-->
<exclude name="test/**/*.*" />
<exclude name="**/test/*.*" />
<exclude name="example/**/*.*" />
</javac>
<echo message="编译完成" />
<echo message="将编译好的Class打成包" />
</target>
<target name="jar-target" depends="compile" if="mainClass.exist">
<echo message="将编译好的Class打成包,设置${project.mainClass}为运行的主类" />
<jar destfile="${build.dist.dir}/${project.name}.jar" encoding = "UTF-8" >
<!-- 指定main方法和依赖包以及配置文件包,配置文件包用空格分开 -->
<manifest>
<attribute name="Main-Class" value="${project.mainClass}"/>
<attribute name="Class-Path" value="${project.name}_lib.jar ${project.name}_config.jar"/>
</manifest>
<fileset dir="${build.classes.dir}">
<!-- 全部加进去吧,不止class文件,如果只加的话可以过滤*.class -->
<include name="**/*.class" />
</fileset>
</jar>
<echo message="打包完成" />
</target>
<target name="jar" depends="jar-target" unless="mainClass.exist">
<echo message="将编译好的Class打成包,不设置主类" />
<jar destfile="${build.dist.dir}/${project.name}.jar" encoding = "UTF-8">
<manifest>
<attribute name="Class-Path" value="${project.name}_lib.jar"/>
</manifest>
<fileset dir="${build.classes.dir}">
<include name="**/*.class" />
</fileset>
</jar>
<echo message="打包完成" />
</target>
<!-- 打包相关的文件 -->
<target name="process" depends="compile">
<echo message="复制相关配置文件" />
<copy todir="${build.tmp.dir}/${project.name}/config">
<fileset dir="${build.config.dir}" includes="**/*"/>
</copy>
<echo message="复制关联的jar包" />
<copy todir="${build.tmp.dir}/${project.name}/lib" overwrite="true">
<fileset dir="${build.lib.dir}" includes="**/*"/>
</copy>
<jar destfile="${build.dist.dir}/${project.name}_config.jar" basedir="${build.tmp.dir}/${project.name}/config"/>
<jar destfile="${build.dist.dir}/${project.name}_lib.jar" basedir="${build.tmp.dir}/${project.name}/lib"/>
</target>
<target name="war" depends="compile">
<echo message="复制文件" />
<copy todir="${build.tmp.dir}/${project.name}/webroot/WEB-INF/classes">
<fileset dir="${build.config.dir}" includes="**/*"/>
</copy>
<copy todir="${build.tmp.dir}/${project.name}/webroot" overwrite="true">
<fileset dir="${build.webroot.dir}" includes="**/*"/>
</copy>
<copy todir="${build.tmp.dir}/${project.name}/webroot/WEB-INF/lib">
<fileset dir="${build.lib.dir}" includes="*.jar" />
</copy>
<copy todir="${build.tmp.dir}/${project.name}/webroot/WEB-INF/classes">
<fileset dir="${build.classes.dir}">
<include name="**/*.class" />
</fileset>
</copy>
<echo message="复制文件完成" />
<echo message="生成war" />
<jar destfile="${build.dist.dir}/${project.name}.war" basedir="${build.tmp.dir}/${project.name}/webroot">
</jar>
<echo message="生成war完成" />
</target>
</project>
build.properties:
####################以下路径全部都是相对于build.xml存放的位置
##相关依赖jar包的存放目录
build.lib.dir=../lib
##相关配置文件的存放目录
build.config.dir=../config
##java源代码的存放目录
build.src.dir=../src
##编译的class文件的存放目录
build.classes.dir=../classes
##webroot根目录
build.webroot.dir=../html
##中间文件的缓存目录
build.tmp.dir=tmp
##打包结果存放的目录
build.dist.dir=dist
####################
####################
##项目名称
project.name=test
##Main类可以不设置,那么就是不设置Main方法的打包
project.mainClass=com.test.MainClass
####################
jar.shell:(前提,将ant配置进环境变量内可以直接调用)
ant -buildfile build.xml
运行结果图
war.shell:(前提,将ant配置进环境变量内可以直接调用)
ant -buildfile build.xml war
运行结果图