java实现对服务器的自动巡检邮件通知

1、需求

之前一直是手动的巡检,然后贴图,最近服务器数量大增,有点忙不过来了。因为一直用的java,对shell脚本不是特别了解,所以这次用java写了个小项目,实现对多服务器,多任务的巡检,巡检结果有故障的会通过邮件通知。

2、功能和效果

巡检的项目主要是服务,硬盘,内存等,命令可配置,巡检结果以日期和服务器为基准输出文件,错误信息通过邮件通知管理运维人员。

3、代码

action:

package com.save.action;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.alibaba.fastjson.JSON;
import com.save.pojo.Cmd;
import com.save.until.MailUtil;
import com.save.until.PropertiesUtil;
import com.save.until.SSHCommUtil;
import com.save.until.WriteUntil;
/**
 * 巡检任务
 * @author zhangzhuo
 *
 */
public class InspAction {
 final static Logger logger = LoggerFactory.getLogger(InspAction.class);
/* public static void main(String[] args) {
  InspAction n = new InspAction();
  try {
   n.execute();
  } catch (Exception e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
   logger.error("dd");
  }
 }*/
 /**
  * 执行巡检任务
  * @param args
  */
 public void execute() throws Exception{
  List<Cmd> list = this.handlerData();
  Set<String> mail = new HashSet<String>();
  for (Cmd cmd : list) {
   String ip = cmd.getIp();
   int port = 22;
   String localIp = null;
   int localPort = 0;
   int timeOut = 6000;
   String userName = cmd.getUsername();
   String password = cmd.getPassword();
   String server = cmd.getServer();
   String[] cmds = cmd.getCmds();
   String[] result = null;
   logger.info(ip+"执行巡检任务开始");
   try {
    result = SSHCommUtil.execShellCmdBySSH(ip, port, localIp, localPort, timeOut,
      userName, password, cmds);
   } catch (Exception e) {
    e.printStackTrace();
    logger.error(ip+"巡检,服务器连接不上");
    mail.add(ip+" "+"巡检,服务器连接不上");
   }
   Date date = new Date();
   SimpleDateFormat formatter = new SimpleDateFormat("yyyy/MM/dd");
   String dateString = formatter.format(date);
   //1、服务存活验证 2、硬盘占用验证 3、巡检结果写入文件
   if (result != null) {
    for (String string : result) {
     if (string.contains("ps -ef|grep java")||string.contains("ps -ef|grep mongo")||string.contains("ps -ef|grep redis")) {
      if (!string.contains(server)) {
       mail.add(ip+" "+server+"服务不存在");
      }
     }
     if (string.contains("df -h")) {
      String patt = "^[5]\\d{1}\\%|[5-9]\\d{1}\\%|\\d{3,}\\%$";
      String group = null;
      Pattern p = Pattern.compile(patt);
      Matcher m = p.matcher(string);
      while (m.find()) {
       group = m.group();
      }
      if (!StringUtils.isBlank(group)) {
       mail.add(ip+" "+"硬盘占用超出预警线");
      }
     }
     WriteUntil.createFile("E:\\save", dateString, "\\"+ip+".txt", string);
    }
    logger.info(ip+"巡检结束");
   }
  }
  //发送故障邮件通知
  if (!mail.isEmpty()||mail.size()!=0) {
   MailUtil.getInstance().sendMail(mail);
  }
 }
 /**
  * 数据处理
  * @return
  */
 private List<Cmd> handlerData(){
  logger.info("开始加载需要巡检的服务器数据");
  Cmd cmd = null;
  List<Cmd> list = new ArrayList<Cmd>();
  Map map = PropertiesUtil.getInstance().getAllProperty();
  Iterator<Map.Entry<String, String>> it = map.entrySet().iterator();
  while (it.hasNext()) {
   Map.Entry<String, String> entry = it.next();
   cmd =new Cmd();
   cmd.setIp(entry.getKey());
   Cmd cmd2 = JSON.parseObject(entry.getValue(), Cmd.class);
   String[] cmds = cmd2.getShell().split(",");
   cmd.setCmds(cmds);
   cmd.setServer(cmd2.getServer());
   cmd.setUsername(cmd2.getUsername());
   cmd.setPassword(cmd2.getPassword());
   list.add(cmd);
  }
  logger.info("数据加载完毕");
  return list;
 }

}

