Apache ant 开发

Ant是Apache软件基金会JAKARTA目录中的一个子项目,它有以下的优点。跨平台性。Ant是纯Java语言编写的,所以具有很好的跨平台性。操作简单。Ant是由一个内置任务和可选任务组成的。Ant运行时需要一个XML文件(构建文件)。 Ant通过调用target树,就可以执行各种task。每个task实现了特定接口对象。由于Ant构建文件 是XML格式的文件,所以很容易维护和书写,而且结构很清晰。Ant可以集成到开发环境中。由于Ant的跨平台性和操作简单的特点,它很容易集成到一些开发环 境中去。

ANT 开发工具

推荐使用 Visual Studio Code 开发工具,里边有一款为了优化ant开发而开发的插件 --Ant Editor

使用方法如下

1、下载ANT,安装环境变量

配置环境变量,可以在百度搜到,类似java环境变量,本机为linux,只介绍linux的配置方式

  1. 首先 vi /etc/profile

  2. 在末尾添加

    export ANT_HOME= 自己的地址/antexport CLASSPATH=.:${ANT_HOME}/libexport PATH=${ANT_HOME}/bin:$PATH
    
  3. source /etc/profile

  4. 在控制台输入 ant -version,出现版本号即为成功

2、安装以及使用ant Editor

  1. 在右侧点击扩展

  2. 输入ant Editor,搜索并下载,显示如下图一样即安装完成

  3. 配置变量,配置执行命令 ant -lib xxxxxx -f ,额外lib包

ANT执行

本地调试开发,使用插件直接点击执行即可

若在程序调试开发,则按照相关文档操作

自定义ant标签

本文开发使用maven工程

1、引用ant

在pom文件引用ant依赖,本文使用的是1.9版本

<dependency><groupId>org.apache.ant</groupId><artifactId>ant</artifactId><version>1.9.15</version>
</dependency>

2、继承org.apache.tools.ant.Task

继承 org.apache.tools.ant.Task,并重写 execute方法,主要重写 execute方法,若有其他需求,可参照下边常用方法

相关属性:

  • execute():ant标签执行都会调用此方法,如果任务被多次调用,则此方法可能会被多次调用。

  • 标签入参:封装属性,使用get/set方法即可完成传参

  • 标签出参:调用父类方法getProject().setUserProperty(key,value);或者getProject().setProperty(key,value); 两者的区别 project.setUserProperty 优先级比较高,如果用 setUserProperty 定义的值,setPropert是无法覆盖的

  • init():重写此方法,使得标签初始化,默认不操作

    例子:

    import org.apache.tools.ant.BuildException;
    import org.apache.tools.ant.Task;/*** @author: ccyy* @create: 2022-02-08* @description: ant 自定义标签 demo**/
    public class AntDemo extends Task {private String name;private String doSome;@Overridepublic void execute() throws BuildException {String rst = "Hello world !" +name +" , " +doSome;getProject().setUserProperty(name,rst);}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getDoSome() {return doSome;}public void setDoSome(String doSome) {this.doSome = doSome;}
    }
    

3、打包工程

​ 使用maven打包完工程后,放入lib

4、ant引用

标签引用,使用taskdef引用自定义标签

<!-- name为自定义标签名字,classname为标签类路径 -->
<taskdef name="antdemo" classname="xxx.xxx.xxx.AntDemo" />

引用完标签后即可使用标签

     <!-- 引用标签,传参 --><antdemo name="nantian" value="ant demo"/><!-- 输出结果 --><echo message="rst : ${nantian}" />

完整脚本

<project name="ccyyTest" default="default" basedir=".."><taskdef name="antdemo" classname="xxx.xxx.xxx.AntDemo" /><target name="default"><!-- 引用标签,传参 --><antdemo name="nantian" value="ant demo"/><!-- 输出结果 --><echo message="rst : ${nantian}" /></target>
</project>

ANT进阶

1、标签嵌套调用标签

实现接口org.apache.tools.ant.TaskContainer,并实现addTask()方法

public class AntDemo extends Task implements TaskContainer {private Vector<Task> nestedTasks = new Vector<Task>();@Overridepublic void addTask(Task arg0) {nestedTasks.add(arg0);}@Overridepublic void execute() {doTask();}public void doTask() {Iterator<Task> i = nestedTasks.iterator();while (i.hasNext()) {((Task) i.next()).perform();}}}

2、标签嵌套标签传值

参照 Apache ant 源码 getMother 标签

1、创建静态匿名类

2、封装属性,创建get/set方法

3、使用list接收

