目前呆的项目组主要是维护工作,因为项目比较老,很多文件需要一个个替换,有新产品上就经常要这样替换,很烦,就抽空写了个用于替换修改的文件,当然还有不足之处,最后会提下。
package com.test; import com.jcraft.jsch.ChannelSftp; import com.jcraft.jsch.JSch; import com.jcraft.jsch.JSchException; import com.jcraft.jsch.Session; import com.jcraft.jsch.SftpException; import com.jcraft.jsch.SftpProgressMonitor; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.IOException; import java.util.Properties; public class SftpUtil { private ChannelSftp channelSftp; // private ChannelExec channelExec; private Session session=null; private int timeout=60000; public SftpUtil(SshConfiguration conf) throws JSchException { System.out.println("try connect to "+conf.getHost()+",username: "+conf.getUserName()+",password: "+conf.getPassword()+",port: "+conf.getPort()); JSch jSch=new JSch(); //创建JSch对象 session=jSch.getSession(conf.getUserName(), conf.getHost(), conf.getPort());//根据用户名,主机ip和端口获取一个Session对象 session.setPassword(conf.getPassword()); //设置密码 Properties config=new Properties(); config.put("StrictHostKeyChecking", "no"); session.setConfig(config);//为Session对象设置properties session.setTimeout(timeout);//设置超时 session.connect();//通过Session建立连接 } public void download(String src,String dst) throws JSchException, SftpException{ //src linux服务器文件地址,dst 本地存放地址 channelSftp=(ChannelSftp) session.openChannel("sftp"); channelSftp.connect(); channelSftp.get(src, dst); channelSftp.quit(); } public void upLoad(String src,String dst) throws JSchException,SftpException{ //src 本机文件地址。 dst 远程文件地址 channelSftp=(ChannelSftp) session.openChannel("sftp"); channelSftp.connect(); channelSftp.put(src, dst); System.out.println("upload file success!"); channelSftp.quit(); } public void close(){ session.disconnect(); } public static void main(String[] args) throws IOException { /** * *********上传准备文件*************** */ SshConfiguration configuration=new SshConfiguration(); configuration.setHost("你的ip地址"); configuration.setUserName("你的连接用户名"); configuration.setPassword("你的连接密码"); configuration.setPort(22);//端口一般都是22 File file = new File("E:\\uploadFile\\upload.txt");//需要上传的文件存放于txt里后面按行读取 BufferedReader bufferedReader = new BufferedReader(new FileReader(file)); String srcinput = null; try { while ((srcinput = bufferedReader.readLine()) != null) {//按行读取 SFTPUtils sftp=new SFTPUtils(configuration); String[] strs = srcinput.split("\\."); String type = strs[strs.length - 1]; System.out.println("type:" + type); // 判断文件是class还是jsp或js String dst1 = "你的应用部分路径";//后面会根据读入的做String的一些处理后拼接成上传的完整位置 if ("class".equals(type)) { String src = srcinput.replace("\\", "\\\\");// 本地上传文件路径 System.out.println("src:" + src); String[] strs1 = srcinput.split("\\\\"); if ("某项目1".equals(strs1[3])) {// 属于某项目1目录下 StringBuffer sb = new StringBuffer(dst1); sb.append("某项目1/"); String last = srcinput.substring(srcinput .indexOf("WEB-INF")); String last1 = last.replace("\\", "/"); String[] last1str = last1.split("/"); String str2 = last1str[last1str.length - 1]; String str3 = last1.substring(0, last1.indexOf(str2) - 1); sb.append(str3); String dst = sb.toString(); System.out.println("dst:" + dst); sftp.upLoad(src, dst); } if ("某项目2".equals(strs1[3])) {// 属于某项目2目录下 StringBuffer sb = new StringBuffer(dst1); sb.append("某项目2/"); String last = srcinput.substring(srcinput .indexOf("WEB-INF")); String last1 = last.replace("\\", "/"); String[] last1str = last1.split("/"); String str2 = last1str[last1str.length - 1]; String str3 = last1.substring(0, last1.indexOf(str2) - 1); sb.append(str3); String dst = sb.toString(); System.out.println("dst:" + dst); sftp.upLoad(src, dst); } if ("某项目3".equals(strs1[3])) {// 属于某项目3目录下 StringBuffer sb = new StringBuffer(dst1); sb.append("某项目3/"); String last = srcinput.substring(srcinput .indexOf("WEB-INF")); String last1 = last.replace("\\", "/"); String[] last1str = last1.split("/"); String str2 = last1str[last1str.length - 1]; String str3 = last1.substring(0, last1.indexOf(str2) - 1); sb.append(str3); String dst = sb.toString(); System.out.println("dst:" + dst); sftp.upLoad(src, dst); } } if ("jsp".equals(type) || "js".equals(type)) {// 该项目jsp和js放一起,一起判断且只在某项目1下 String src = srcinput.replace("\\", "\\\\");// 本地上传文件路径 System.out.println("src:" + src); String[] strs1 = srcinput.split("\\\\"); if ("某项目1".equals(strs1[3])) {// 属于某项目1目录下 StringBuffer sb = new StringBuffer(dst1); sb.append("某项目1/"); String last = srcinput.substring(srcinput.indexOf("view")); String last1 = last.replace("\\", "/"); String[] last1str = last1.split("/"); String str2 = last1str[last1str.length - 1]; String str3 = last1.substring(0, last1.indexOf(str2) - 1); sb.append(str3); String dst = sb.toString(); System.out.println("dst:" + dst); sftp.upLoad(src, dst); } } } } catch (Exception e) { e.printStackTrace(); }finally{ bufferedReader.close(); } } }
这种比较定制化,因为每个项目统一的格式不一样,有些js等静态文件喜欢放static或者直接建个js文件目录,所以老项目就各自根据自己的项目定制化下吧。。一劳永逸哈哈哈,当然原本是想自己修改了什么文件就自动捕获上传,但是还不清楚如何获取自己修改的文件所以没有实现,就用了在txt里写文件全路径的方式按行读取逐个上传的办法,,也还有很多地方可以完善,如果有大佬知道怎么获取文件被自己修改,请说下~
原文地址:https://www.cnblogs.com/codecola/p/11057291.html
时间: 2024-11-06 09:52:46