pojo:

package com.save.pojo;

public class Cmd {
 private String ip;
 private String username;
 private String password;
 private String shell;
 private String[] cmds;
 private String server;

 public String getServer() {
  return server;
 }
 public void setServer(String server) {
  this.server = server;
 }
 public String getShell() {
  return shell;
 }
 public void setShell(String shell) {
  this.shell = shell;
 }
 public String getIp() {
  return ip;
 }
 public void setIp(String ip) {
  this.ip = ip;
 }
 public String getUsername() {
  return username;
 }
 public void setUsername(String username) {
  this.username = username;
 }
 public String getPassword() {
  return password;
 }
 public void setPassword(String password) {
  this.password = password;
 }
 public String[] getCmds() {
  return cmds;
 }
 public void setCmds(String[] cmds) {
  this.cmds = cmds;
 }
}

工具类:

package com.save.until;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Properties;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.jcraft.jsch.JSch;
import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.Session;
import com.jcraft.jsch.SocketFactory;
/**
 * SSH创建与服务器连接工具类
 * @author 张卓
 * 2017-4-21
 */
public class JSCHUtil {
 final static Logger logger = LoggerFactory.getLogger(JSCHUtil.class);
 private static JSch jsch = new JSch();
 /**
 * 创建Session,并打开Session连接
 *
 */
 public static Session createSession(String dstIp, int dstPort,
  final String localIp, final int localPort, String userName,
  String password, final int timeOut) throws JSchException {
 //jsch.setKnownHosts("/home/foo/.ssh/known_hosts");
  logger.info("开始连接:"+dstIp);
 // 建立一个SSH连接
 Session session = jsch.getSession(userName, dstIp, dstPort);
 session.setPassword(password);

 Properties sshConfig = new Properties();
 sshConfig.put("StrictHostKeyChecking", "no");//跳过主机检查
 session.setConfig(sshConfig);
 // 此socket工厂用于创建目标主机的socket,
 // 并创建我们使用的这个socket字节流
 session.setSocketFactory(new SocketFactory() {
  public OutputStream getOutputStream(Socket socket)
   throws IOException {
  return socket.getOutputStream();
  }
  public InputStream getInputStream(Socket socket) throws IOException {
  return socket.getInputStream();
  }
  public Socket createSocket(String host, int port)
   throws IOException, UnknownHostException {
  Socket socket = new Socket();
  if (localIp != null) {
   socket.bind(new InetSocketAddress(InetAddress
    .getByName(localIp), localPort));
  }
  socket.connect(
   new InetSocketAddress(InetAddress.getByName(host), port),
   timeOut);
  return socket;
  }
 });
 session.connect(timeOut);
 return session;
 }
}
package com.save.until;
import java.util.Properties;
import java.util.Set;

import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.sun.mail.util.MailSSLSocketFactory;
/**
 * 邮件发送
 * @author zhangzhuo
 *
 */
public class MailUtil {
 final static Logger logger = LoggerFactory.getLogger(MailUtil.class);
 private static MailUtil instance = new MailUtil();
 private MailUtil (){}
 public static MailUtil getInstance() {
  return instance;
 } 

 public void sendMail(Set<String> mail) {
  String from = "XXX@qq.com";// 发件人电子邮箱
  String host = "smtp.qq.com"; // 指定发送邮件的主机smtp.qq.com(QQ)|smtp.163.com(网易)

  Properties properties =new Properties();

  properties.setProperty("mail.smtp.host", host);// 设置邮件服务器
  properties.setProperty("mail.smtp.auth", "true");// 打开认证

  try {
   //QQ邮箱需要下面这段代码,163邮箱不需要
   MailSSLSocketFactory sf = new MailSSLSocketFactory();
   sf.setTrustAllHosts(true);
   properties.put("mail.smtp.ssl.enable", "true");
   properties.put("mail.smtp.ssl.socketFactory", sf);

   // 1.获取默认session对象
   Session session = Session.getDefaultInstance(properties, new Authenticator() {
    public PasswordAuthentication getPasswordAuthentication() {
     return new PasswordAuthentication("XXX@qq.com", "XXX"); // 发件人邮箱账号、授权码
    }
   });

   // 2.创建邮件对象
   Message message = new MimeMessage(session);
   message.setFrom(new InternetAddress(from));
   message.addRecipient(Message.RecipientType.TO, new InternetAddress("XXX@qq.com"));
   message.setSubject("巡检故障通知");
   StringBuffer sb = new StringBuffer();
   for (String string : mail) {
    sb.append("<div>"+string+"</div><br/><hr/>");
   }
   String content = sb.toString();
   message.setContent(content, "text/html;charset=UTF-8");
   Transport.send(message);
   logger.info("故障邮件发送成功");
  } catch (Exception e) {
   e.printStackTrace();
  }
 }

}
package com.save.until;

