最近发生了一件怪事,项目在本地run的时候会报一个jar包下找不到某个class的错误,然而同样的project promote到远程服务器上 是ok的,于是就怀疑会不会是远程服务器上的jar包 跟本地的有差别,于是乎写下了这个东西。
只是一个basic的版本,可以再加点内容完善的。
需要的jar包
连接linux remote server要用的:
ganymed-ssh2.jar
因为我是导出了excel 所以用了POI
poi.jar
Utils 类
写道
package org.vic.util;
import java.util.Collection;
import java.util.Collections;
public class Utils {
public static Collection ifNullReturnEmpty(Collection collection) {
return collection == null ? Collections.emptyList() : collection;
}
}
import java.util.Collection;
import java.util.Collections;
public class Utils {
public static
return collection == null ? Collections.emptyList() : collection;
}
}
DTO: 数据行结构
package org.vic.dto; public class Row { private String fileName; private int fileAmount; public String getFileName() { return fileName; } public void setFileName(String fileName) { this.fileName = fileName; } public int getFileAmount() { return fileAmount; } public void setFileAmount(int fileAmount) { this.fileAmount = fileAmount; } }
主功能类:
package org.vic.core; import java.io.BufferedReader; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; import org.apache.poi.hssf.usermodel.HSSFCell; import org.apache.poi.hssf.usermodel.HSSFCellStyle; import org.apache.poi.hssf.usermodel.HSSFRow; import org.apache.poi.hssf.usermodel.HSSFSheet; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.hssf.util.HSSFColor; import org.apache.poi.ss.usermodel.Font; import org.vic.dto.Row; import org.vic.util.Utils; import ch.ethz.ssh2.Connection; import ch.ethz.ssh2.Session; import ch.ethz.ssh2.StreamGobbler; public class Comparator { /** * * @param remoteFolderPath 远程服务目标文件夹路径 * @param remoteIp 远程服务器IP * @param remoteUsername 远程服务器登陆用户名 * @param remotePassword 远程服务器登陆密码 * @param localFolderPath 本地目标文件夹路径 * @param excelFilePath 导出结果excel文件路径 * @throws Exception 抛出一场 */ public void getDifferentFiles(String remoteFolderPath, String remoteIp, String remoteUsername, String remotePassword, String localFolderPath, String excelFilePath) throws Exception { System.out.println("start searching local files"); ListlocalFileNames = getLocalFileNames(localFolderPath); System.out.println("start searching remote files"); List remoteFileNames = getRemoteFileNames(remoteFolderPath, remoteIp, remoteUsername, remotePassword); System.out.println("merging data"); Set totalSet = new HashSet (); totalSet.addAll(localFileNames); totalSet.addAll(remoteFileNames); List localFileInfo = new ArrayList
(); List
remoteFileInfo = new ArrayList
(); System.out.println("creating rows"); for(String fileName : Utils.ifNullReturnEmpty(localFileNames)){ Row row = fileInfoProcesser(fileName, localFileNames); localFileInfo.add(row); } for(String fileName : Utils.ifNullReturnEmpty(remoteFileNames)){ Row row = fileInfoProcesser(fileName, remoteFileNames); remoteFileInfo.add(row); } System.out.println("generating excel file..."); excelCreater(localFileInfo, remoteFileInfo, excelFilePath, totalSet); System.out.println("generating finished, please read the file in : " + excelFilePath); } private void excelCreater(List
localList, List
remoteList, String exportFilePath, Set
totalSet) { HSSFWorkbook wb = new HSSFWorkbook(); HSSFSheet sheet = wb.createSheet("comparator"); sheet.setColumnWidth(0, 100 * 180); sheet.setColumnWidth(1, 100 * 50); sheet.setColumnWidth(2, 100 * 180); sheet.setColumnWidth(3, 100 * 50); HSSFRow row = sheet.createRow((int) 0); HSSFCellStyle style = wb.createCellStyle(); style.setAlignment(HSSFCellStyle.ALIGN_CENTER); Font titleFont = wb.createFont(); titleFont.setBoldweight(Font.BOLDWEIGHT_BOLD); style.setFont(titleFont); HSSFCellStyle differentStyle = wb.createCellStyle(); differentStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER); Font font = wb.createFont(); font.setColor(Font.COLOR_RED); differentStyle.setFont(font); HSSFCell cell = row.createCell(0); cell.setCellValue("localFileName"); cell.setCellStyle(style); cell = row.createCell(1); cell.setCellValue("localFileAmount"); cell.setCellStyle(style); cell = row.createCell(2); cell.setCellValue("remoteFileName"); cell.setCellStyle(style); cell = row.createCell(3); cell.setCellValue("remoteFileAmount"); cell.setCellStyle(style); HSSFCellStyle dataStyle = wb.createCellStyle(); dataStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER); Font dataFont = wb.createFont(); dataFont.setColor(HSSFColor.BLUE.index); dataStyle.setFont(dataFont); List archList = new ArrayList (); archList.addAll(totalSet); for(int i = 0; i < archList.size(); i ++) { row = sheet.createRow(i + 1); String fileName = archList.get(i); Row localRowData = findRowByFileName(fileName, localList); Row remoteRowData = findRowByFileName(fileName, remoteList); HSSFCell cell0 = row.createCell(0); cell0.setCellStyle(dataStyle); cell0.setCellValue(localRowData.getFileName()); HSSFCell cell1 = row.createCell(1); cell1.setCellStyle(dataStyle); cell1.setCellValue(localRowData.getFileAmount()); HSSFCell cell2 = row.createCell(2); cell2.setCellStyle(dataStyle); cell2.setCellValue(remoteRowData.getFileName()); HSSFCell cell3 = row.createCell(3); cell3.setCellStyle(dataStyle); cell3.setCellValue(remoteRowData.getFileAmount()); if(!localRowData.getFileName().equals(remoteRowData.getFileName()) || localRowData.getFileAmount() != remoteRowData.getFileAmount()) { cell0.setCellStyle(differentStyle); cell1.setCellStyle(differentStyle); cell2.setCellStyle(differentStyle); cell3.setCellStyle(differentStyle); } } try { File file = new File(exportFilePath); if(!file.exists()) { file.createNewFile(); } FileOutputStream fos = new FileOutputStream(exportFilePath); wb.write(fos); } catch (IOException e) { e.printStackTrace(); } } private Row findRowByFileName(String fileName, List fileList) { for(Row row : fileList) { if(fileName.equals(row.getFileName())){ return row; } } Row empty = new Row(); empty.setFileName("--"); empty.setFileAmount(0); return empty; } private Row fileInfoProcesser(String fileName, List
fileList) { Row row = new Row(); int count = 0; for(String file : Utils.ifNullReturnEmpty(fileList)) { if(file.equals(fileName)) { count ++; } } row.setFileName(fileName); row.setFileAmount(count); return row; } private List getLocalFileNames(String localFolderPath) throws Exception { List result = new ArrayList (); File file = new File(localFolderPath); if(file.exists()) { if(file.isDirectory()) { File[] files = file.listFiles(); if(file != null && file.length() > 0) { for (File subFile : files) { String fileName = subFile.getName(); result.add(fileName); } } } else { throw new Exception("path is a file, not a directory!"); } } else { throw new Exception("folder is not existing!"); } return result; } private List getRemoteFileNames(String remoteFolderPath, String remoteIp, String remoteUsername, String remotePassword) throws IOException { List result = new ArrayList (); Connection conn = new Connection(remoteIp); conn.connect(); boolean isAuthenticated = conn.authenticateWithPassword(remoteUsername, remotePassword); if (isAuthenticated == false) throw new IOException("Authentication failed."); Session session = conn.openSession(); String commands = "cd " + remoteFolderPath + "&&ls"; session.execCommand(commands); InputStream stdout = new StreamGobbler(session.getStdout()); @SuppressWarnings("resource") BufferedReader br = new BufferedReader(new InputStreamReader(stdout)); String tmp = null; while ((tmp = br.readLine()) != null) { String fileName = tmp; fileName = fileName.replace("Shell Message : ", ""); result.add(fileName); } session.close(); conn.close(); return result; } /** * Execution Entrance * @param args * @throws Exception */ public static void main(String[] args) throws Exception { Comparator c = new Comparator(); c.getDifferentFiles("/remoteServer/project/lib", "xx.xx.xx.xx", "username", "password", "local/project/lib", "excel/result.xls"); } }