当前位置: 代码迷 >> CVS/SVN >> 利用SVN高速更新[文件或新版本]至LINUX服务器
  详细解决方案

利用SVN高速更新[文件或新版本]至LINUX服务器

热度:1258   发布时间:2013-02-26 00:00:00.0
利用SVN快速更新[文件或新版本]至LINUX服务器

利用SVN快速更新版本至LINUX服务器,不用每次都copy一个文件改动去服务器然后覆盖文件重启服务器了。

不多说。直接截图说明,下面附更新的java文件:

 

 

 

D:/svn_update是项目要导出的地方,必须事先将从svn中导出的配置和源java文件【即上图中的webRoot和src】copy至此。E:/workspace/zgcl_mysql是项目根目录。运行此类后发现svn_update/webroot下多了classes文件和配置文件。直接copy至服务器覆盖shutdown.sh->start.sh重启服务器即可。

以下是原文件:

package org.andy.svn;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.InputStream;import java.util.ArrayList;import java.util.List;public class ExportClass {	private List<String> fileNamels = new ArrayList<String>();	private String filesp = System.getProperty("file.separator");	private String[] javaRoot = { "src", "test" };// 要提取class文件的目录	private String currentJavaRoot;	private List<String> javaSourceDirectory = new ArrayList<String>();	private List<String> javaRootLs = new ArrayList<String>();	private boolean isExportAll = false;// 是否提取javaRoot目录下所有的文件,false:只提取java文件相对应的.class文件,true:提取java文件相对应的.class文件与其它文件	public static void main(String[] args) {		// 用svn导出更新的文件,存放到d:\svnupdate中		// 执行程序后,把javaRoot目录下相对应的java文件提取项目中相对应的.class文件		// 存放到D:\\svnupdate\\WebRoot\\WEB-INF\\classes		// 下,WebRoot下的文件即为所要更新的所有文件		ExportClass exportClass = new ExportClass();		//exportClass.exportAll("D:\\svnupdate", "E:\\eclipse\\workspace2\\xm_scetraining", true);// 提取在svn提取目录下,除WebRoot		exportClass.exportAll("D:\\svn_update", "E:\\workspace\\zgcl_mysql", true);// 提取在svn提取目录下,除WebRoot		// 文件目录下其它目录相对应的class文件		// exportClass.exportAllByJavaRoot("D:\\svnupdate",		// "F:\\myproject\\wys2", true);//提取javaRoot中指定目录下的相对应的class文件	}	/*	 * 列出svn 更新时导出的文件中 src目录下所有文件的文件名(包括相对src的全路径,java文件名变为相对应的class文件名)	 */	public void listFile(File f) {		if (!f.exists()) {			System.err.println("文件或目录:" + f.getAbsolutePath() + "不存在");			return;		}		String fileName = f.getAbsolutePath();		if (f.isDirectory()) {			// System.out.println("directory:"+f.getPath()+"--parent:"+f.getParent());			// System.out.println("directory:"+f.getPath()+"--parent:"+f.getParent());			String directoryName;			if (fileName.indexOf(filesp + currentJavaRoot + filesp) != -1) {				directoryName = fileName.substring(fileName.indexOf(this.filesp + this.currentJavaRoot + this.filesp) + this.currentJavaRoot.length() + 1);				javaSourceDirectory.add(directoryName);			}			File[] t = f.listFiles();			for (int i = 0; i < t.length; i++) {				listFile(t[i]);			}		} else {			// System.out.println("fileName:"+f.getAbsolutePath()+"--parent:"+f.getParent());			if (fileName.indexOf(filesp + currentJavaRoot + filesp) != -1) {				int index = fileName.indexOf(filesp + currentJavaRoot + filesp);				if (fileName.lastIndexOf(".java") != -1) {					String javaFile = fileName.substring(index + this.currentJavaRoot.length() + 1, fileName.lastIndexOf(".java")) + ".class";					this.fileNamels.add(javaFile);					System.out.println("fileName:" + javaFile);				} else {					if (this.isExportAll) {						String otherFile = fileName.substring(index + this.currentJavaRoot.length() + 1);						this.fileNamels.add(otherFile);						System.out.println("fileName:" + otherFile);					}				}			}		}	}	/*	 * svn 更新时导出的文件中,根据JAVA文件目录结构,提取项目中相应的.class文件; srcRoot :用svn	 * 提取更新文件所存放的目录,即提取文件后java源文件所在的父目录 projectRoot: 项目所在的路径 desRoot	 * :提取相对应文件后classes文件夹所在的目录,用于提取后文件保存的目录	 */	public void exportClass(String srcRoot, String projectRoot, String desRoot) {		this.fileNamels.clear();		this.initJavaRoot();		if (this.javaRootLs.size() < 1) {			System.out.println("不存在要提取class文件的目录!");			return;		}		for (int i = 0; i < this.javaRootLs.size(); i++) {			this.currentJavaRoot = this.javaRootLs.get(i);			this.listFile(new File(srcRoot + this.filesp + this.currentJavaRoot));		}		getInnerClass(projectRoot);		String src = null;		String des = null;		for (String fileName : fileNamels) {			src = projectRoot + this.filesp + "WebRoot" + this.filesp + "WEB-INF" + this.filesp + "classes" + fileName;			des = desRoot + this.filesp + "classes" + fileName;			copyFile(src, des);		}	}	/*	 * 初始化要提取class文件的java源文件目录	 */	private void initJavaRoot() {		if (this.javaRootLs.size() > 0) {// javaRootLs已经赋值,直接返回			return;		}		for (int i = 0; i < javaRoot.length; i++) {			if (!"WebRoot".equalsIgnoreCase(javaRoot[i])) {				this.javaRootLs.add(javaRoot[i]);			} else {				System.out.println("javaRoot中不能包含WebRoot!");			}		}	}	/*	 * 根据svn提取的文件目录,进行提取相对应的class文件 存到指定的desRoot/classes 目录下	 * java文件目录为javaRoot中所指定的目录 isExportOtherFile 是否提取java文件所在目录的其它文件 如,java	 * 配置文件 .xml	 */	public void exportAllByJavaRoot(String srcRoot, String projectRoot, String desRoot, boolean isExportOtherFile) {		this.isExportAll = isExportOtherFile;		exportClass(srcRoot, projectRoot, desRoot);	}	/*	 * 根据svn提取的文件目录,进行提取相对应的class文件 存到srcRoot/WebRoot/WEB-INF/classes 目录下	 * java文件目录为javaRoot中所指定的目录 isExportOtherFile 是否提取java文件所在目录的其它文件 如,java	 * 配置文件 .xml	 */	public void exportAllByJavaRoot(String srcRoot, String projectRoot, boolean isExportOtherFile) {		exportAllByJavaRoot(srcRoot, projectRoot, srcRoot + this.filesp + "WebRoot" + this.filesp + "WEB-INF", isExportOtherFile);	}	/*	 * 根据svn提取的文件目录,进行提取相对应的class文件 java文件所在目录默认为除WebRoot目录 之外的目录	 * isExportOtherFile 是否提取java文件所在目录的其它文件 如,配置文件 .xml	 */	public void exportAll(String srcRoot, String projectRoot, boolean isExportOtherFile) {		File root = new File(srcRoot);		if (!root.exists()) {			System.out.println("文件或目录:" + root.getAbsolutePath() + "不存在");			return;		}		this.javaRootLs.clear();		File[] t = root.listFiles();		for (int i = 0; i < t.length; i++) {			if (!"WebRoot".equalsIgnoreCase(t[i].getName())) {				this.javaRootLs.add(t[i].getName());			}		}		exportAllByJavaRoot(srcRoot, projectRoot, isExportOtherFile);	}	/*	 * 文件复制	 */	private void copyFile(String oldPath, String newPath) { // 复制文件		try {			int bytesum = 0;			int byteread = 0;			File oldfile = new File(oldPath);			File newfile = new File(newPath);			if (!newfile.getParentFile().exists()) {// 目录不存在时,创建目录				newfile.getParentFile().mkdirs();			}			if (oldfile.exists()) { // 文件存在时				InputStream inStream = new FileInputStream(oldPath); // 读入原文件				FileOutputStream fs = new FileOutputStream(newPath);				byte[] buffer = new byte[1444];				while ((byteread = inStream.read(buffer)) != -1) {					bytesum += byteread; // 字节数 文件大小					// System.out.println(bytesum);					fs.write(buffer, 0, byteread);				}				inStream.close();				System.out.println("文件:" + oldfile.getName() + " 复制大小:" + (double) bytesum / 1024 + " KB");			} else {				System.err.println("文件:" + oldfile.toString() + "不存在!!!");			}		} catch (Exception e) {			System.out.println("复制单个文件操作出错");			e.printStackTrace();		}	}	/*	 * 查找提取文件中是否存在内部类,存在则提取出来	 */	private void getInnerClass(String projectRoot) {		for (int i = 0; i < javaSourceDirectory.size(); i++) {			String temp_javaSourceDirectory = javaSourceDirectory.get(i);			String directory = projectRoot + this.filesp + "WebRoot" + this.filesp + "WEB-INF" + this.filesp + "classes" + temp_javaSourceDirectory;			File temp_directory = new File(directory);			File[] fs = temp_directory.listFiles();			for (int j = 0; j < fs.length; j++) {				File file = fs[j];				if (!file.isDirectory()) {					if (file.getName().indexOf("$") != -1 && file.getName().indexOf(".class") != -1) {						String innerClassFather = javaSourceDirectory.get(i) + this.filesp + file.getName().substring(0, file.getName().indexOf("$")) + ".class";						if (this.fileNamels.contains(innerClassFather)) {							this.fileNamels.add(temp_javaSourceDirectory + this.filesp + file.getName());							System.out.println("fileName:" + temp_javaSourceDirectory + this.filesp + file.getName());						}					}				}			}		}	}}