import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.URI;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
/**
 * 读取文件工具类
 * @author zhangzhuo
 *
 */
public class PropertiesUtil { 

 private Properties props;
 private URI uri;
 private static PropertiesUtil ourInstance = new PropertiesUtil("/config.properties");
 public static PropertiesUtil getInstance() {
  return ourInstance;
 }
 public PropertiesUtil(String fileName){
  readProperties(fileName);
 }
 private void readProperties(String fileName) {
  try {
   props = new Properties();
   InputStream fis =getClass().getResourceAsStream(fileName);
   InputStreamReader re=new InputStreamReader(fis,"utf-8");
   props.load(re);
  } catch (Exception e) {
   e.printStackTrace();
  }
 }
 /**
  * 获取某个属性
  */
 public String getProperty(String key){
  return props.getProperty(key);
 }
 /**
  * 获取所有属性,返回一个map,不常用
  * 可以试试props.putAll(t)
  */
 public Map getAllProperty(){
  Map map=new HashMap();
  Enumeration enu = props.propertyNames();
  while (enu.hasMoreElements()) {
   String key = (String) enu.nextElement();
   String value = props.getProperty(key);
   map.put(key, value);
  }
  return map;
 }
 /**
  * 在控制台上打印出所有属性,调试时用。
  */
 public void printProperties(){
  props.list(System.out);
 }
 /**
  * 写入properties信息
  */
 public void writeProperties(String key, String value) {
  try {
  OutputStream fos = new FileOutputStream(new File(uri));
   props.setProperty(key, value);
   // 将此 Properties 表中的属性列表(键和元素对)写入输出流
   props.store(fos, "『comments』Update key:" + key);
  } catch (Exception e) {
  e.printStackTrace();
  }
 }  

}
package com.save.until;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.jcraft.jsch.Channel;
import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.Session;
/**
 * 执行Shell工具类
 * @author zhangzhuo
 *
 */
public class SSHCommUtil {
 final static Logger logger = LoggerFactory.getLogger(SSHCommUtil.class);
 /**
  * SHH连接Linux Shell,返回结果
  */
 public static String[] execShellCmdBySSH(String dstIp, int dstport,
   String localIp, int localPort, int timeOut, String userName,
   String password, String... cmds) throws Exception {
  Session session = null;
  Channel channel = null;
  InputStream is = null;
  OutputStream os = null;
  try {
   session = JSCHUtil.createSession(dstIp, dstport, localIp,
     localPort, userName, password, timeOut);
   logger.info("开始创建channel通道!");
   //创建一个channel类型的通道
   channel = session.openChannel("shell");
   // Enable agent-forwarding.
   // ((ChannelShell)channel).setAgentForwarding(true);
   // Choose the pty-type "vt102".
   // ((ChannelShell)channel).setPtyType("vt102");
   // Set environment variable "LANG" as "ja_JP.eucJP".
   // ((ChannelShell)channel).setEnv("LANG", "ja_JP.eucJP");
   channel.connect();
   is = channel.getInputStream();
   os = channel.getOutputStream();
   String[] result = new String[cmds.length];
   for (int i = 0; i < cmds.length; i++) {
    result[i] = sendCommand(is, os, cmds[i]);
   }
   return result;
  } catch (JSchException e) {
   if (e.getMessage().contains("Auth fail")) {
    logger.error(dstIp+"服务器验证失败");
    throw new Exception("Auth error");
   } else {
    logger.error(dstIp+"服务器连接失败");
    throw new Exception("Connect error");
   }
  } catch (Exception e) {
   throw e;
  } finally {
   try {
    is.close();
   } catch (IOException e) {
   }
   try {
    os.close();
   } catch (IOException e) {
   }
   channel.disconnect();
   session.disconnect();
  }
 }

