一键部署java web应用(linux)

来源:互联网 发布:mac更新flash插件 编辑:程序博客网 时间:2024/06/15 21:08

先看看部署web应用的步骤

1.本地打包

2.上传压缩包到服务器

3.停止tomcat

4.删除旧版本web应用,解压缩新版本

5.启动tomcat

每次web应用更新,都要重复上面这几个步骤, 重复的步骤,交给计算机去完成就可以了。


1.本地打包

import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.util.List;import org.apache.tools.zip.ZipEntry;import org.apache.tools.zip.ZipOutputStream;public class ZipUtil {private static byte[] bytes = new byte[1024];/** * 压缩zip包 *  * @param zipFileName *            zip包文件名 * @param sourceFiles *            要压缩的文件或目录 * @throws IOException */public static void zipFile(String zipFileName, List<File> sourceFiles)throws IOException {if (zipFileName.endsWith(".zip") || zipFileName.endsWith(".ZIP")) {ZipOutputStream zipOut = new ZipOutputStream(new FileOutputStream(new File(zipFileName)));zipOut.setEncoding("GBK");for (File file : sourceFiles) {handlerFile(zipFileName, zipOut, file, "");}zipOut.close();} else {throw new IOException("压缩包后缀名不是.zip");}}/** *  * @param zip *            压缩的目的地址 * @param zipOut * @param srcFile *            被压缩的文件信息 * @param path *            在zip中的相对路径 * @throws IOException */private static void handlerFile(String zip, ZipOutputStream zipOut,File srcFile, String path) throws IOException {if (!"".equals(path) && !path.endsWith(File.separator)) {path += File.separator;}if (srcFile.isDirectory()) {File[] files = srcFile.listFiles();if (files.length == 0) {zipOut.putNextEntry(new ZipEntry(path + srcFile.getName()+ File.separator));zipOut.closeEntry();} else {for (File file : files) {handlerFile(zip, zipOut, file, path + srcFile.getName());}}} else {System.out.println("正在压缩  " + srcFile.getName() + "...");InputStream in = new FileInputStream(srcFile);zipOut.putNextEntry(new ZipEntry(path + srcFile.getName()));int len = 0;while ((len = in.read(bytes)) > 0) {zipOut.write(bytes, 0, len);}in.close();zipOut.closeEntry();}}}


2.上传压缩包到服务器

上传服务有两种方法

第一种是在linux上搭建ftp服务端,用java实现上传文件到ftp服务器,ftp服务器搭建详见linux搭建ftp服务器,上传文件百度也能找到教程,本文只介绍第二种方法

第二种:

安装putty(下载),环境变量加上putty的安装路径


然后就可以在dos命令窗口使用putty的上传命令

pscp -pw 123456 E:\update.zip root@192.168.1.100:/usr/local/apache-tomcat-7.0.82

123456是服务器的登录密码

E:\update.zip 是要上传的文件

root 是服务器的登录用户名

192.168.1.100 是服务器的ip

/usr/local/apache-tomcat-7.0.82 把文件上传到服务器上这个目录下

接下来就是用java调用上传文件命令来上传文件,第一次用要先在dos命令窗口执行一次,会让你输入密码,以后再执行这个命令就可以直接上传文件,就可以用java程序调用

import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;/** * 执行cmd命令 *  */public class CmdExecutor {public String runCmd(String cmd) throws IOException {Runtime runtime = Runtime.getRuntime();String line = null;StringBuilder outMsg = new StringBuilder();Process process = runtime.exec(cmd);BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream(), "gbk"));while ((line = reader.readLine()) != null) {outMsg.append(line + "\n");}return outMsg.toString();}public String runCmd(String[] cmds) throws IOException {Runtime runtime = Runtime.getRuntime();String line = null;StringBuilder outMsg = new StringBuilder();Process process = runtime.exec(cmds);BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream(), "gbk"));while ((line = reader.readLine()) != null) {outMsg.append(line + "\n");}return outMsg.toString();}}



3.停止tomcat,删除旧版本web应用,解压缩新版本,启动tomcat都要远程执行linux命令

可以在linux上写一个脚本删除旧版本web应用,解压缩新版本,删除压缩包,然后远程执行脚本

reload.sh

rm -rf /usr/local/apache-tomcat-7.0.82/webapps/XPRO/WEB-INF/classes
rm -rf /usr/local/apache-tomcat-7.0.82/webapps/XPRO/WEB-INF/jsp
unzip -n /usr/local/apache-tomcat-7.0.82/update.zip -d /usr/local/apache-tomcat-7.0.82/webapps/XPRO/WEB-INF
rm -rf /usr/local/apache-tomcat-7.0.82/update.zip

import java.io.IOException;import java.io.InputStream;import java.io.UnsupportedEncodingException;import java.nio.charset.Charset;import ch.ethz.ssh2.ChannelCondition;import ch.ethz.ssh2.Connection;import ch.ethz.ssh2.Session;import ch.ethz.ssh2.StreamGobbler;/** * 远程执行Linux命令 *  */public class RemoteShellExecutor {private Connection conn;/** * 远程服务器ip */private String ip;/** * 远程服务器端口 */private int port;/** * 用户名 */private String userName;/** * 密码 */private String password;/** * 是否已登录 */private boolean isLogin;/** * 编码格式 */private String charset = Charset.defaultCharset().toString();private static final int TIME_OUT = 1000 * 5 * 60;/** *  * @param ip *            服务器ip * @param port *            端口 * @param userName *            用户名 * @param password *            密码 */public RemoteShellExecutor(String ip, int port, String userName,String password) {this.ip = ip;this.port = port;this.userName = userName;this.password = password;}/** * 登录 *  * @return true:登录成功 false:登录失败 * @throws IOException */public boolean login() throws IOException {conn = new Connection(ip, port);conn.connect();isLogin = conn.authenticateWithPassword(userName, password);return isLogin;}/** * 执行命令 如果要执行多条命令,要把这几条命令拼成一个字符串,每条命令后面加回车符"\n", * 因为打开一个Session只能执行一次命令,每次都会从根目录下执行 *  * @param cmds *            要执行的命令 * @return 执行结果 * @throws Exception */public String exec(String cmds) throws Exception {if (!this.isLogin) {if (!this.login()) {new Exception("登录失败-->" + ip + ":" + port);}}InputStream stdOut = null;String outMsg = "";try {Session session = conn.openSession();session.execCommand(cmds);session.waitForCondition(ChannelCondition.EXIT_STATUS, TIME_OUT);if (session.getExitStatus() == 0) {stdOut = new StreamGobbler(session.getStdout());outMsg = processStream(stdOut, charset);} else {stdOut = new StreamGobbler(session.getStderr());outMsg = processStream(stdOut, charset);}} finally {if (stdOut != null) {stdOut.close();}}return outMsg;}public void closeConnection() {if (conn != null) {conn.close();}}/** * @param in * @param charset * @return * @throws IOException * @throws UnsupportedEncodingException */private String processStream(InputStream in, String charset)throws Exception {byte[] buf = new byte[1024];StringBuilder sb = new StringBuilder();while (in.read(buf) != -1) {sb.append(new String(buf, charset));}return sb.toString();}public boolean isLogin() {return isLogin;}public void setLogin(boolean isLogin) {this.isLogin = isLogin;}}