ant环境的搭建
来源:互联网 发布:c语言字符串单引号 编辑:程序博客网 时间:2024/06/05 06:37
Ant 是apache 工程的一个子工程,是一个基于Java的build工具。Ant 类似于make工具,但没有传统的make工具的缺点。传统的make往往只能限制在某一平台上使用,ant本身用java类实现,要构建的工程的配置文件用xml格式描述,可以很方便实现多平台编译。
版本
- JDK1.6.0.21
- Ant1.8.1
安装JDK
无论用什么开发工具,JDK(Java Development Kit)都是必不可少的。从 官网上下载完JDK后,直接安装即可。我把JDK安装到了目录C:\Java\jdk1.6.0_21中。
安装成功后,必须要设置环境变量,这和使用IDE开发有所不同。
需要设置一下三项环境变量。
- JAVA_HOME = C:\Java\jdk1.6.0_21
- PATH = %JAVA_HOME%\bin;
- CLASSPATH = .;%JAVA_HOME%\lib\tools.jar;%JAVA_HOME%\lib\dt.jar (注意: 开头的点和;不能少)
- JAVA_HOME
指的是java的安装目录,系统本身是不需要配置这项的,但是其他软件比如tomcat就会从这里找java如果你不配置他们就找不到java了
- PATH
指的是系统查找执行文件的位置,比如如果你想直接在<开始-运行>里运行某个项目,这个东西必须在path目录里,不然系统会说找不到
- CLASSPATH
这个指的是java程序自动查找class的位置,就如path一样,如果你发现什么时候运行时说找不到某个class,你就需要考虑这个了
以上3个变量不区分大小写,这是windows平台
liunx平台大同小异,除了一些分隔符比如windows平台使用的"\"liunx平台是使用"/",其他都一样.
安装Ant
从这里下载最新版本的ant,下载后的ant为一个压缩包。压缩的格式可以选择zip,tar.gz 或tar.bz2。由于我是在windows下开发,所以选择了zip格式。下载后直接解压缩到C盘就可以了。当然可以放到其他任意位置。
同样,设置环境变量时必须的步骤。详细的安装参考ant在线手册。
- ANT_HOME=c:\ant
- PATH=c:\ant\bin
上述设置完成后,就可以使用ant了。
建立build.xml
用Ant编译规模较大的工程非常方便,每个工程都对应一个build.xml文件,这个文件包含与这个工程有关的路径信息和任务。下面是一个build.xml的例子:
<?
xml
version
=
"1.0"
encoding
=
"UTF-8"
?>
<
project
name
=
"dev"
basedir
=
"."
default
=
"dist"
>
<
target
name
=
"init"
>
<
property
name
=
"app.name"
value
=
"Chess"
/>
<
property
name
=
"app.vendor"
value
=
"Nokia"
/>
<
property
name
=
"app.midlet"
value
=
"GameMIDlet"
/>
<
property
name
=
"app.project"
value
=
"antdemo"
/>
<
property
name
=
"app.description"
value
=
"A demo for ant development"
/>
<
property
name
=
"app.price"
value
=
"10"
/>
<
property
name
=
"LIB_PATH"
value
=
"../lib"
/>
<
property
name
=
"compile.classpath"
value
=
"${LIB_PATH}/nokia60.zip"
/>
<
property
name
=
"proguard.classpath"
value
=
"${LIB_PATH}/proguard.jar;${compile.classpath}"
/>
</
target
>
<!-- -->
<
target
name
=
"clean"
depends
=
"init"
>
<
mkdir
dir
=
"dist"
/>
<
delete
file
=
"dist/${app.project}.jad"
/>
<
delete
file
=
"dist/${app.project}.jar"
/>
<
delete
dir
=
"temp"
/>
</
target
>
<
target
name
=
"compile"
depends
=
"clean"
>
<
mkdir
dir
=
"temp/classes"
/>
<
javac
srcdir
=
"src"
destdir
=
"temp/classes"
bootclasspath
=
"${compile.classpath}"
target
=
"1.1"
encoding
=
"UTF-8"
/>
</
target
>
<
target
name
=
"obfuscate"
depends
=
"compile"
>
<
jar
jarfile
=
"temp/${app.project}_tmp.jar"
basedir
=
"temp/classes"
/>
<
java
fork
=
"yes"
classname
=
"proguard.ProGuard"
classpath
=
"${proguard.classpath}"
>
<
arg
line
=
"-libraryjars ${proguard.classpath}"
/>
<
arg
line
=
"-injars temp/${app.project}_tmp.jar"
/>
<
arg
line
=
"-outjar temp/${app.project}_obf.jar"
/>
<
arg
line
=
"-defaultpackage ''"
/>
<
arg
line
=
"-dontusemixedcaseclassnames"
/>
<
arg
line
=
"-keep public class ${app.midlet}"
/>
<
arg
line
=
"-overloadaggressively"
/>
<
arg
line
=
"-keepclasseswithmembers public class ${app.midlet} {public void startApp();public void destroyApp(boolean);}"
/>
</
java
>
<
mkdir
dir
=
"temp/obfuscate"
/>
<
unjar
src
=
"temp/${app.project}_obf.jar"
dest
=
"temp/obfuscate"
/>
<!--
<mkdir dir="temp/obfuscate"/>
<copy todir="temp/obfuscate">
<fileset dir="temp/classes"/>
</copy>
-->
</
target
>
<
target
name
=
"preverify"
depends
=
"obfuscate"
>
<
mkdir
dir
=
"temp/build"
/>
<
exec
executable
=
"${LIB_PATH}/preverify.exe"
>
<
arg
line
=
"-classpath ${compile.classpath} -d temp/build temp/obfuscate"
/>
</
exec
>
</
target
>
<
target
name
=
"copyres"
depends
=
"preverify"
>
<
mkdir
dir
=
"temp/res"
/>
<
copy
todir
=
"temp/res"
>
<
fileset
dir
=
"res"
includes
=
"manifest.mf, *.png"
/>
</
copy
>
<
copy
todir
=
"temp/build"
>
<
fileset
dir
=
"res"
excludes
=
"manifest.mf, project.jad, *.png"
/>
</
copy
>
</
target
>
<
target
name
=
"replaceres"
depends
=
"copyres"
>
<
replace
file
=
"temp/res/manifest.mf"
encoding
=
"UTF-8"
>
<
replacefilter
token
=
"@NAME@"
value
=
"${app.name}"
/>
<
replacefilter
token
=
"@VENDOR@"
value
=
"${app.vendor}"
/>
<
replacefilter
token
=
"@MIDLET@"
value
=
"${app.midlet}"
/>
</
replace
>
</
target
>
<
target
name
=
"pngcrush"
depends
=
"replaceres"
>
<
exec
executable
=
"${LIB_PATH}/pngcrush.exe"
>
<
arg
line
=
"-d temp/build temp/res/*.png"
/>
</
exec
>
</
target
>
<
target
name
=
"dist"
depends
=
"pngcrush"
>
<
jar
jarfile
=
"dist/${app.project}.jar"
basedir
=
"temp/build"
manifest
=
"temp/res/manifest.mf"
manifestencoding
=
"UTF-8"
/>
<
taskdef
name
=
"filesize"
classname
=
"ant.FileSizeTask"
classpath
=
"${LIB_PATH}/FileSizeTask.jar"
/>
<
filesize
file
=
"dist/${app.project}.jar"
property
=
"size"
/>
<
copy
tofile
=
"dist/${app.project}.jad"
file
=
"res/project.jad"
/>
<
replace
dir
=
"dist"
includes
=
"${app.project}.jad"
encoding
=
"UTF-8"
>
<
replacefilter
token
=
"@NAME@"
value
=
"${app.name}"
/>
<
replacefilter
token
=
"@VENDOR@"
value
=
"${app.vendor}"
/>
<
replacefilter
token
=
"@MIDLET@"
value
=
"${app.midlet}"
/>
<
replacefilter
token
=
"@JAR@"
value
=
"${app.project}"
/>
<
replacefilter
token
=
"@FILESIZE@"
value
=
"${size}"
/>
<
replacefilter
token
=
"@DESCRIPTION@"
value
=
"${app.description}"
/>
<
replacefilter
token
=
"@PRICE@"
value
=
"${app.price}"
/>
</
replace
>
<!--
<copy todir="bin">
<fileset dir="dist" includes="${app.project}.*"/>
<fileset dir="temp/res" includes="manifest.mf"/>
</copy>
-->
</
target
>
</
project
>
每个build.xml文件都包含一个project和至少一个target。target包含任务元素,任务是一段可执行代码,每个任务元素都有一个id属性,以便于在文件中引用。Ant有内置任务集可供使用,如上面文件中用到的property、javac和war,分别完成设置属性、编译和打包任务。当然如果需要的话也可以写自己的任务。
build.xml的根元素是progject,它有三个属性name default basedir,其中default是必需的。name指定工程的名字,basedir表示工程的基路径,设置为"."表示build.xml所在的路径。default表示默认的target,运行ant时如果不指定target,则用default指定的target.
property任务用来设置属性,一个工程可以设置很多属性,属性有名字和值,属性设置后可以在后面引用。
<property name="dist.name" value="struts_demo"/>设置一个名字为dist.name的属性,其值为struts_demo,后面使用时用${dist.name}引用,表示字符串struts_demo.
<property name="src" location="src"/>设置一个名字为src的属性,它的值是一个路径,用location设置。如果location内容以/或\或D:\ C:\之类开始,表示绝对路径,否则表示相对路径,相对于project中设置的basedir.
使用path或classpath可以设置类的路径,后面引用时用id设置的值
构建工程最常用的ant内置任务:
- mkdir: 创建目录,dir=要创建的目录
- delete: 删除文件或文件夹 dir=要删除的文件或文件夹
- javac: 编译java源文件,java源文件放在srcdir指定的文件夹中,生成的.class文件按照 package语句组织目录,存放在destdir指定的文件夹中。要注意源文件的目录组织要与package语句相一致
上面的build.xml例子中,target中的属性depends表示在执行本target之前必须要做的target, 例如dist 的depends=compile,意思是在用dist打包之前必须先用compile编译。这样当执行dist时首先执行compile
运行Ant
使用ant.bat可以直接运行ant,如果不带任何参数,ant会在当前路径下搜索build.xml文件,如果找到,就运行project的default指定的target.也可以带参数来选择build.xml文件和要运行的target
对于上面的例子,假定build.xml所在的目录为D:\struts_demo\ ,则下面三种执行方式效果是一样的:
1. cd c:\demo ant 2. ant -buildfile d:\struts_demo\build.xml 3. ant -buildfile d:\struts_demo\build.xml dist
如果执行ant -buildfile d:\struts_demo\build.xml compile,则执行compile target。
对于熟悉了windows下开发的朋友们,是不是有点麻烦。没关系,别忘了windows也是支持批处理的,熟悉DOS的一定不会忘记autorun.bat。 写个自己的bat文件吧。只有两行就足够了。
call antpause
------------------------------补充----------------------
现在build有几种选择,用得最多恐怕还是ANT,当然Maven异军突起。有赶超前辈之势,虽然看资料说Maven多优秀,解决了ANT的问题(但是也带来新的问题),但是,我还是喜欢ANT.
使用ANT一定要写build脚本,就是build.xml。 但是“简单”的脚本也有很多学问。还是在老外的严谨的“治技术”的思想下才认识到的。把我自己体会记录在这里。
下面给出一个例子:
Build.xml代码
<
project
name
=
"project"
default
=
"dist"
basedir
=
"."
>
<
property
environment
=
"env"
/>
<
property
name
=
"root"
value
=
"."
/>
<
condition
property
=
"isUnix"
>
<
os
family
=
"unix"
/>
</
condition
>
<
condition
property
=
"isWindows"
>
<
os
family
=
"windows"
/>
</
condition
>
<
condition
property
=
"systempropsfile"
value
=
"${basedir}/unixbuild.properties"
else
=
"${basedir}/build.properties"
>
<
os
family
=
"unix"
/>
</
condition
>
<
property
file
=
"${systempropsfile}"
/>
<
path
id
=
"build.path"
>
<
fileset
dir
=
"${web.library.dir}"
>
<
include
name
=
"**/*.jar"
/>
</
fileset
>
</
path
>
<
target
name
=
"init"
description
=
""
>
<
echo
message
=
"#### S T A R T SAMPLE BUILDING ####"
/>
<
tstamp
/>
<
echo
message
=
"Started on ${TODAY} at ${TSTAMP}"
/>
<
echo
message
=
"The base directory: ${basedir}"
/>
<
echo
message
=
"Using properties file: ${systempropsfile}"
/>
</
target
>
<
target
name
=
"clean"
depends
=
"init"
>
<
delete
dir
=
"${dist.dir}/${project.war}"
/>
<
delete
dir
=
"${build.dir}"
/>
<
mkdir
dir
=
"${dist.dir}"
/>
<
mkdir
dir
=
"${build.dir}"
/>
</
target
>
....................
....................
</
project
>
1. 首先说第一行: 项目名称,这个最好用一个比较有意义的名字。而basedir变量是ANT的默认变量,指build.xml的绝对路径。 当然不写也可以直接使用,但是仍然建议显式的定义一下比较好。
2. 5~11行是处理不同平台的不同情况。如果脚本里针对不同平台调用不同的其他的脚本,这几行就很有必要了。
3. 13~16行,还是处理不同平台的情况,但是只针对properties文件,之所以有properties文件,是因为我们在不同平台下必须指定不同的目录。如果我在windows下可以指定c:/dev/project目录做为build目录,而且在linux下就不应该这么指定.所以必须加载不同的properties文件,有时在linux下还要考虑目录权限问题,如果想修改目录,把这些目录变量集中放在一个properties目录里找起来也很方便。
4. 24~30行,显示一些提示信息,这当然不是必须的,但却是必要的。例如我这里就显示日期和当前使用的properties文件。这些信息对于生成日志和检查错误很有用。
5. 32~37行,是清除以前产生的文件,在一次build开始一般都有清除的工作要做,所以一般的build里都有这个target.这里面有一个技巧,就是为什么不直接删除目录,还是先删除文件,再删除目录呢?是不是多此一举呢? 不是!因为很有可能这个目录是不能删除的,而文件一般都是可以删除的,你马上是可以产生出来文件。但是目录就不同了,可能有些目录你不可控的情况出现。只要删除文件一般也就够了。
6. 后面的target就根据自己的需要处理吧,一般没有什么好说的。
下面给出两个properties文件的内容:
Unixbuild.properties代码
#########################
### Global Settings ###
#########################
### Project base directories ###
source.dir=${basedir}/src
dist.dir=${env.HOME}/project/
build.dir=${dist.dir}/build/
web.library.dir=${basedir}/WebContent/WEB-INF/lib
build.web.library.dir=${build.dir}/WEB-INF/lib
web.classes.dir=${basedir}/WebContent/WEB-INF/classes
build.web.classes.dir=${build.dir}/WEB-INF/classes
web.content.dir=${basedir}/WebContent
web.info.dir=${basedir}/WebContent/WEB-INF
build.web.info.dir=${build.dir}/WEB-INF
build.output.dir=${dist.dir}/out/
project.war=project.war
Build.properties代码
#########################
### Global Settings ###
#########################
### Project base directories ###
source.dir=${basedir}/src
dist.dir=c:/dev/project/
build.dir=${dist.dir}/build/
web.library.dir=${basedir}/WebContent/WEB-INF/lib
build.web.library.dir=${build.dir}/WEB-INF/lib
web.classes.dir=${basedir}/WebContent/WEB-INF/classes
build.web.classes.dir=${build.dir}/WEB-INF/classes
web.content.dir=${basedir}/WebContent
web.info.dir=${basedir}/WebContent/WEB-INF
build.web.info.dir=${build.dir}/WEB-INF
build.output.dir=${dist.dir}/out/
project.war=project.war
这两个文件差别就是那7行部分,就是因为上面我提到的目录权限问题,所以linux下的默认目录不要指定到/home下等不能保证用户有权限的目录
- ant环境的搭建
- ant 环境搭建
- java ant 使用环境搭建
- Ubuntu android ant 环境搭建
- android环境搭建+ant打包
- 搭建Ant脚本运行环境
- Ant+TestNG+Webdriver环境搭建
- ant分包环境搭建过程
- Ant+Jmeter搭建测试环境
- Jenkins+ant+jmeter环境搭建
- Ant desgin 基础环境搭建
- J2EE环境搭建(四)Ant的安装和使用
- Web前端环境搭建篇之--Ant的安装
- eclipse+Ant+testng+jenkins 持续集成环境的搭建
- Ant的环境配置
- Ant—如何Windows操作系统中搭建Apache Ant环境
- hudson+ant+svn持续集成环境搭建
- Ant编译android工程之环境搭建
- android service
- Android开发之编写精美的聊天界面
- 为元素添加class ,无法绑定事件 ? jie
- jenkins系统搭建实现持续集成打包app(未完)
- Spring AOP 实现原理
- ant环境的搭建
- c# checked unchecked 关键字,在需要的时候请记得用他们两位
- 堆----【USACO3.1.3】Humble Numbers丑数
- Docker教程:docker远程repository和自建本地registry
- 关系/对象映射 多对多关系(@ManyToMany 注释)
- android studio 下载地址
- Zabbix服务端以及客户端的安装
- 关于jquery的ajax队列的一些问题
- 并查集总结