 /**
  *执行Shell脚本并返回结果
  *
  */
 private static String sendCommand(InputStream is, OutputStream os,
   String cmd) throws IOException {
  logger.info("开始执行脚本!");
  os.write(cmd.getBytes());
  os.flush();
  StringBuffer sb = new StringBuffer();
  int beat = 0;
  while (true) {
   if (beat > 3) {
    break;
   }
   if (is.available() > 0) {
    byte[] b = new byte[is.available()];
    is.read(b);
    sb.append(new String(b));
    beat = 0;
   } else {
    if (sb.length() > 0) {
     beat++;
    }
    try {
     Thread.sleep(sb.toString().trim().length() == 0 ? 1000
       : 300);
    } catch (InterruptedException e) {
    }
   }
  }
  return sb.toString();
 }

}
package com.save.until;

 import java.io.BufferedReader;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.InputStreamReader;
 import java.util.ArrayList;
 import java.util.List;

 import com.jcraft.jsch.ChannelExec;
 import com.jcraft.jsch.JSch;
 import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.Session;

 /**
  * SSH工具类
  *
  */
 public class SSHExcuteCommandHelper {
  Session session = null;
  ChannelExec openChannel = null;
  /**
   * @param host 主机ip
   * @param name 用户名
   * @param pwd 密码
   * @param port ssh端口
   */
  public SSHExcuteCommandHelper(String host, String user, String pwd, int port) {
   JSch jsch = new JSch();
   try {
    session = jsch.getSession(user, host, port);
    java.util.Properties config = new java.util.Properties();
    config.put("StrictHostKeyChecking", "no");
    session.setTimeout(1000);
    session.setConfig(config);
    session.setPassword(pwd);
   } catch (JSchException e) {
    e.printStackTrace();
   }
  }
  /**
   * 是否连接成功,调用如果不需要调用execCommand方法那么必须调用 disconnect方法关闭session
   * @return
   */
  public boolean canConnection(){
   try {
    session.connect();
    return true;
   } catch (JSchException e) {
    e.printStackTrace();
    return false;
   }
  }
  /**
   * 关闭连接
   */
  public void disconnect(){
   if (openChannel != null && !openChannel.isClosed()) {
    openChannel.disconnect();
   }
   if (session != null && session.isConnected()) {
    session.disconnect();
   }
  }

  /**
   * 执行命令
   * @param command
   * @return
   */
  public String execCommand(String command) {
   StringBuffer result = new StringBuffer();
   try {
    if(!session.isConnected()){
     session.connect();
    }
    openChannel = (ChannelExec) session.openChannel("exec");
    openChannel.setCommand(command);
    //int exitStatus = openChannel.getExitStatus();
    openChannel.connect();
    InputStream in = openChannel.getInputStream();
    BufferedReader reader = new BufferedReader(
      new InputStreamReader(in));

    String tmpStr = "";
    while ((tmpStr = reader.readLine()) != null) {
     result.append(new String(tmpStr.getBytes("gbk"), "UTF-8")).append("\n");
    }

   } catch (Exception e) {
    e.printStackTrace();
    result.append(e.getMessage());
   } finally {
    disconnect();
   }
   return result.toString();
  }
  /**
   * 解析
   * @param result
   * @return
   */
  public List<List<String>> parseResult(String result){
   List<List<String>> parseResult = new ArrayList<List<String>>();
   List<String> list = null;
   //
   for (String line : result.split("\n")) {
    list = new ArrayList<String>();
    String[] columns = {};
    //这个是针对df命令的 [Mounted on] 其实就一个,如果用空格就会分割出两个
    if(line.contains("Mounted ")){
     columns = line.replace("Mounted ", "Mounted-").split(" ");
    }else{
     columns = line.split(" ");
    }

    for (String column : columns) {
     if (!" ".equals(column) && !"".equals(column)) {
      list.add(column);
     }
    }
    parseResult.add(list);
   }
   return parseResult;
  }
   //测试
/*  public static void main(String args[]) {
   SSHExcuteCommandHelper execute = new SSHExcuteCommandHelper("192.168.175.128", "root", "123456", 22);
   System.out.println("是否连接成功"+execute.canConnection());
   String s = execute.execCommand("free -m");
   System.out.println("解析前");
   System.out.println(s);
   System.out.println("解析后");
   List<List<String>> parseResult = execute.parseResult(s);
   for (List<String> l : parseResult) {
    System.out.println(l);
   }

  }*/
 }
