`

Ant Custome task 待完善版

阅读更多

这几天接到项目组一个需求,要求把某一目录下的某一类文件进行Base64编码,考虑到该项目用ANT进行打包发布,于是乎想到了用自定义的Ant Task来实现Base64,以减少操作步骤。花几个小时看了一下Ant的Task,拼凑出一个类,基本能满足要求,就先贴出来,省得下次遇到同样问题再到处找。

仅供自己备忘及跟我一样的新手参考,方家勿笑。

 

实现类如下,其中Base64实现代码就不贴了

/**
 * 
 */
package com.pansky.etax.invoice.util;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.Map;
import java.util.Vector;

import org.apache.tools.ant.AntClassLoader;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.DirectoryScanner;
import org.apache.tools.ant.taskdefs.MatchingTask;
import org.apache.tools.ant.taskdefs.condition.Condition;
import org.apache.tools.ant.types.FileSet;
import org.apache.tools.ant.types.Path;
import org.apache.tools.ant.types.Reference;

import cn.com.XXX.YYY.ZZZ.util.Base64;

/**
 * 
 * @author BrokenStone
 * http://sheng.iteye.com
 * @email: wdmsyf@yahoo.com
 * @Since 2010-12-29 
 */
public class JspEncodeTask extends MatchingTask implements Condition {
	private File file = null;
	private File todir = null;

	private String fileext;

	private Vector filesets = new Vector();
	private Path classpath = null;
	private Hashtable includeFileMap = new Hashtable();
	private boolean verbose=false;
	private boolean forceOverwrite = false;
	private String base64Chars = null;
	private String base64Pad = null;
	
	public String getBase64Pad() {
		return new StringBuffer(Base64.getB64Pad()).toString();
	}

	public void setBase64Pad(String base64Pad) {
		Base64.setB64Pad( base64Pad.charAt(0) );
	}

	public String getBase64Chars() {
		return Base64.getB64Chars();
	}

	public void setBase64Chars(String base64Chars) {
		Base64.setB64Chars(base64Chars);
	}

	public void setFile(File file) {
		this.file = file;
	}

	public void setTodir(File todir) {
		this.todir = todir;
	}

	public void setFileext(String fileext) {
		this.fileext = fileext;
	}

	public void addFileset(FileSet set) {
		this.filesets.addElement(set);
	}

	public Path getClasspath() {
		return classpath;
	}

	public void setClasspath(Path classpath) {
		this.classpath = classpath;
	}
	
	public boolean isForceOverwrite() {
		return forceOverwrite;
	}

	public void setForceOverwrite(boolean forceOverwrite) {
		this.forceOverwrite = forceOverwrite;
	}	
	
	public Path createClasspath(){
		if(this.classpath ==null){
			this.classpath = new Path(getProject());
		}
		return this.classpath.createPath();
	}
	public void setClasspathRef(Reference ref){
		createClasspath().setRefid(ref);
	}
	
	public void execute() throws BuildException {
		AntClassLoader loader = null;
		try{
//			if(this.classpath!=null){
//				this.createClasspath();
//			}
			boolean value = validateAndExecute();
		}catch(Throwable ex){
			throw new BuildException(ex);
		}finally{
			if(loader!=null){
				loader.resetThreadContextLoader();
				loader.cleanup();
			}
		}
	}

	public boolean eval() throws BuildException {
		return validateAndExecute();
	}

	private boolean validateAndExecute() throws BuildException {
		String savedFileExt = this.fileext;

		FileSet fs = null;
		
		if ((this.file == null) && (this.filesets.size() == 0)) {
			throw new BuildException("Specify at least one source - a file or a fileset.");
		}

		if ((this.file != null) && (this.file.exists()) && (this.file.isDirectory())) {
			throw new BuildException("Checksum cannot be generated for directories");
		}

		if (this.fileext == null)
			this.fileext = (".jspe");
		else if (this.fileext.trim().length() == 0) {
			throw new BuildException("File extension when specified must not be an empty string");
		}

		String baseDir = getProject().getBaseDir().getAbsolutePath();
		
		try {
			int sizeofFileSet = this.filesets.size();
			for (int i = 0; i < sizeofFileSet; i++) {
				fs = (FileSet) this.filesets.elementAt(i);
				DirectoryScanner ds = fs.getDirectoryScanner(getProject());
				String[] srcFiles = ds.getIncludedFiles();
				for (int j = 0; j < srcFiles.length; j++) {
					File src = new File(fs.getDir(getProject()), srcFiles[j]);
					if(src ==null || !src.exists()) continue;
					if ( this.todir != null ) {
						String absPath = this.todir + File.separator + srcFiles[j] + "." + this.fileext;
						absPath = absPath.replace(File.separatorChar, '/');
						this.includeFileMap.put(src,  absPath);
					}else{
						String absPath = src.getAbsolutePath() + "." + this.fileext;
						absPath = absPath.replace(File.separatorChar, '/');
						this.includeFileMap.put(src,  absPath);
					}
				}
			}

			if(this.file != null && this.file.exists()){
				if ( this.todir != null ) {
					String relativePath = this.file.getAbsolutePath().replace(baseDir, "");
					String absPath = this.todir + File.separator + relativePath + "." + this.fileext;
					absPath = absPath.replace(File.separatorChar, '/');
					this.includeFileMap.put(this.file,  absPath);
				}else{
					String absPath = this.file.getAbsolutePath() + "." + this.fileext;
					absPath = absPath.replace(File.separatorChar, '/');
					this.includeFileMap.put(this.file,  absPath);
				}
			}

			return doEncodeOrDecode();
		} finally {
			this.fileext = savedFileExt;
			this.includeFileMap.clear();
		}
	}

	private boolean doEncodeOrDecode() throws BuildException {
		boolean checksumMatches = true;
		FileInputStream fis = null;
		FileOutputStream fos = null;
		try {
			for (Enumeration e = this.includeFileMap.keys(); e.hasMoreElements();) {
				File src = (File) e.nextElement();
				if(this.verbose)
					log("Processing file: " + src.getName());

				Object destination = this.includeFileMap.get(src);				
				fis = new FileInputStream(src);
				File dest = new File((String)destination);
				if(!dest.getParentFile().exists()){
					dest.getParentFile().mkdirs();
				}
				if(!this.forceOverwrite){
					if(dest.exists()){
						throw new BuildException("File ["+dest.getAbsolutePath()+"] exist.", getLocation());
					}
				}
				fos = new FileOutputStream(dest);
				Base64.encode(fis, fos);
				fos.flush();
				fos.close();
				fos = null;
			}
		} catch (Exception e) {
			throw new BuildException(e, getLocation());
		} finally {
			if (fis != null)
				try {
					fis.close();
				} catch (IOException e) {
				}
			if (fos != null)
				try {
					fos.close();
				} catch (IOException e) {
				}
		}
		return checksumMatches;
	}

}

 

 

Build.xml如下:

<project name="MyJSPConvertor" default="encode_jsp" basedir=".">

  <property name="app.dir" value="app"/>
  <property name="web.dir" value="${app.dir}/web"/>
  <property name="lib.dir" value="${app.dir}/web"/>

  <property name="server.dir" value="server"/>
  <property name="server.admin.dir" value="${server.dir}/admin"/>
  <property name="server.common.dir" value="${server.dir}/common"/>
  <property name="server.lib.dir" value="${server.dir}/lib"/>

  <property name="encode.src.dir" value="${web.dir}"/>
  <property name="encode.dest.dir" value="${app.dir}/web_bak"/>
  

  <taskdef name="EncodeJsp" classname="com.XXX.YYY.ZZZ.util.JspEncodeTask"/>

  <target name="encode_jsp" description="encode jsp">
	<echo message="创建目标路径" />
	<mkdir dir="${encode.dest.dir}" />
    <echo message="加密JSP……" />
	<EncodeJsp forceOverwrite="yes" todir="${encode.dest.dir}" fileext="jspe" base64Chars="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" base64Pad="=" >
	  <classpath refid="classpath" />  
      <fileset dir="${encode.src.dir}">
        <include name="**/*.jsp"/>
     </fileset>
    </EncodeJsp>
  </target>

</project>
分享到:
评论

相关推荐

    android-launcher_custome

    "android-launcher_custome"这个项目显然关注的是如何创建一个自定义的启动器,特别是涉及到图片的加载和自定义视图的实现。下面我们将详细探讨相关的知识点。 1. **自定义Launcher**: 自定义Launcher主要是通过...

    custome-starter.zip

    《SpringBoot Starter 案例解析》 在Java开发领域,SpringBoot框架因其简洁、高效的特点,已经成为构建微服务应用的首选。为了简化项目配置,SpringBoot引入了Starter概念,它是一种开箱即用的依赖集合,允许开发者...

    51CTO下载-OPC+Custome+Interface+Lib

    OPC 自定义接口组件(DLL) OpcRcw.Ae.dll OpcRcw.Batch.dll OpcRcw.Cmd.dll OpcRcw.Comn.dll OpcRcw.Da.dll OpcRcw.Dx.dll OpcRcw.Hda.dll OpcRcw.Sec...

    LLM-Custome.zip

    "LLM-Custome.zip" 提供的是一种经过中文开源大模型定制化微调的解决方案,使得用户即使在计算资源有限的环境下也能运行自己的专属语言模型。 首先,我们来了解一下“开源大模型”。开源大模型是指那些开放源代码、...

    dojo create custome widget

    在JavaScript的世界里,Dojo Toolkit是一个强大的开源JavaScript库,它为开发者提供了丰富的功能,包括UI组件、数据管理、异步操作等。本话题主要聚焦于如何利用Dojo创建自定义的Widget,这是一个对于提高代码复用性...

    itags.build:具有所有custome元素的汇总文件

    "itags.build" 是一个专为JavaScript开发设计的模块,它提供了一系列自定义元素(custom elements),用于构建更丰富的Web应用程序。... 在"itags.build"中,你可以找到各种预定义的组件,这些组件可能包括表单控件、...

    jquery-ui-1.11.1-custom-zip

    《jQuery UI 1.11.1 自定义版本:深入解析与应用》 jQuery UI 是一个基于 jQuery 的开源库,提供了丰富的用户界面组件和交互功能,使得开发者能够更轻松地创建具有吸引力和交互性的Web应用。这个“jquery-ui-1.11.1...

    customeization:MEI的定制Web服务

    MEI定制服务 此Web应用程序为提供基于Web的前端,以基于MEI定制创建用于验证MEI XML文件的架构。 什么是定制? 定制是MEI的一种版本,专门用于验证特定类型的MEI文件... 您将需要安装ant Java构建工具才能使它们运行。

    Custom_Dialog_Usage

    在Android开发中,自定义Dialog是一种常见的需求,用于提供与用户交互的个性化界面。`Custom_Dialog_Usage`这个主题正是关注如何在Android应用中创建并使用自定义对话框。通常,系统默认的Dialog样式可能无法满足...

    custome-go

    在"custome-go"中,我们看到它基于Gojs的v2.1.34版本进行克隆和扩展,这意味着项目可能包含了Gojs的核心功能,并根据特定需求进行了定制和优化。Gojs v2.1.34是一个稳定版本,可能包含了该版本发布时的所有特性、...

    CustomePanel.m

    CustomePanel.m

    UG钣金标准件及其外挂适合任何版本

    2. 修改UG安装目录(如D:\Unigraphics NX X.0 \UGII\menus)的custome_dirs.dat, 3. 在该文件最后增加以下行: ${UGII_BASE_DIR}\stdlib $UGII_BASE_DIR/stdlib $UGII_BASE_DIR/CUSTOM/UGOpen $UGII_BASE_...

    Python库 | customtkinter-2.3.tar.gz

    **Python库定制Tkinter界面——customtkinter-2.3详解** 在Python的GUI编程领域,Tkinter作为标准库提供了一种基础的图形用户界面工具,但其默认样式较为单一,无法满足开发者对于美观和个性化的追求。...

    CodeFlow-Discord-Bot:CodeFlow DIscord社区的Discord聊天机器人

    CodeFlow不和谐机器人安装npm install 在观看模式下开始npm run start-watch目前的待办事项检查每个人是否都喜欢此安装程序结束要使用哪个Discord库离开测试框架(茉莉,摩卡,柴) 最低测试覆盖率? 收集更多想法...

    iOSCustomKeyboard:iOS 8 上的自定义键盘扩展模板,使用故事板和自动布局用 Obj-C 编写

    iOS 8 自定义键盘扩展模板 这个通用键盘模板使用 Objective-C 编写并使用故事板和自动布局,是一个完整的入门套件,适合任何想要创建自定义键盘的人。 所有基本键都已创建,并且键盘可以以与系统键盘相同的方式在...

    custom_object_detection

    在IT行业中,自定义物体检测(Custom Object Detection)是一项关键技术,它允许用户针对特定应用场景训练模型来识别和定位图像中的特定对象。本项目“custom_object_detection”显然聚焦于这一领域,采用Jupyter ...

    YGDP_Setup_Customer.rar

    《酷派YGDP_Setup_Custome:官方手机升级与刷机详解》 酷派YGDP_Setup_Customer是一款专为酷派手机用户设计的官方升级软件,它集成了刷机功能,是酷派用户进行系统更新和恢复的重要工具。这款软件界面虽然简洁,但...

    RTDCustomerTool_V3.6_20180810

    "RTDCustomerTool_V3.6_20180810" 是一个特定版本的软件工具,专为RTD(Real-Time Database)客户服务设计。这个工具的主要目的是协助用户与RTD数据库进行交互,执行各种操作,如数据读取、写入、更新和管理。...

    custom-keyboard-shortcuts:用于自定义某些浏览器键盘快捷键的简单 Chrome 扩展程序

    自定义键盘快捷键 这是 Google Chrome 的一个简单扩展,通过chrome.commands API 提供键盘快捷键自定义。 这意味着快捷方式可用于所有标签页,也可用于下载和设置等特殊标签页。 不需要特殊权限。...

    ARM Assembly xclf clf file

    source insight官方给arm的clf不太好用,加了些关键词,加了些custome parsing

Global site tag (gtag.js) - Google Analytics