首先,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代码