您的位置:首页 > 运维架构 > Apache

以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
文件中,但这不会产生任何变化。以编程方式设置的属性将始终覆盖在构建文件中设置的属性。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息