所有的语言都有维护和代码重用的压力,目前为止,Ant已经提供了很多的Task,可以帮助实现Ant脚本的模块化。
1. Property
Property Task除了能够定义单个的属性,还可以从一个属性定义文件定义多个property。把公用的属性放到属性文件中,各个build.xml中都载入此属性文件,就可以避免在每个build.xml中重复定义这些属性。
2. AntCall, Ant和SubAnt
AntCall可以理解为简单的函数调用。举一个例子就清楚了:
<target name=”commonTarget”>
<echo message=”${test.param}” />
</target>
<target name=”callingTarget”>
<antcall target="commonTarget">
<param name="test.param" value="Modulation" />
</antcall>
</target>
从上面的例子可以看到,指明要调用的target,再通过<param>指明调用参数;在被调用的Target中,通过与引用property类似的方式即可引用param的值。
至于Ant Target,也是调用别的Target,不过那个Target可以是在另外一个ant 文件中。
3. MacroDef
AntCall很好用,不过当参数很多时要写很多的<param name=”” value=”” />起来很麻烦,如果你想偷懒,用MacroDef就行了。下面把上面的例子用MacroDef重写:
<macrodef name="showModule">这里是macrodef的定义
<attribute name="test.param1"/>这个是参数的定义,可以再macrodef外部调用
<attribute name="test.param" default="NOT SET"/>内部参数
<sequential>实际执行的内容都在sequential中
<echo message="@{test.param}" />
</sequential>
</macrodef>
<target name="testMacro">
<showModule test.param="Modulation" />
</target>
需要注意的是:
1,在整个build文件里macrodef和target是平级的。
2,macrodef可以调用其他的macrodef,不可以调用target;target可以调用macrodef,也可以调用其他的target。
3,macrodef嵌套的时候,参数名称必须不同。
我们可以象系统提供的其他Task一样引用showModule,的确简洁多了。定义一个Macro,首先定义此宏的attribute,包括attribute的name, default;然后在<sequential>标签中定义此宏的所有操作。注意对attribute的引用是@{attr-name}!实际上,Ant还允许在attribute后面定义一组element,达到极高的动态性。
4. Import
<antcall>和<marcodef>可以达到类似函数的效果,但是调用者和被调用者还是必须在同一个文件中。Ant从1.6开始引入Import Task,可以真正的实现代码重用:属性,Task 定义,Task, Macro。一个简单的例子:
common.xml:
<?xml version="1.0" ?>
<project>
<property name="project.name" value="Ant Modulazation" />
<target name="commonTarget">
<echo message="${test.param}" />
</target>
<macrodef name="showModule">
<attribute name="test.param" default="NOT SET"/>
<sequential>
<echo message="@{test.param}" />
</sequential>
</macrodef>
</project>
call.xml:
<?xml version="1.0" ?>
<project name="testCommon" default="callingTarget">
<import file="common.xml" />
<target name="callingTarget">
<antcall target="commonTarget">
<param name="test.param" value="Modulation" />
</antcall>
</target>
<target name="testMacro">
<showModule test.param="Modulation" />
</target>
</project>
注意:在common.xml中,不能对project元素设置属性;另外,不要试图使用重名的property,或target以获取覆盖的效果,因为Ant毕竟不是编程语言。
自定义Ant Taskhttp://blog.csdn.net/pipisky2006/article/details/6680379
这里只有task,也可以创建project对象,写一个纯code的build
1:基本环境,建议用Eclipse这个工具来做为Java的基本开发工具,用Eclipse的向导新建一个Java工程test。
2:将ANT的以下几个jar文件添加到刚才新建的test工程的构建引用路径下面,即添加到classpath中去:ant-lanucher.jar、ant.jar、ant-jakarta-log4j.jar这三个jar文件是最基本的,必须添加进去,如果要用到ANT的一些其它类,需要添加相应的jar文件,具体可以参考ANT的帮助文件。这三个文件简单说明一下,ant-lanucher.jar里面的类是ANT程序启动时必须要用到的,在Java代码中调ANT时,是需要通过这个包中的类来启动ANT里面的类去执行定义的动作,这个包是启动入口类; ant.jar这个包里面是ant定义的一些核心功能类的class,如copy文件,删除文件,执行数据库脚本,打包等等,即是具体的核心功能实现类,如果是一些附加的ant功能,则在其它jar包里面,这个只有非常核心的类在里面; ant-jakarta-log4j.jar是ant重新包装了log4j的类,实现ANT自己格式的log4j的日志文件记录。
3:在test工程里面新建一个类,类里面增加一个Java的main方法,在main方法中添加如下代码,并导入相关的package:
PrintStream logstream = null; //这里是定义一个ANT执行时日志文件的输出流对象
Project pj=new Project(); //初始化一个ant的Project对象
pl.setName("ant_project"); //设置project的名称,具体的值可以随意改成其它字符串都可以
pj.init(); //ANT自己的方法初始化Project对象
DefaultLogger cl=new DefaultLogger();
//定义一个默认的日志流,默认的日志流是采用log4j来记录的,所以在前面要求将ant-jakarta-log4j.jar这个文件加到classpath中去。
logstream=new PrintStream(new FileOutputStream("C:/test.log"),true);
//下面两行是设置ANT执行过程中要输出的一些信息流,必须设置,否则后面将得不到具体的日志消息
cl.setErrorPrintStream(logstream);
cl.setOutputPrintStream(logstream);
//设置ANT记录日志的消息级别,MSG_VERBOSE是表示记录详细的日志消息
cl.setMessageOutputLevel(Project.MSG_VERBOSE);
//将前面定义好的消息记录器绑定到Project上
pj.addBuildListenter(cl);
//生成一个Target对象,为后面添加具体的Task做准备
Target tg=new Target();
tg.setProject(pj); //设置target的Project归属,必须设置,Target必须属于某一个Project
tg.setName("target1"); //设置Target的名称
pj.addTarget(tg); //将Target添加到Project中
Copy cp=new Copy(); //具体生成一个功能Task类对象,复制文件的对象
cp.setTodir(new File("C:/bbb")); //设置要将文件复制的目的地
FileSet set=new FileSet(); //定义目录集,这样在后面可以自己定义一些规则
set.setDir(new File("C:/aaa")); //定义目录集关联的实际目录路径
set.createInclude().setName("**/*.txt"); //设置这个目录集包括的规则,即这个目录下面所有的.txt后缀的文件
cp.addFileset(set); //将目录集绑定到具体的对象中
cp.setOverwrite(true);//设置在复制文件时,如果目标文件己经存在,将采用直接覆盖的方式
cp.setFailOnError(true); //设置在复制文件过程中有文件复制失败时,则中断执行这个过程
cp.setPreserveLastModified(true); //设置复制文件时保留文件的最后修改时间
cp.setProject(pj); //设置Task的Project归属
cp.setTaskName("cp"); //设置Task的名称
tg.addTask(cp); //将Task添加到Target中,Task不能单独存在,也不能直接添加到Project中
Throwable ta=null;
try {
pj.executeTarget(tg.getName()); //开始执行Project中指定的Target
}catch (Exception e){
ta=e;
} finally {
/* 在日志文件当中生成执行成功或失败的消息,调用这个方法后,如果ANT的Project执行成功,则会在日志文件当中生成一行“BUILD SUCCESSFUL”或"BUILD FAILED"这样的字符串,在执行失败时,同时会将异常消息打印在日志文件中,所以这个方法比较重要 */
pj.fireBuildFinished(ta);
logstream.close();
}
(转自: http://blog.csdn.net/pipisky2006/article/details/7101778)
相关推荐
总结起来,Java Ant的互相调用是构建过程中的一个重要特性,它让构建逻辑更加灵活和模块化。通过理解和熟练运用这一特性,开发者可以更好地管理和维护大型项目,同时,结合源码管理和版本控制工具,如CVS,可以实现...
在大型项目中,Ant的构建脚本可能会变得复杂,包含多个目标和任务,通过条件语句、属性、宏定义等来实现模块化和复用。此外,Ant还可以与版本控制系统(如Git)、持续集成工具(如Jenkins)等集成,形成完整的开发和...
在实际开发中,开发者可能会根据项目需求额外引入其他Ant模块,如ant-nodeps.jar(不包含JUnit支持)或ant-contrib.jar(包含额外的社区贡献任务)。 总的来说,Ant作为一个强大的构建工具,通过这些组件的协同工作...
总的来说,Ant提供了一种灵活且可扩展的方式,用于管理和自动化Java项目的构建和部署过程。通过学习和实践,你可以根据项目需求定制Ant脚本,提升开发效率,减少手动操作带来的错误。无论是简单的J2ME应用还是复杂的...
通过阅读`命令.txt`、`ant知识.txt`、`ant构建Java.txt`、`ant例子.txt`这些文件,你可以深入了解Ant的使用方法,包括命令行调用、具体的构建步骤、Java项目构建实例以及各种任务的实践应用。这些资料将帮助你掌握...
- **模块化**:`Axis2`支持模块化,可以根据需要加载或卸载特定的功能模块。 - **多协议支持**:除了SOAP,`Axis2`还可以处理RESTful、JSON、POX等多种协议。 总的来说,`Axis`工具,特别是`Axis2-1.7.4`版本,为...
Ant是Apache旗下的一款强大的构建工具,主要用于Java项目的自动化构建过程,如编译、测试、打包、部署等操作。它的核心优势在于其高度的可定制性和灵活性,使得开发者能够通过简单的XML配置文件(通常命名为`build....
1. **构建文件结构化**:将构建逻辑按照功能模块化,每个模块对应一个目标,便于维护和理解。 2. **错误处理和日志记录**:利用`failonerror`属性控制构建失败时的行为,并通过`echo`任务记录构建过程中的关键信息...
Web Service是一个自包含、自解释、模块化的应用程序,可以通过统一描述、发现和集成(UDDI)来发现,并通过简单的对象访问协议(SOAP)进行通信。SOAP是基于XML的消息传递协议,使得不同平台的应用程序能够相互通信...
此外,Ant还可以通过`<import>`引入其他构建文件,实现模块化构建。还有`<condition>`来实现条件判断,以及`<for>`、`<foreach>`进行循环操作。 ## 六、结合Maven或Gradle 虽然Ant功能强大,但随着项目的复杂度...
5. **模块化**:XINS允许将API分解为小的、独立的模块,便于管理和扩展。 6. **易于部署**:由于XINS生成的是标准的Java代码,可以轻松地部署在任何Java应用服务器上。 在这个压缩包中,可能包含以下部分: 1. **...
Ant,由Apache软件基金会开发,是一个基于XML的构建工具,它定义了一系列任务来自动化Java项目的构建过程,包括编译源代码、创建JAR或WAR文件、执行测试、打包和部署等。它的主要优点在于灵活性和可配置性,使得...
Ant是Apache软件基金会的一个项目,它是一个基于Java的任务构建工具,常用于自动化构建Java项目,如编译源代码、打包、测试等。而JSch则是一个纯Java实现的SSH2库,可以用来连接远程服务器进行安全的文件传输、执行...
Ant原本是Java语言的构建工具,用于自动化Java项目构建过程,如编译、打包、测试等任务。npm(Node Package Manager)则是Node.js的包管理器,用于安装、管理和发布Node.js模块。 在描述中提到,将这个名为“ant”...
Ant是Apache软件基金会的一个开放源代码项目,它是一个基于Java的构建工具,主要用于自动化Java项目的构建、编译、测试和部署等任务。Ant以其简单易用、可扩展性强的特点,被广泛应用于各种Java开发环境中。 **一、...
总结来说,Ant作为一个类似make的工具,它以任务为基础,通过XML配置文件定义构建流程,能够有效地管理和自动化Java项目的生命周期。无论是小型项目还是大型企业级应用,Ant都能够提供高效、灵活的构建解决方案。...
Apache Ant 是一个Java库和命令行工具,其任务是驱动构建过程。它是Java世界中广泛使用的构建工具,类似于其他语言中的Make或Unix的shell脚本。Ant基于XML,允许开发者定义构建文件,其中包含了编译、创建JAR、运行...
1. **设置环境**:在开始之前,确保已经安装了Java JDK、Android SDK以及Ant。设置好环境变量,包括JAVA_HOME、ANDROID_HOME和ANT_HOME,使得命令行可以正确找到这些工具。 2. **构建文件build.xml**:在Android...
在软件工程思想中,Ant和iBatis体现了模块化、解耦合和自动化的原则。Ant的XML配置文件让构建过程清晰可见,易于理解和维护,符合模块化设计。iBatis将数据访问逻辑与业务逻辑分离,实现了组件间的解耦合,提高了...