package com.save.until;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.Date;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.save.action.InspAction;
/**
 *
 * @author zhangzhuo
 *
 */
public class WriteUntil {
 final static Logger logger = LoggerFactory.getLogger(WriteUntil.class);
 /**
  * 新建文件夹,并创建文件写入数据
  */
 public static void createFile(String basePath,String filePath, String filename, String input) {
  String[] dirs = filePath.split("/");
  String tempPath = basePath;
  for (String dir : dirs) {
   if (null == dir || "".equals(dir)) continue;
   tempPath += "\\" + dir;
  }
  //文件夹判断
  File dir = new File(tempPath);//"d:\\test_dir"
  if (dir.exists()) {
   if (dir.isDirectory()) {
    logger.info("文件夹存在");
   } else {
    logger.info("同名文件存在,无法创建目录");
   }
  } else {
   logger.info("文件夹不存在,开始创建");
   dir.mkdirs();
  }
  //文件判断
  File file = new File(tempPath+filename);//"d:\\test_file.txt"
  if (file.exists()) {
   logger.info(filename+"已存在");
  } else {
   logger.info(filename+"文件不存在,开始创建");
   try {
    file.createNewFile();
   } catch (IOException e) {
    e.printStackTrace();
   }
  }
  //写入数据
  //方法一、每次写入覆盖之前的
  /* try {
   FileOutputStream fos = new FileOutputStream(tempPath+filename);
   fos.write(input.getBytes());
   fos.close();
  } catch (Exception e) {
   e.printStackTrace();
  }*/
  try {
   FileOutputStream fos = new FileOutputStream(tempPath+filename, true);
   fos.write(input.getBytes());
   fos.close();
  } catch (Exception e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }

 }
  //测试
/* public static void main(String[] args) {
  //createFile("E:\\log", "2014/16/2/", "\\2020.txt", "hahha");
  Date date = new Date();
  SimpleDateFormat formatter = new SimpleDateFormat("yyyy/MM/dd");
  String dateString = formatter.format(date);
  System.out.println(dateString);
 }*/
}

applicationContext.xml

<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"
 xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
 http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
 http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
 http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd">

 <!-- 配置作业类 -->
 <bean id="InspAction"
  class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
  <property name="targetObject">
   <bean class="com.save.action.InspAction" />
  </property>
  <property name="targetMethod" value="execute" />
  <property name="concurrent" value="false" /><!-- 作业不并发调度 -->
 </bean>
 <!-- 配置触发器 -->
 <bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
  <property name="jobDetail" ref="InspAction" />
  <!-- 每天7:00运行一次 -->
  <property name="cronExpression" value="0 0 07 * * ?" />
 </bean>
 <!-- 配置调度工厂 -->
 <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
  <property name="triggers">
   <list>
    <ref bean="cronTrigger" />
   </list>
  </property>
 </bean>

</beans>

config.properties

#测试用服务器
192.168.175.128={"username":"root","password":"123456","shell":"ps -ef|grep mongo\n,df -h\n, free -m\n, top\n","server":"mongod"}
192.168.175.129={"username":"root","password":"123456","shell":"ps -ef|grep redis\n,df -h\n, free -m\n, top\n","server":"mongod"}
log4j.properties
#指定根Logger,及日志输出级别
#大于等于该级别的日志将被输出( DEBUG < INFO < WARN < ERROR < FATAL ),设为OFF可以关闭日志
log4j.rootLogger=INFO, A1,A2
#指定log输出目的,这里设为输出日志到指定目录的文件my.log中
log4j.appender.A1=org.apache.log4j.FileAppender
log4j.appender.A1.File=E:\\save\\log\\xj.log
#指定日志信息的格式
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%r %d{yyyy-MM-dd HH:mm:ss} %c %p -%m%n 

