利用ant脚本 自动构建svn全量/增量/减量 项目升级包

一、基本原理
利用ant脚本自动从svn版本库checkout出旧版本, 新版本, 以及差异文件, 通过解析差异文件以及对比新旧版本文件的存在与否, 最终导出增量文件和减量文件。

二、运行环境
1.Java运行环境JDK, 在本例中我使用的是32位的jdk1.7.0_25, 安装包的下载地址可参考-  http://www.oracle.com/technetwork/java/javase/downloads/index.html , 安装步骤请自行百度;

2.安装Ant, 在本例中我使用的是apache-ant-1.9.4, 安装包的下载地址可参考-  http://ant.apache.org/bindownload.cgi , 下载apache-ant-1.9.4-bin.zip, 下载完之后解压到一个位置, 之后的环境变量配置可以参考这位大神写的,  http://www.cnblogs.com/hoojo/archive/2013/06/14/java_ant_project_target_task_run.html  ;

3.安装svn服务器, 如果你已经在用svn作为代码的版本控制那请跳过这一步,如果没有,下载地址可参考 http://subversion.apache.org/packages.html 本例中使用的svn版本是1.7.4,安装及配置用户和权限还有代码管理请自行百度;

4.到你的apache-ant-1.9.4-bin的安装路径中lib文件夹里面新建一个文件夹名为svnant_lib,  需要用到svnant的类库,下载地址可参考 http://subclipse.tigris.org/files/documents/906/49042/svnant-1.3.1.zip , 下载完之后解压, 把lib文件夹内的 ganymed.jar, svnant.jar, svnClientAdapter.jar 复制到svnant_lib文件夹内;

5.由于svnant很久没更新, 所以svnant-1.3.1不支持1.7或以上的svn, 所以在上一步我们没有复制有关svnkit的jar, 这里要单独下载, 下载地址可参考 http://www.svnkit.com/download.php , 下载org.tmatesoft.svn_1.8.6.standalone.zip, 本例中用的是1.8.6版, 同样下载之后解压, 吧lib文件夹内的 antlr-runtime-3.4.jar, jna-4.1.0.jar, sequence-library-1.0.3.jar, sqljet-1.1.10.jar, svnkit-1.8.6.jar, svnkit-javahl16-1.8.6.jar复制到svnant_lib文件夹内,完成之后如下图所示:


6. 因为某些项目使用到了泛型、annotation注解,使用javac有些代码是编译不通过的,所以这里使用了jdt的编译方式。 需要用到:

jdtCompilerAdapter.jar
org.eclipse.jdt.compiler.tool_1.0.1.v_793_R33x.jar
org.eclipse.jdt.core_3.3.3.v_793_R33x.jar
org.eclipse.jdt.debug.ui_3.2.102.v20071002_r332.jar

参考的下载地址http://download.csdn.net/download/wosishui21/5947899 ,下载之后复制进去apache-ant-1.9.4-bin的安装路径中lib文件夹里面;


7.需要用到一个自己打包的jar, increment.export.jar就是ExportIncrementFiles的class打成的jar包, 源代码如下

package com.neil.util;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;

public class ExportIncrementFiles {

	/**
	 * 
	 * @param configPath
	 *            差异文件路径配置目录
	 * @param baseDir
	 *            新版文件基本路径目标位置
	 * @param destDir
	 *            增量文件保存位置
	 * @param oldBaseDir
	 *            旧版文件基本路径目标位置
	 * @param decrementDestDir
	 *            减量文件保存位置
	 * @throws Exception
	 */
	private static void export(String configPath, String baseDir,
			String destDir, String oldBaseDir, String decrementDestDir)
			throws Exception {
		String srcFile = baseDir + configPath;
		String desFile = destDir + configPath;

		String oldSrcFile = oldBaseDir + configPath;
		String decrementDesFile = decrementDestDir + configPath;

		int lastIndex = desFile.lastIndexOf("/");
		String desPath = desFile.substring(0, lastIndex);

		int lastIndexDecrement = decrementDesFile.lastIndexOf("/");
		String decrementDesPath = decrementDesFile.substring(0,
				lastIndexDecrement);

		File srcF = new File(srcFile);
		if (srcF.exists()) {
			// 如果不存在这样的源文件,就把该文件放到减量文件目录那里,这个用来解决版本之间有删除文件的情况。
			File desF = new File(desFile);
			File desP = new File(desPath);
			if (!desP.exists()) {
				desP.mkdirs();
			}
			System.out.println(srcFile);
			// 判断最终路径是文件夹还是文件,是文件的话复制文件,文件夹的话创建文件夹
			if (srcF.isFile()) {
				FileInputStream fis = new FileInputStream(srcF);
				FileOutputStream fos = new FileOutputStream(desF);

				byte[] buf = new byte[1024];
				int len = 0;
				while ((len = fis.read(buf)) != -1) {
					fos.write(buf, 0, len);
				}
				fos.flush();
				fos.close();
				fis.close();
			} else if (srcF.isDirectory()) {
				desF.mkdir();
			}
		} else {
			File oldSrcF = new File(oldSrcFile);
			File desF = new File(decrementDesFile);
			File desP = new File(decrementDesPath);
			if (!desP.exists()) {
				desP.mkdirs();
			}
			System.out.println(oldSrcFile);
			// 判断最终路径是文件夹还是文件,是文件的话复制文件,文件夹的话创建文件夹
			if (oldSrcF.isFile()) {
				FileInputStream fis = new FileInputStream(oldSrcF);
				FileOutputStream fos = new FileOutputStream(desF);

				byte[] buf = new byte[1024];
				int len = 0;
				while ((len = fis.read(buf)) != -1) {
					fos.write(buf, 0, len);
				}
				fos.flush();
				fos.close();
				fis.close();
			} else if (oldSrcF.isDirectory()) {
				desF.mkdir();
			}
		}
	}

	/**
	 * 
	 * @param args
	 *            参数0 差异文件路径,参数1 新版源文件路径,参数2 增量文件保存目标路径,参数3
	 *            旧版源文件路径,参数4减量文件保存目标路径
	 */
	public static void main(String[] args) {

		if (args.length > 0) {
			if (args.length == 1 && "help".equals(args[0])) {
				System.out
						.println("args[0] is Export Increment Files content path");
				System.out
						.println("args[1] is Export Increment Files target path");
				System.out
						.println("args[2] is Increment Files Export loaction");
				System.out
						.println("args[3] is Export Old Source Files target path");
				System.out
						.println("args[4] is Decrement Files Export loaction");
			} else {
				String configPath = args[0];
				String baseDir = args[1];
				String destDir = args[2];
				String oldBaseDir = args[3];
				String decrementDestDir = args[4];

				try {
					BufferedReader br = new BufferedReader(new FileReader(
							configPath));
					String s = null;
					while ((s = br.readLine()) != null) {
						s = s.trim();// 去掉路径前面的空格
						String str = destDir + s;
						if (!destDir.equals(str)) {// 过滤空行
						
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值