在myeclipse中Debug自定义的ant task

    首先,myeclipse和ant的集成,简略说明:Window -》preferences-》ant -》ant home,选择ant目录即可。配置好ANT_HOME,JAVA_HOME,CATALINA_HOME和PATH。

下面介绍具体的应用:

    要使用ant构建的notificationServer项目结构如下:


build.properties和build.xml代码如下:

#\u73af\u5883\u53c2\u6570\uff0c\u5f00\u53d1\uff1adev\uff0c \u6d4b\u8bd5\uff1atest\uff0c  \u751f\u4ea7product 
run.time=product

#\u5f00\u53d1\u73af\u5883\u914d\u7f6e\u6587\u4ef6
build.dev.properties=dev.properties
#\u6d4b\u8bd5\u73af\u5883\u914d\u7f6e\u6587\u4ef6
build.test.properties=test.properties
#\u751f\u4ea7\u73af\u5883\u914d\u7f6e\u6587\u4ef6
build.product.properties=product.properties

src.dir=src
build.dir=build
lib.dir=lib
p12.dir=p12
build.classes.dir=${build.dir}/classes
build.dist.dir=${build.dir}/dist
jar.name=pushServer

<?xml version="1.0" encoding="UTF-8" ?>
<project name="notificationServer" default="clean">
	
	<property file="build.properties" />
	<property environment="env" />
	
	<path id="compile">
		<fileset dir="${lib.dir}" includes="**/*.jar"></fileset>
	</path>
	
	<target name="init">
		<echo>执行init初始化</echo>
		<delete dir="${build.dir}"></delete>
		<mkdir dir="${build.dir}"/>
		<mkdir dir="${build.classes.dir}"/>
		<mkdir dir="${build.dist.dir}"/>
		<echo>初始化完成</echo>
	</target>
	
	<target name="copy" depends="init">
		<echo>开始拷贝配置文件</echo>
		<copy todir="${build.classes.dir}" failonerror="true">
			<fileset dir="${src.dir}" excludes="**/*.java"></fileset>
		</copy>
	</target>
		
	<target name="editProperties" depends="copy">
		<echo>执行配置文件修改</echo>
		<taskdef name="editProperties" classname="com.lqh.ant.myTask.PropertyFileModification" classpath=" ${ant.library.dir}/myTask.jar"/>
		<editProperties srcProperties="${build.classes.dir}"/>
		<echo>editProperties success!</echo>
	</target>
	
	
	<target name="compile" depends="editProperties">
		<echo>执行compile编译操作</echo>
		<javac destdir="${build.classes.dir}" srcdir="${src.dir}" includes="**/*.java" 
				classpathref="compile" failonerror="true" 
				encoding="UTF-8" includeantruntime="false">
		</javac>
		<echo>编译操作完成</echo>
	</target>
	
	<target name="jar" depends="compile">
		<echo>开始打jar包</echo>
		<!--构建可执行的jar包-->
		<jar destfile="${build.dist.dir}/${jar.name}.jar" duplicate="preserve" filesetmanifest="mergewithoutmain">
			<fileset dir="${build.classes.dir}"></fileset>
			
			<zipfileset excludes="META-INF/*.SF" src="${lib.dir}/spring-beans-3.2.6.RELEASE.jar"/>
			<zipfileset excludes="META-INF/*.SF" src="${lib.dir}/aopalliance.jar"/>
			<zipfileset excludes="META-INF/*.SF" src="${lib.dir}/bcprov-jdk14-145.jar"/>
			<zipfileset excludes="META-INF/*.SF" src="${lib.dir}/commons-beanutils-1.8.0.jar"/>
			<zipfileset excludes="META-INF/*.SF" src="${lib.dir}/commons-collections-3.1.jar"/>
			<zipfileset excludes="META-INF/*.SF" src="${lib.dir}/commons-digester-2.0.jar"/>
			<zipfileset excludes="META-INF/*.SF" src="${lib.dir}/commons-fileupload-1.3.jar"/>
			<zipfileset excludes="META-INF/*.SF" src="${lib.dir}/commons-io-2.2.jar"/>
			<zipfileset excludes="META-INF/*.SF" src="${lib.dir}/commons-lang-2.4.jar"/>
			<zipfileset excludes="META-INF/*.SF" src="${lib.dir}/commons-lang3-3.1.jar"/>
			<zipfileset excludes="META-INF/*.SF" src="${lib.dir}/commons-logging-1.1.3.jar"/>
			<zipfileset excludes="META-INF/*.SF" src="${lib.dir}/JavaPNS_2.2Modified.jar"/>
			<zipfileset excludes="META-INF/*.SF" src="${lib.dir}/log4j-1.2.17.jar"/>
			<zipfileset excludes="META-INF/*.SF" src="${lib.dir}/spring-aop-3.2.6.RELEASE.jar"/>
			<zipfileset excludes="META-INF/*.SF" src="${lib.dir}/spring-context-3.2.6.RELEASE.jar"/>
			<zipfileset excludes="META-INF/*.SF" src="${lib.dir}/spring-core-3.2.6.RELEASE.jar"/>
			<zipfileset excludes="META-INF/*.SF" src="${lib.dir}/spring-expression-3.2.6.RELEASE.jar"/>
			<zipfileset excludes="META-INF/*.SF" src="${lib.dir}/spring-framework-bom-3.2.6.RELEASE.jar"/>
			
			<manifest>
				<attribute name="Class-Path" value="."/>
				<attribute name="Main-Class" value="com.cetcnav.pushNotification.server.NotificationPushServer"/>
			</manifest>
		</jar>
		<echo>完成打jar包</echo>
	</target>
	
	<!--tar-->
	<target name="tar" depends="jar">
		<echo>start compress tar file</echo>
		<tar destfile="${build.dist.dir}/${jar.name}.tar.gz" compression="gzip">
			<tarfileset file="${build.dist.dir}/${jar.name}.jar" prefix="${jar.name}"></tarfileset>
			<tarfileset dir="${p12.dir}" includes="**/*.*" prefix="${jar.name}/p12"></tarfileset>
		</tar>
		<echo>successfully finished tar task</echo>
	</target>
	
	<target name="clean" depends="tar">
		<echo>执行清理工作</echo>
		<delete dir="${build.classes.dir}"></delete>
		<delete file="${build.dist.dir}/${jar.name}.jar"></delete>
	</target>

	