#把A2输出到控制台
log4j.appender.A2=org.apache.log4j.ConsoleAppender
log4j.appender.A2.layout=org.apache.log4j.PatternLayout
log4j.appender.A2.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %c %p -%m%n

pom.xml:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
 <modelVersion>4.0.0</modelVersion>
 <groupId>com.save</groupId>
 <artifactId>save-xj</artifactId>
 <packaging>war</packaging>
 <version>0.0.1-SNAPSHOT</version>
 <name>save-xj Maven Webapp</name>
 <url>http://maven.apache.org</url>
 <dependencies>
  <!-- SSH连接 -->
  <dependency>
   <groupId>com.jcraft</groupId>
   <artifactId>jsch</artifactId>
   <version>0.1.53</version>
  </dependency>
  <!-- json转换 -->
  <dependency>
   <groupId>com.alibaba</groupId>
   <artifactId>fastjson</artifactId>
   <version>1.2.31</version>
  </dependency>
  <!-- Spring的包 -->
  <dependency>
   <groupId>org.springframework</groupId>
   <artifactId>spring-context</artifactId>
   <version>3.1.1.RELEASE</version>
  </dependency>
  <dependency>
   <groupId>org.springframework</groupId>
   <artifactId>spring-context-support</artifactId>
   <version>3.1.1.RELEASE</version>
  </dependency>
  <dependency>
   <groupId>org.springframework</groupId>
   <artifactId>spring-tx</artifactId>
   <version>3.1.1.RELEASE</version>
  </dependency>
  <dependency>
   <groupId>org.springframework</groupId>
   <artifactId>spring-web</artifactId>
   <version>3.0.5.RELEASE</version>
  </dependency>
  <!-- 定时任务 -->
  <dependency>
   <groupId>org.quartz-scheduler</groupId>
   <artifactId>quartz</artifactId>
   <version>1.8.5</version>
  </dependency>
  <!-- 日志的包 -->
  <dependency>
   <groupId>log4j</groupId>
   <artifactId>log4j</artifactId>
   <version>1.2.17</version>
  </dependency>
  <dependency>
   <groupId>org.slf4j</groupId>
   <artifactId>slf4j-log4j12</artifactId>
   <version>1.7.21</version>
  </dependency>
  <!-- 邮件 -->
  <dependency>
   <groupId>com.sun.mail</groupId>
   <artifactId>javax.mail</artifactId>
   <version>1.4.4</version>
  </dependency>
  <dependency>
   <groupId>javax.mail</groupId>
   <artifactId>mail</artifactId>
   <version>1.4</version>
  </dependency>
  <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 -->
  <dependency>
   <groupId>org.apache.commons</groupId>
   <artifactId>commons-lang3</artifactId>
   <version>3.4</version>
  </dependency>

 </dependencies>

 <build>
  <plugins>
   <!-- 配置Tomcat插件 -->
   <plugin>
    <groupId>org.apache.tomcat.maven</groupId>
    <artifactId>tomcat7-maven-plugin</artifactId>
    <version>2.2</version>
    <configuration>
     <port>8080</port>
     <path>/</path>
    </configuration>
   </plugin>
  </plugins>
 </build>
