您的位置:首页 > 理论基础 > 计算机网络

关与 ANT 工具知识 网络知识采集笔记

2009-09-30 09:36 435 查看
ANT (Another Neat Tool) 直译为 “另一种整洁的工具”

对于Java 语言而言写一个稍大一点的工程时, 一个好的构建工具 (BuildTool) 可以减少很多的重复性构建工作,而 ANT 就是一个这样的工具,而在 ANT 工作中有一个文件即 build.xml 构建文件,是值得重视的。

今天有时间就总结一下该文件的配置,也加深一下不入门的我对 Java 相关工具的认识,能积累一点就积累一点,天天学习如果不上,也不要向下。-.-

ANT 工具工作思想是 利用自体工具完成对某 Java 工程的编译、 打包、及布署的任务 (生成JAVADOC文档工作)。

而使用 ANT 工具最关键的步骤就是对 build.xml 构建文件 的设置,实际上在创建一个新的 Java 项目时,首先应该编写 Ant 构建文件。构建文件定义了构建过程,并被团队开发中每个人使用。Ant构建文件默认命名为 build.xml ,也可以取其他的名字。只不过在运行的时候把这个命名当作参数传给Ant。构建文件可以放在任何的位置。一般做法是放在项目顶层目录中,这样可以保持项目的简洁和清晰。下面是一个典型的项目层次结构。

(1) src存放文件。
(2) class存放编译后的文件。
(3) lib存放第三方JAR包。
(4) dist存放打包,发布以后的代码。

Ant 构建文件是XML文件。每个构建文件定义一个唯一的项目(Project元素)。每个项目下可以定义很多目标(target元素),这些目标之间可以有依赖关系。当执行这类目标时,需要执行他们所依赖的目标。

每个目标中可以定义多个任务,目标中还定义了所要执行的任务序列。Ant在构建目标时必须调用所定义的任务。任务定义了Ant实际执行的命令。

Ant中的任务可以为3类。

(1) 核心任务。核心任务是Ant自带的任务。
(2) 可选任务。可选任务实来自第三方的任务,因此需要一个附加的JAR文件。
(3) 用户自定义的任务。用户自定义的任务实用户自己开发的任务。

由于 XML 格式文件有着陈述式语汇,容易理解且自我描述的特点,维护起来也非常方便,许多的配置文件都采用这种格式文件,ANT 也不例外。

根据上述的工作思想及实施时的必要组织成如下配置内容的标准描述。

+----每个构建文件包含一个工程(project)。
+---- 每个工程包含若干个目标(target)。
+----目标可以依赖于其他的目标(depends)。
+----目标包含任务(task)。
+---- 易于使用Java语言增加新的任务(用户自定义扩展)。

Ant的结构如下图所示:



从上图可知:工程包含一个目标的集合。在每个目标里是任务的声明,它们是对Ant用于构建该目标的行为说明。目标生成一个依赖关系图表来声明该目标的依赖关系。当执行一个目标时,必须先执行它们依赖的目标。

通过举例说明:

这是一个典型的构建文件:

<?xml version="1.0" ?>
<project name="OurProject" default="deploy">
<target name="init">
<mkdir dir="build/classes" />
<mkdir dir="dist" />
</target>
<target name="compile" depends="init" >
<javac srcdir="src" destdir="build/classes"/>
</target>
<target name="doc" depends="init" >
<javadoc destdir="build/classes" sourcepath="src" packagenames="org.*" />
</target>
<target name="deploy" depends="compile,doc" >
<jar destfile="dist/project.jar" basedir="build/classes"/>
<ftp server="" userid="" password="">
<fileset dir="dist"/>
</ftp>
</target>
</project>

该构建过程如下:
系统初始化、编译 、生成JAVADOC 、打包 、上传到FTP,其中后两步结合到一起叫部署。

执行时输出如下:
> ant -propertyfile ftp.properties
Buildfile: build.xml
init:
[mkdir] Created dir: /home/ant/Projects/OurProject/build/classes
[mkdir] Created dir: /home/ant/Projects/OurProject/dist
compile:
[javac] Compiling 1 source file to /home/ant/Projects/OurProject/build/
classes
doc:
[javadoc] Generating Javadoc
[javadoc] Javadoc execution
[javadoc] Loading source files for package org.example.antbook.lesson1...
[javadoc] Constructing Javadoc information...
[javadoc] Building tree for all the packages and classes...
[javadoc] Building index for all the packages and classes...
[javadoc] Building index for all classes...
deploy:
[jar] Building jar: /home/ant/Projects/OurProject/dist/project.jar
[ftp] sending files
[ftp] 1 files sent
BUILD SUCCESSFUL
Total time: 5 seconds.