</project>

其中,task editProperties是自定义的ant任务,负责完成配置文件的替换,主要代码如下:

package com.lqh.ant.myTask;

import java.io.BufferedInputStream;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.Properties;

import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Task;
import org.apache.tools.ant.util.FileUtils;
import org.apache.tools.ant.util.LayoutPreservingProperties;

public class PropertyFileModification extends Task {

	/**
	 * 原始的properties配置文件
	 */
	private File srcPropertiesFile;

	/**
	 * 相应环境的配置文件
	 */
	private File extraPropertiesFile;

	private boolean useJDKProperties;

	private String comment;

	private Properties srcPropertiesUtil;

	private Properties extraPropertiesUtil;
	
	private String excludesfile;
	
	/**
	 * 存放所有的 Property配置文件
	 */
	private List<File> propertyFiles;

	public void execute() {
		try {
			judgeRunTime();    				//判断运行环境
			judgePropertiesUtil();      	
			loadExtraProperties();			//读取 相应环境 的配置文件
			process();							//替换 相应配置
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	private void judgeRunTime() {
		String runTime = getProject().getProperty("run.time");
		if(runTime.equals("dev")) {
			extraPropertiesFile = new File(getProject().getProperty("build.dev.properties"));
		} else if(runTime.equals("test")) {
			extraPropertiesFile = new File(getProject().getProperty("build.test.properties"));
		} else if(runTime.equals("product")) {
			extraPropertiesFile = new File(getProject().getProperty("build.product.properties"));
		}
log("runTime : "+ runTime + ", extraPropertiesFile" + extraPropertiesFile.getAbsolutePath());
	}
	
	private void judgePropertiesUtil() {
		if (useJDKProperties) {
		    // user chose to use standard Java properties, which loose
		    // comments and layout
		    srcPropertiesUtil = new Properties();
		    extraPropertiesUtil = new Properties();
		} else {
			srcPropertiesUtil = new LayoutPreservingProperties();
			extraPropertiesUtil = new LayoutPreservingProperties();
		}
	}
	
	private void loadExtraProperties() throws IOException {
		//若环境配置文件存在,则读取到properties中;否则,创建环境配置文件
		if (extraPropertiesFile.exists()) {
			FileInputStream extraFis = null;
			try {
				extraFis = new FileInputStream(extraPropertiesFile);
				BufferedInputStream extraBis = new BufferedInputStream(
						extraFis);
				extraPropertiesUtil.load(extraBis);
			} finally {
				if (extraFis != null) {
					extraFis.close();
				}
			}
		}  else {
			log("Creating extra property file: "
		          + extraPropertiesFile.getAbsolutePath());
		      FileOutputStream out = null;
			  try {
			      out = new FileOutputStream(extraPropertiesFile.getAbsolutePath());
			      out.flush();
			  } finally {
			      if (out != null) {
			          out.close();
			      }
			  }
		}
	}
	
	private void process() {
		if(srcPropertiesFile != null && srcPropertiesFile.isDirectory()) {
			List<File> files = getPropertyFileList(srcPropertiesFile);
			for(File srcFile : files) {
				if(!srcFile.getName().equals(excludesfile)) {
					readFile(srcFile);
					writeFile(srcFile);
log("完成修改配置文件srcFile : "+ srcFile.getAbsolutePath());
				}
			}
		} else {
			readFile(srcPropertiesFile);
			writeFile(srcPropertiesFile);
log("完成修改配置文件srcFile : "+ srcPropertiesFile.getAbsolutePath());
		}
	}
	
	private List<File> getPropertyFileList(File directory) {
		if(propertyFiles == null) {
			propertyFiles = new ArrayList<File>();
		}
		
		if(directory.isDirectory()) {
			File[] files = directory.listFiles();
			
			for(File file : files) {
				if(file.isFile() && file.getName().endsWith("properties")) {
					propertyFiles.add(file);
				} else if(file.isDirectory()) {
					getPropertyFileList(file);
				}
			}
		}
		return propertyFiles;
	}
	
	/**
	 * 读取源配置文件和相应环境配置文件的内容
	 */
	private void readFile(File srcFile) {
		
		if(!srcPropertiesUtil.isEmpty()) {
			srcPropertiesUtil.clear();
		}
		
		try {
			//若源配置文件存在,则读取到properties中;否则,只创建源配置文件
			if(srcFile.exists()) {
				log("Updating property file : " + srcFile.getAbsolutePath() );
				FileInputStream srcFis = null;
				try {
					srcFis = new FileInputStream(srcFile);
					BufferedInputStream srcBis = new BufferedInputStream(srcFis);
					srcPropertiesUtil.load(srcBis);
				} finally {
					if (srcFis != null) {
						srcFis.close();
					}
				}
			} else {
				log("Creating new property file: "
                        + srcFile.getAbsolutePath());
                FileOutputStream out = null;
                try {
                    out = new FileOutputStream(srcFile.getAbsolutePath());
                    out.flush();
                } finally {
                    if (out != null) {
                        out.close();
                    }
                }
			}
			
		} catch (IOException ioe) {
			throw new BuildException(ioe.toString());
		}
	}
	
	private void writeFile(File destFile) {
		try {
			BufferedWriter bw = null;
			OutputStream os = null;
			
			os = new FileOutputStream(destFile);
			bw = new BufferedWriter(new OutputStreamWriter(os, "UTF-8"));
			try {
				Enumeration<Object> keys = srcPropertiesUtil.keys();
				while(keys.hasMoreElements()) {
					String key = (String) keys.nextElement();
					
					if(extraPropertiesUtil.containsKey(key)) {
						String value = extraPropertiesUtil.getProperty(key);
						srcPropertiesUtil.setProperty(key, value);
					}
					
					 bw.write(key + "=" + srcPropertiesUtil.getProperty(key));
				     bw.newLine();
					
				}
				
				bw.flush();
			} catch (IOException x) {
				 FileUtils.getFileUtils().tryHardToDelete(srcPropertiesFile);
			     throw x;
			} finally {
				if(bw != null) {
					bw.close();
					bw = null;
				}
			}
		}  catch (IOException x) {
			throw new BuildException(x, getLocation());
		}
	}
	

	public void setSrcProperties(File srcProperties) {
		this.srcPropertiesFile = srcProperties;
	}

	public void setExtraProperties(File extraProperties) {
		this.extraPropertiesFile = extraProperties;
	}

	public void setComment(String hdr) {
        comment = hdr;
    }

	public void setJDKProperties(boolean val) {
		useJDKProperties = val;
	}

	public String getExcludesfile() {
		return excludesfile;
	}

	public void setExcludesfile(String excludesfile) {
		this.excludesfile = excludesfile;
	}
}

现在,想在myelicpse中debug该段代码,步骤如下:

1、在所要debug的项目上,将ant目录下的lib包导入到该项目的build path中,例如,此处要在notificationServer项目上调试。

2、在所要debug的项目上,,配置debug configuration。

3、在所要调试的代码上打断点,此处就是PropertyFileModification.java

4、在notificationServer项目上右键,debug as JavaApplication后,即可进入所要调试的java代码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值