</project>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • java实现轻量型http代理服务器示例

    复制代码 代码如下: package cn.liangjintang.httpproxy; import java.io.BufferedReader;import java.io.ByteArrayInputStream;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.OutputStream;import java.net.ServerS

  • java实现socket从服务器连续获取消息的示例

    服务器端我们用软件模拟,是一个很小巧的软件,下载软件NetAssist:http://xiazai.jb51.net/201403/tools/NetAssist(jb51.net).rar 第二步贴上我们客户端的代码: 复制代码 代码如下: import java.io.DataInputStream; import java.io.IOException;import java.net.Socket; public class Client {      public static fina

  • java实现两台服务器间文件复制的方法

    本文实例讲述了java实现两台服务器间文件复制的方法.分享给大家供大家参考.具体分析如下: 通常我们使用最多的文件复制功能就是同服务器之间的文件复制功能,这里介绍的是在普通文件复制上功能升级,可以实现两台服务器实现文件的复制,下面一起来看看代码. 1.服务器端 复制代码 代码如下: package sterning; import java.io.BufferedInputStream; import java.io.DataInputStream; import java.io.DataOut

  • java判断远程服务器上的文件是否存在的方法

    在做数据文件导入到   LEFTII   中是遇到一个文件,在做导入的时候有时候生成的原始文件可能不存在,现在通过加一个判断,判断文件是否存在,起初以为简单的判断文件   file.exists()   存不存在就行了,但是后来事实证明这个只能判断本地的文件是否存在. 这里我们通过一个巧妙的方法告诉大家,就是把远程的文件共享到本地来,通过电脑的衍射可以轻而易举的解决这个问题 过程如下 然后在下面的步骤输入用户名,密码,这样就可以通过判断本地是否存在这个文件就搞定了.

  • Java获取此次请求URL以及服务器根路径的方法

    本文介绍了Java获取此次请求URL以及获取服务器根路径的方法,并且进行举例说明,感兴趣的朋友可以学习借鉴下文的内容. 一. 获取此次请求的URL String requestUrl = request.getScheme() //当前链接使用的协议 +"://" + request.getServerName()//服务器地址 + ":" + request.getServerPort() //端口号 + request.getContextPath() //应用

  • JAVA技术实现上传下载文件到FTP服务器(完整)

    具体详细介绍请看下文: 在使用文件进行交互数据的应用来说,使用FTP服务器是一个很好的选择.本文使用Apache Jakarta Commons Net(commons-net-3.3.jar) 基于FileZilla Server服务器实现FTP服务器上文件的上传/下载/删除等操作. 关于FileZilla Server服务器的详细搭建配置过程,详情请见 FileZilla Server安装配置教程 .之前有朋友说,上传大文件(几百M以上的文件)到FTP服务器时会重现无法重命名的问题,但本人亲

  • java网络编程之socket网络编程示例(服务器端/客户端)

    Java为TCP协议提供了两个类,分别在客户端编程和服务器端编程中使用它们.在应用程序开始通信之前,需要先创建一个连接,由客户端程序发起:而服务器端的程序需要一直监听着主机的特定端口号,等待客户端的连接.在客户端中我们只需要使用Socket实例,而服务端要同时处理ServerSocket实例和Socket实例;二者并且都使用OutputStream和InpuStream来发送和接收数据. 学习一种知识最好的方式就是使用它,通过前面的笔记,我们已经知道如何获取主机的地址信息,现在我们通过一个简单的

  • java实现服务器文件打包zip并下载的示例(边打包边下载)

    使用该方法,可以即时打包文件,一边打包一边传输,不使用任何的缓存,让用户零等待! 复制代码 代码如下: /** *  * mySocket 客户端 Socket * @param file 待打包的文件夹或文件 * @param fileName 打包下载的文件名 * @throws IOException */ private void down(File file, String fileName) throws IOException { OutputStream outputStream

  • Java中常见的5种WEB服务器介绍

    Web服务器是运行及发布Web应用的容器,只有将开发的Web项目放置到该容器中,才能使网络中的所有用户通过浏览器进行访问.开发Java Web应用所采用的服务器主要是与JSP/Servlet兼容的Web服务器,比较常用的有Tomcat.Resin.JBoss.WebSphere 和 WebLogic 等,下面将分别进行介绍. Tomcat 服务器 目前最为流行的Tomcat服务器是Apache-Jarkarta开源项目中的一个子项目,是一个小型.轻量级的支持JSP和Servlet 技术的Web服

  • Java通过FTP服务器上传下载文件的方法

    对于使用文件进行交换数据的应用来说,使用FTP 服务器是一个很不错的解决方案. 关于FileZilla Server服务器的详细搭建配置过程,详情请见FileZilla Server安装配置教程.之前有朋友说,上传大文件(几百M以上的文件)到FTP服务器时会重现无法重命名的问题,但本人亲测上传2G的文件到FileZilla Server都没有该问题,朋友们可以放心使用该代码. FavFTPUtil.Java package com.favccxx.favsoft.util; import jav

随机推荐