以java编程方式调用 Apache Ant
2009-11-16 16:42
169 查看
Apache Ant
是一个基于
Java
的开放源代码构建实用工具。人们常把它与
Make
进行比较,
Make
长期以来一直用于帮助自动完成构建过程。经过不同版本的改进,
Ant
已发展成一个丰富的功能库,使其成为适用于许多场合的合适工具。例如,
Ant
的当前版本提供的一些任务包括了操作文件内容、执行命令行和
Java
程序以及启动
SSH
和
FTP
连接的功能。
由于定义所有构建逻辑的
Ant
构建文件都是用
XML
编写的,因此,如果需要更改逻辑,则不需要重新编译代码,也不需要了解语言特定的语法。此外,
Ant
具有高度的可扩展性。它提供了使用
Java™
创建您自己的自定义任务的功能,之后又可以通过与使用任何其他
Ant
任务相同的方式使用
Java™
。所有这些联系在一起意味着
Ant
是可以执行很多任务的极好选择。
在大多数情况下,一旦创建好构建文件,就可以从带有适当目标
(
例如,
ant dist)
的命令行调用
Ant
可执行文件来执行它们,也可以使用一些
IDE
工具如
: Eclipse
内置
Run Ant
命令来执行它们。然而,
也存在更适合于从
Java
程序中启动
Ant
的情况
。这可能要根据
Java
程序检测到的某组条件来开始一系列的操作,或者,它只是利用程序内丰富的
Ant
内置功能。在这种情况下,您需要继续创建一个构建文件,就像从命令行调用
Ant
时那样,但之后您需要将对
Ant Java API
的正确调用插入到程序中。本文将通过检查必要的
Java
代码并向您展示如何在
Eclipse
内运行此代码来帮助您处理此过程。
下面我们开始一个简单例子的开发:
1
.首先在
eclipse
下创建一个工程,如图:
1.1
在
src
目录下创建一个
build.xml
文件
,
输入如下内容:
<?xml version="1.0"?>
<project
name=
"testproject"
default=
"test"
basedir=
"."
>
<target
name=
"test"
>
<echo
message=
"Hello ${name}"
/>
</target>
</project>
<project>
标签代码一个需要构建的项目,
<target>
是项目构建中的一个目标,在这里为了简单,我只为工程添加了一个目标。通过代码调用,执行该目标。
测试
build.xml
文件是否合法,右键
build.xml
文件,选择
Run As --- ant build ,
在控制台出现如下信息:
Buildfile:
D:/eclipse-SDK-3.4-win32/project/ant_project/src/build.xml
test
:
[
echo
] Hello world
BUILD SUCCESSFUL
Total time: 203 milliseconds
代表
build.xml
文件是合法的,如是出现
BUILD FAILED
字样,刚需要调试
build.xml
,保证其是一个正确的
xml.
1.2
在编写代码之前我们需要导入如下包:
Ant1.7
我资源包中
lib
中存放这些
jar
包
1.3
在
com.sntt.ant.antprj
包中创建一个
AntSample
类
,
输入如下代码:
package com.sntt.ant.pro;
import java.io.File;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.DefaultLogger;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.ProjectHelper;
public class AntSample {
public static void main(String[] args) {
File buildFile=new File(".//src//build.xml");
//
创建一个
ANT
项目
Project p=new Project();
//
创建一个默认的监听器
,
监听项目构建过程中的日志操作
DefaultLogger consoleLogger = new DefaultLogger();
consoleLogger.setErrorPrintStream(System.err);
consoleLogger.setOutputPrintStream(System.out);
consoleLogger.setMessageOutputLevel(Project.MSG_INFO);
p.addBuildListener(consoleLogger);
try{
p.fireBuildStarted();
//
初始化该项目
p.init();
ProjectHelper helper=ProjectHelper.getProjectHelper();
//
解析项目的构建文件
helper.parse(p, buildFile);
//
执行项目的某一个目标
p.executeTarget(p.getDefaultTarget());
p.fireBuildFinished(null);
}catch(BuildException be){
p.fireBuildFinished(be);
}
}
}
右键运行该类文件,会在控制台再现如下信息:
test:
[echo] Hello world
BUILD SUCCESSFUL
Total time: 0 seconds
说明我们使用
java
代码实现
ANT
中目标调用。
代码注解:
创建一个新的
Project
对象。
Project
是
Ant
用于表示带有其所有
目标、任务和属性
的
Ant
项目的
Java
类。它初始化此项目
;
这将导致该项目执行某一内部安装程序。然后,它定位缺省的
ProjectHelper(
是一个使用
XML
文件配置整个项目的类
)
,并使用该
ProjectHelper
分析此构建文件,并将来自构建文件的信息填充到项目中。接下来,它将执行此项目的缺省目标。
您还可以通过传递目标名称,例如
p.executeTarget("test")
,来执行此构建文件中的任何目标
(
在此构建文件中,碰巧只有一个目标
)
。
即使所有这些操作都成功完成,您仍看不到任何输出,因为
Ant
不知道应将结果输出到哪里。当通过命令行或
eclipse
执行
Ant
时,输出将自动转到控制台。但是此处您需要明确指出。您需要添加一个
BuildLogger
作为
侦听器
,这样,它就可以
接收构建过程中发出的事件通知。
记录器
您可以使用几种不同的
BuildLogger
,包括
DefaultLogger
、
AnsiColorLogger
、
MailLogger
和
NoBannerLogger
。您也可以编写自己的
BuildLogger
,并将其注册到项目中。事实上,您可以注册实现
BuildListener
接口的任何类,以接收构建事件,并对您的类中的这些构建事件做出响应
(
例如,接收一个
taskCompleted
事件,并增加进度栏
)
。对于这种情况,请注册最简单的记录器和
DefaultLogger
,并将输出消息直接输出到标准输出,将错误消息直接输出到标准错误。要做到这一点,所以在创建项目之后初始化项目之前添加以下代码行
:
DefaultLogger consoleLogger = new DefaultLogger();
consoleLogger.setErrorPrintStream(System.err);
consoleLogger.setOutputPrintStream(System.out);
consoleLogger.setMessageOutputLevel(Project.MSG_INFO);
p.addBuildListener(consoleLogger);
构建事件
虽然您现在正在获取输出,但却没有获取关于
构建操作是否成功完成或者构建的运行时间
的任何信息。最终您还需要激发某些事件,以让
Ant
知道正在启动构建,并且已完成。您还需要将
execute()
方法抛出的任何
异常加入到
fireBuildFinished
方法中,以便能够传递到侦听器
。添加此代码后,主方法如下所示
:
File buildFile = new File("build.xml");
Project p = new Project();
DefaultLogger consoleLogger = new DefaultLogger();
consoleLogger.setErrorPrintStream(System.err);
consoleLogger.setOutputPrintStream(System.out);
consoleLogger.setMessageOutputLevel(Project.MSG_INFO);
p.addBuildListener(consoleLogger);
try {
p.fireBuildStarted();
//
项目开始构建
p.init();
ProjectHelper helper = ProjectHelper.getProjectHelper();
helper.parse(p, buildFile);
p.executeTarget(p.getDefaultTarget());
p.fireBuildFinished(null);
//
构建结束
} catch (BuildException e) {
p.fireBuildFinished(e);
//
构建抛出异常
}
右键单击类文件中的任何位置,并选择
Source => Organize Imports
,然后保存。此时,如果您运行此代码,就会看到所希望的输出。要更改输出中的信息数量,请更改消息输出级别
(
而不是尝试更改
Project.MSG_VERBOSE)
。
属性
就像在任何其他
Ant
构建文件中一样,您可以定义属性或将属性文件导入到此构建文件中。但可能存在这样的情况,即您希望以编程方式提供这些属性,或覆盖构建文件中的值。编辑
build.xml
文件并将
Hello World
替换为
Hello ${name}
。正是这个语法告诉
Ant
在运行时执行变量替换。保存文件。
如果再次运行您的程序,您将看到该程序输出
“Hello ${name}”
,因为尚未设置此变量
“name”
的值。在
AntSample.java
中,在创建此
Project
对象的位置的下面添加以下行
:
p.setProperty("name", "Bob");
保存文件。现在再次运行
Run As
--- Ant build
。您应看到如下输出
test:
[echo] Hello Bob
BUILD SUCCESSFUL
Total time: 1 second
您甚至可以在回显任务之前将行
添加到
build.xml
文件中,但这不会产生任何变化。以编程方式设置的属性将始终覆盖在构建文件中设置的属性。
是一个基于
Java
的开放源代码构建实用工具。人们常把它与
Make
进行比较,
Make
长期以来一直用于帮助自动完成构建过程。经过不同版本的改进,
Ant
已发展成一个丰富的功能库,使其成为适用于许多场合的合适工具。例如,
Ant
的当前版本提供的一些任务包括了操作文件内容、执行命令行和
Java
程序以及启动
SSH
和
FTP
连接的功能。
由于定义所有构建逻辑的
Ant
构建文件都是用
XML
编写的,因此,如果需要更改逻辑,则不需要重新编译代码,也不需要了解语言特定的语法。此外,
Ant
具有高度的可扩展性。它提供了使用
Java™
创建您自己的自定义任务的功能,之后又可以通过与使用任何其他
Ant
任务相同的方式使用
Java™
。所有这些联系在一起意味着
Ant
是可以执行很多任务的极好选择。
在大多数情况下,一旦创建好构建文件,就可以从带有适当目标
(
例如,
ant dist)
的命令行调用
Ant
可执行文件来执行它们,也可以使用一些
IDE
工具如
: Eclipse
内置
Run Ant
命令来执行它们。然而,
也存在更适合于从
Java
程序中启动
Ant
的情况
。这可能要根据
Java
程序检测到的某组条件来开始一系列的操作,或者,它只是利用程序内丰富的
Ant
内置功能。在这种情况下,您需要继续创建一个构建文件,就像从命令行调用
Ant
时那样,但之后您需要将对
Ant Java API
的正确调用插入到程序中。本文将通过检查必要的
Java
代码并向您展示如何在
Eclipse
内运行此代码来帮助您处理此过程。
下面我们开始一个简单例子的开发:
1
.首先在
eclipse
下创建一个工程,如图:
1.1
在
src
目录下创建一个
build.xml
文件
,
输入如下内容:
<?xml version="1.0"?>
<project
name=
"testproject"
default=
"test"
basedir=
"."
>
<target
name=
"test"
>
<echo
message=
"Hello ${name}"
/>
</target>
</project>
<project>
标签代码一个需要构建的项目,
<target>
是项目构建中的一个目标,在这里为了简单,我只为工程添加了一个目标。通过代码调用,执行该目标。
测试
build.xml
文件是否合法,右键
build.xml
文件,选择
Run As --- ant build ,
在控制台出现如下信息:
Buildfile:
D:/eclipse-SDK-3.4-win32/project/ant_project/src/build.xml
test
:
[
echo
] Hello world
BUILD SUCCESSFUL
Total time: 203 milliseconds
代表
build.xml
文件是合法的,如是出现
BUILD FAILED
字样,刚需要调试
build.xml
,保证其是一个正确的
xml.
1.2
在编写代码之前我们需要导入如下包:
Ant1.7
我资源包中
lib
中存放这些
jar
包
1.3
在
com.sntt.ant.antprj
包中创建一个
AntSample
类
,
输入如下代码:
package com.sntt.ant.pro;
import java.io.File;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.DefaultLogger;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.ProjectHelper;
public class AntSample {
public static void main(String[] args) {
File buildFile=new File(".//src//build.xml");
//
创建一个
ANT
项目
Project p=new Project();
//
创建一个默认的监听器
,
监听项目构建过程中的日志操作
DefaultLogger consoleLogger = new DefaultLogger();
consoleLogger.setErrorPrintStream(System.err);
consoleLogger.setOutputPrintStream(System.out);
consoleLogger.setMessageOutputLevel(Project.MSG_INFO);
p.addBuildListener(consoleLogger);
try{
p.fireBuildStarted();
//
初始化该项目
p.init();
ProjectHelper helper=ProjectHelper.getProjectHelper();
//
解析项目的构建文件
helper.parse(p, buildFile);
//
执行项目的某一个目标
p.executeTarget(p.getDefaultTarget());
p.fireBuildFinished(null);
}catch(BuildException be){
p.fireBuildFinished(be);
}
}
}
右键运行该类文件,会在控制台再现如下信息:
test:
[echo] Hello world
BUILD SUCCESSFUL
Total time: 0 seconds
说明我们使用
java
代码实现
ANT
中目标调用。
代码注解:
创建一个新的
Project
对象。
Project
是
Ant
用于表示带有其所有
目标、任务和属性
的
Ant
项目的
Java
类。它初始化此项目
;
这将导致该项目执行某一内部安装程序。然后,它定位缺省的
ProjectHelper(
是一个使用
XML
文件配置整个项目的类
)
,并使用该
ProjectHelper
分析此构建文件,并将来自构建文件的信息填充到项目中。接下来,它将执行此项目的缺省目标。
您还可以通过传递目标名称,例如
p.executeTarget("test")
,来执行此构建文件中的任何目标
(
在此构建文件中,碰巧只有一个目标
)
。
即使所有这些操作都成功完成,您仍看不到任何输出,因为
Ant
不知道应将结果输出到哪里。当通过命令行或
eclipse
执行
Ant
时,输出将自动转到控制台。但是此处您需要明确指出。您需要添加一个
BuildLogger
作为
侦听器
,这样,它就可以
接收构建过程中发出的事件通知。
记录器
您可以使用几种不同的
BuildLogger
,包括
DefaultLogger
、
AnsiColorLogger
、
MailLogger
和
NoBannerLogger
。您也可以编写自己的
BuildLogger
,并将其注册到项目中。事实上,您可以注册实现
BuildListener
接口的任何类,以接收构建事件,并对您的类中的这些构建事件做出响应
(
例如,接收一个
taskCompleted
事件,并增加进度栏
)
。对于这种情况,请注册最简单的记录器和
DefaultLogger
,并将输出消息直接输出到标准输出,将错误消息直接输出到标准错误。要做到这一点,所以在创建项目之后初始化项目之前添加以下代码行
:
DefaultLogger consoleLogger = new DefaultLogger();
consoleLogger.setErrorPrintStream(System.err);
consoleLogger.setOutputPrintStream(System.out);
consoleLogger.setMessageOutputLevel(Project.MSG_INFO);
p.addBuildListener(consoleLogger);
构建事件
虽然您现在正在获取输出,但却没有获取关于
构建操作是否成功完成或者构建的运行时间
的任何信息。最终您还需要激发某些事件,以让
Ant
知道正在启动构建,并且已完成。您还需要将
execute()
方法抛出的任何
异常加入到
fireBuildFinished
方法中,以便能够传递到侦听器
。添加此代码后,主方法如下所示
:
File buildFile = new File("build.xml");
Project p = new Project();
DefaultLogger consoleLogger = new DefaultLogger();
consoleLogger.setErrorPrintStream(System.err);
consoleLogger.setOutputPrintStream(System.out);
consoleLogger.setMessageOutputLevel(Project.MSG_INFO);
p.addBuildListener(consoleLogger);
try {
p.fireBuildStarted();
//
项目开始构建
p.init();
ProjectHelper helper = ProjectHelper.getProjectHelper();
helper.parse(p, buildFile);
p.executeTarget(p.getDefaultTarget());
p.fireBuildFinished(null);
//
构建结束
} catch (BuildException e) {
p.fireBuildFinished(e);
//
构建抛出异常
}
右键单击类文件中的任何位置,并选择
Source => Organize Imports
,然后保存。此时,如果您运行此代码,就会看到所希望的输出。要更改输出中的信息数量,请更改消息输出级别
(
而不是尝试更改
Project.MSG_VERBOSE)
。
属性
就像在任何其他
Ant
构建文件中一样,您可以定义属性或将属性文件导入到此构建文件中。但可能存在这样的情况,即您希望以编程方式提供这些属性,或覆盖构建文件中的值。编辑
build.xml
文件并将
Hello World
替换为
Hello ${name}
。正是这个语法告诉
Ant
在运行时执行变量替换。保存文件。
如果再次运行您的程序,您将看到该程序输出
“Hello ${name}”
,因为尚未设置此变量
“name”
的值。在
AntSample.java
中,在创建此
Project
对象的位置的下面添加以下行
:
p.setProperty("name", "Bob");
保存文件。现在再次运行
Run As
--- Ant build
。您应看到如下输出
test:
[echo] Hello Bob
BUILD SUCCESSFUL
Total time: 1 second
您甚至可以在回显任务之前将行
添加到
build.xml
文件中,但这不会产生任何变化。以编程方式设置的属性将始终覆盖在构建文件中设置的属性。
相关文章推荐
- 以java编程方式调用 Apache Ant
- 以编程方式调用 Apache Ant
- java调用webservice的四种方式
- Redis的Java客户端Jedis的八种调用方式(事务、管道、分布式)介绍
- 使用C#创建webservice及三种调用方式 (ASP.NETweb编程常用到的27个函数集)
- java 实现WebService 以及不同的调用方式
- JAVA项目中发布WebService服务——调用方式
- Redis的Java客户端Jedis的八种调用方式(事务、管道、分布式)介绍
- java 实现WebService 4000 以及不同的调用方式
- 通过客户端编程的方式调用webservice
- Java并发编程:线程间协作的两种方式:wait、notify、notifyAll和Condition
- Java并发编程:线程间协作的两种方式:wait、notify、notifyAll和Condition
- quartz用编程方式调用的实例
- java 实现WebService 以及不同的调用方式
- java RPC方式调用axis2 webservice
- 在vs中用C的编程方式生成.dll文件并且动态、静态调用dll中的函数
- JAVA客户端API调用memcached两种方式
- java用axis方式调用webservice接口
- 【转】java通用URL接口地址调用方式GET和POST方式
- Java简单使用get方式调用url接口