<?xml version="1.0" encoding="UTF-8" ?>
<project name="Test_SWT" default="run" basedir=".">
<property name="src" value="src"/>
<property name="dest" value="classes"/>
<property name="Lib" value="lib"/>
<property name="Ant_Test_jar" value="Test.jar"/>
<path id="master-classpath">
<fileset dir="lib" id="project_lib">
<include name="swt.jar"/>
</fileset>
</path>

<target name="init">
<mkdir dir="${dest}"/>
</target>
<target name="compile" depends="init">
<javac srcdir="${src}" destdir="${dest}">
<classpath refid="master-classpath"/>
</javac>
</target>

<target name="build" depends="compile">
<jar jarfile="${Ant_Test_jar}" basedir="${dest}">

<manifest>
<attribute name="Main-Class" value="test_swt.Test_SWT" />
<attribute name="Class-Path" value="lib/swt.jar" />
</manifest>

</jar>
</target>

<target name="run" depends="build">
<java classname="test_swt.Test_SWT" classpath="${Ant_Test_jar}"/>
</target>
<target name="clean">
<delete dir="${dest}" />
<delete file="${Ant_Test_jar}" />
</target>
<target name="rerun" depends="clean,run">
<ant target="clean" />
<ant target="run" />
</target>
</project>


ant_exc.bat 批处理文件源码:

ant


Test_SWT.java 文件源码:

package test_swt;

import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;

public class Test_SWT {

protected Shell shell;

/**
* Launch the application
* @param args
*/
public static void main(String[] args) {
try {
Test_SWT window = new Test_SWT();
window.open();
} catch (Exception e) {
e.printStackTrace();
}
}

/**
* Open the window
*/
public void open() {
final Display display = Display.getDefault();
createContents();
shell.open();
shell.layout();
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
}

/**
* Create contents of the window
*/
protected void createContents() {
shell = new Shell();
shell.setSize(300, 100);
shell.setText("SWT 设计学习示例程序");

final Button button1 = new Button(shell, SWT.NONE);

button1.setText("确定");
button1.setBounds(15, 15, 60, 19);
//
}

}


创建好上面目录及文件后,双击 ant_exc.bat 批处理文件启动 Ant 程序执行当前打包及运行Javar的任务,执行结果如下图所示。



build.xml 内容功能具体解析:

<?xml version="1.0" encoding="UTF-8" ?>

<!-- ************* 声明属性,可以理解为声明变量 ************** -->
<project name="Test_SWT" default="run" basedir=".">
<property name="src" value="src"/>
<property name="dest" value="classes"/>
<property name="Lib" value="lib"/>
<property name="Ant_Test_jar" value="Test.jar"/>
<path id="master-classpath">
<fileset dir="lib" id="project_lib">
<include name="swt.jar"/>
</fileset>
</path>
<!-- *************** End 声明属性 ************************* -->

<!-- ****** 创建 classes 子目录用来放置编译后的字节码 ******** -->
<target name="init">
<mkdir dir="${dest}"/>
</target>
<!-- ******************* End 创建子目录 ******************* -->

<!-- ******** 使用 javac 编译 Java 源文件为字节码 ******** -->
<!-- ****** 其中 classpath 是指向引用相关类库的位置 ****** -->
<target name="compile" depends="init">
<javac srcdir="${src}" destdir="${dest}">
<classpath refid="master-classpath"/>
</javac>
</target>
<!-- *************** End 编译 ************************* -->

<!-- ************************* 使用 Jar 打包 *************************** -->
<!-- ****** 其中 manifest 属性指向包中的 MANIFEST.MF 文件里的内容 ****** -->
<!-- ********* 其中 Main-Class 指示 主类的名称(包含路径) ************* -->
<!-- ********* 其中 Class-Path 指示 引用类库位置(包含路径) *********** -->
<target name="build" depends="compile">
<jar jarfile="${Ant_Test_jar}" basedir="${dest}">

<manifest>
<attribute name="Main-Class" value="test_swt.Test_SWT" />
<attribute name="Class-Path" value="lib/swt.jar" />
</manifest>

</jar>
</target>
<!-- ************************* End 打包 ******************************** -->

<!-- **************************** 运行 Jar 包 ******************************** -->
<!-- ****** 其中 classname 指示 运行的主类名称 ****** -->
<!-- **** 其中 classpath 指示 运行的 Jar 包名称 (注意本例默认当前路径)****** -->
<target name="run" depends="build">
<java classname="test_swt.Test_SWT" classpath="${Ant_Test_jar}"/>
</target>
<!-- *************************** End 运行包 ********************************** -->

<target name="clean">
<delete dir="${dest}" />
<delete file="${Ant_Test_jar}" />
</target>
<target name="rerun" depends="clean,run">
<ant target="clean" />
<ant target="run" />
</target>
</project>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: