一、基本原理
利用ant脚本自动从svn版本库checkout出旧版本, 新版本, 以及差异文件, 通过解析差异文件以及对比新旧版本文件的存在与否, 最终导出增量文件和减量文件。
二、运行环境
6.
因为某些项目使用到了泛型、annotation注解,使用javac有些代码是编译不通过的,所以这里使用了jdt的编译方式。
需要用到:
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文件夹内,完成之后如下图所示:
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)) {// 过滤空行