/** Copyright (c) 2001-2006 Ant-Contrib project.  All rights reserved.** Licensed under the Apache License, Version 2.0 (the "License");* you may not use this file except in compliance with the License.* You may obtain a copy of the License at**     http://www.apache.org/licenses/LICENSE-2.0** Unless required by applicable law or agreed to in writing, software* distributed under the License is distributed on an "AS IS" BASIS,* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.* See the License for the specific language governing permissions and* limitations under the License.*/
package net.sf.antcontrib.net.httpclient;import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Properties;import org.apache.commons.httpclient.HttpMethodBase;
import org.apache.commons.httpclient.NameValuePair;
import org.apache.commons.httpclient.methods.EntityEnclosingMethod;
import org.apache.commons.httpclient.methods.InputStreamRequestEntity;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.methods.StringRequestEntity;
import org.apache.commons.httpclient.methods.multipart.FilePart;
import org.apache.commons.httpclient.methods.multipart.MultipartRequestEntity;
import org.apache.commons.httpclient.methods.multipart.Part;
import org.apache.commons.httpclient.methods.multipart.StringPart;
import org.apache.commons.lang3.StringUtils;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.util.FileUtils;public class PostMethodTask extends AbstractMethodTask {private List parts = new ArrayList();private boolean multipart;private transient FileInputStream stream;public static class FilePartType {private String name;private File path;private String contentType = FilePart.DEFAULT_CONTENT_TYPE;private String charSet = FilePart.DEFAULT_CHARSET;public File getPath() {return path;}public void setPath(File path) {this.path = path;}public String getContentType() {return contentType;}public void setContentType(String contentType) {this.contentType = contentType;}public String getCharSet() {return charSet;}public void setCharSet(String charSet) {this.charSet = charSet;}/*** @return the name*/public String getName() {return name;}/*** @param name*            the name to set*/public void setName(String name) {this.name = name;}}public static class TextPartType {private String name = "";private String value = "";private String charSet = StringPart.DEFAULT_CHARSET;private String contentType = StringPart.DEFAULT_CONTENT_TYPE;public String getValue() {return value;}public void setValue(String value) {this.value = value;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getCharSet() {return charSet;}public void setCharSet(String charSet) {this.charSet = charSet;}public String getContentType() {return contentType;}public void setContentType(String contentType) {this.contentType = contentType;}public void setText(String text) {this.value = text;}}public void addConfiguredFile(FilePartType file) {this.parts.add(file);}public void setMultipart(boolean multipart) {this.multipart = multipart;}public void addConfiguredText(TextPartType text) {this.parts.add(text);}public void setParameters(File parameters) {PostMethod post = getPostMethod();Properties p = new Properties();Iterator it = p.entrySet().iterator();while (it.hasNext()) {Map.Entry entry = (Map.Entry) it.next();post.addParameter(entry.getKey().toString(), entry.getValue().toString());}}protected HttpMethodBase createNewMethod() {return new PostMethod();}private PostMethod getPostMethod() {return ((PostMethod) createMethodIfNecessary());}public void addConfiguredParameter(NameValuePair pair) {getPostMethod().setParameter(pair.getName(), pair.getValue());}public void setContentChunked(boolean contentChunked) {getPostMethod().setContentChunked(contentChunked);}protected void configureMethod(HttpMethodBase method) {EntityEnclosingMethod post = (EntityEnclosingMethod) method;if (parts.size() == 1 && !multipart) {Object part = parts.get(0);if (part instanceof FilePartType) {FilePartType filePart = (FilePartType) part;try {stream = new FileInputStream(filePart.getPath().getAbsolutePath());post.setRequestEntity(new InputStreamRequestEntity(stream, filePart.getPath().length(),filePart.getContentType()));if (StringUtils.isNotBlank(filePart.getName())) {((FilePartType) part).setName(filePart.getName());}} catch (IOException e) {throw new BuildException(e);}} else if (part instanceof TextPartType) {TextPartType textPart = (TextPartType) part;try {post.setRequestEntity(new StringRequestEntity(textPart.getValue(), textPart.getContentType(),textPart.getCharSet()));} catch (UnsupportedEncodingException e) {throw new BuildException(e);}}} else if (!parts.isEmpty()) {Part partArray[] = new Part[parts.size()];for (int i = 0; i < parts.size(); i++) {Object part = parts.get(i);if (part instanceof FilePartType) {FilePartType filePart = (FilePartType) part;try {String name = filePart.getPath().getName();if (StringUtils.isNotBlank(filePart.getName())) {name = filePart.getName();}partArray[i] = new CustomFilePart(name, filePart.getPath().getName(), filePart.getPath(),filePart.getContentType(), filePart.getCharSet());} catch (FileNotFoundException e) {throw new BuildException(e);}} else if (part instanceof TextPartType) {TextPartType textPart = (TextPartType) part;partArray[i] = new StringPart(textPart.getName(), textPart.getValue(), textPart.getCharSet());((StringPart) partArray[i]).setContentType(textPart.getContentType());}}MultipartRequestEntity entity = new MultipartRequestEntity(partArray, post.getParams());post.setRequestEntity(entity);}}protected void cleanupResources(HttpMethodBase method) {FileUtils.close(stream);}}

【ant】Apache ant 开发相关推荐

  1. [ANT]apache ant 安装说明

    准备工作 下载地址:https://downloads.apache.org/ant/binaries/ JDK: 1.8 官网: https://ant.apache.org/manual/inde ...

  2. (转)Apache Ant 环境开发Android应用 二

    http://www.eoeandroid.com/forum.php?mod=viewthread&tid=605 Apache Ant 开发Android SDK 1.5 r2应用程序 = ...

  3. apache ant

    Apache Ant,是一个将软件编译.测试.部署等步骤联系在一起加以自动化的一个工具,大多用于Java环境中的软件开发.由Apache软件基金会所提供. 用户群:大多数的Java设计都被用于管理大量 ...

  4. Apache Ant自动化脚本

    http://blog.csdn.net/yubo_725/article/details/52326746 一.什么是Ant 以下介绍来自百度百科: Apache Ant,是一个将软件编译.测试.部 ...

  5. Apache Ant运行时Unable to locate tools.jar解决方法

    下载Apache Ant 一.解压ant安装包在D:\ant下 二.环境变量配置 ANT_HOME D:\ant\apache-ant-1.9.0 CLASSPATH ;%ANT_HOME%lib; ...

  6. 一个最简单的apache ant hello world例子

    Ant 是一个 Apache 基金会下的跨平台的基于 Java 语言开发的构件工具. Ant is a Java based build tool. In theory it is kind of l ...

  7. Apache Ant使用过程的总结

    最近频繁的做Web项目的部署,开发机是Windows系统,服务器在RedHat上,多次使用SecureCRT工具后,决定直接使用Ant部署工具做这件事,同时遇到一个问题:Java程序程序中调用Ant ...

  8. Apache Ant 简介和配置

    Apache Ant 简介 Apache Ant是目前事实上的Java应用的标准build脚本工具.使它大受欢迎的一个主要愿意是它的和灵活,允许程序员创建自己的Task来对Ant进行扩展. 本文主要内 ...

  9. Basics of Apache Ant

    what is Ant? (Ant是什么) Apache Ant is a Java-based build tool whose mission is to drive processes desc ...

最新文章

  1. Clean-Code: 注释
  2. Github的创建及使用
  3. js脚本屏蔽页面点击
  4. HoloLens开发入门
  5. python脚本打包成linux命令_python怎么打包生成linux命令行可用软件?
  6. Windows Server 2008群集仲裁机制
  7. 阿里巴巴: 章文嵩评价左耳朵耗子
  8. 小程序获取微信登陆用户
  9. 清除浏览器缓存(js、css等)
  10. P4199-FFT,manacher
  11. 阿里Leader都干些啥
  12. 希望 绝望 前进 枷锁 不退缩 我坚持所有一切
  13. RabbitMQ-尚硅谷
  14. 软件质量与测试--第四周作业 wcPro
  15. android环绕耳机,完全不同的“听音辨位”体验——罗技G433 7.1环绕声游戏耳机使用体验...
  16. echarts图表刚加载进来缩在一起
  17. 关于GreaterWMS我踩过的坑
  18. 关于我想写个脚本,最后却搞了个桌面宠物这件事(三)
  19. Link3D-基于cocos3d的连连看游戏(第一篇)
  20. WINDOWS检测U盘插入,拔出

热门文章

  1. 10004---简析TCP的三次握手与四次分手
  2. Qt:Qt导出Excel表格
  3. git拉取项目、提交代码简单教程
  4. java 三原色_opencv3_java 提取图像的RGB三原色分割图像Split Core.split
  5. 出现脑裂的原因及解决方案
  6. 科普!人人都爱Python,可Python为什么叫Python?
  7. 基于深度神经网络的中药材识别
  8. css中多行文本溢出显示省略号的方法
  9. HTML卡片式布局源码,html5自适应卡片式设计动态加载整站源码_
  10. 密码算法测试向量——AES