Java程序结合Aapche Ant进行远程服务器文件备份

简介:

 网上流传了好多关于Java调用Ant API的文章,也有使用Ant进行远程服务器文件的下载,本地文件上传到服务器。可惜google了好久也没有找到撇开build文件来进行ant的使用,多半是对ant的扩展,后来想想,如果在Java中不依赖build文件来使用ant,那么不就失去了ant灵活,可配置的效果了吗?!

     但是有时候情非得已,问题使然,还是遇到需要程序自动来控制Build的执行。

     关于Ant的一些介绍和使用参见百度或者http://aiilive.blog.51cto.com/1925756/1346266

    下面的问题是:本地对远程服务器的文件操作。

     Ant为我们提供了SCP任务工具即Secure Copy命令。通过查看Task Dependencise信息可以知道Ant执行SCP要依赖jsch.jar, ant-jsch.jar; 我们所依赖的如ant-*.jar的模式的jar,Ant都提供了。

     关于SCP参见:http://www.vpser.net/manage/scp.html  

     Ant结合使用scp,sshexec任务来完成本地文件上传服务器,本地目录上传服务器,服务器文件下载本地,服务器目录下载本地工作,下面是Build配置。

     

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
<? xml  version = "1.0"  encoding = "UTF-8" ?>
< project  name = "test"  basedir = "."  default = "r2l_download_dir2dir" >
     < property  name = "username"  value = "root" >
     </ property >
     < property  name = "password"  value = "root@123" >
     </ property >
     < property  name = "server.user"  value = "${username}:${password}" >
     </ property >
     < property  name = "server.host"  value = "192.168.88.138" >
     </ property >
     < property  name = "scp:deploy"  value = "${server.user}@${server.host}" >
     </ property >
     < property  name = "server.dir"  value = "/root/Softwares/Tomcat6_linux/Tomcat6/webapps/ROOT/upload/**" >
     </ property >
     < property  name = "server.file"  value = "/root/learning/ftp/ftp.pl" >
     </ property >
     < property  name = "client.file"  value = "ROOT.war" >
     </ property >
     < property  name = "client.dir"  value = "E:\\antTask" >
     </ property >
     < target  name = "init"  description = "创建备份文件目录" >
         < echo  message = "备份远程服务器上的文件"  />
         < mkdir  dir = "${client.dir}"  />
         <!--
         <sshexec host="${server.host}" username="${username}" password="${password}" command="mkdir ${server.dir}" trust="true" />
         -->
     </ target >
     < target  name = "clean"  description = "清理服务器上的文件" >
         < delete  dir = "${client.dir}"  includeemptydirs = "yes"  verbose = "true" >
         </ delete >
         <!--
         <sshexec host="${server.host}" username="${username}" password="${password}" command="rm -rf ${server.dir}" trust="true"/>
         -->
     </ target >
     < target  name = "l2r_upload_file2dir"  description = "本地上传文件到服务器目录"  depends = "init" >
         < echo  message = "本地上传文件到服务器目录"  />
         < scp  localFile = "${client.file}"  remoteTodir = "${scp:deploy}:${server.dir}"  trust = "true" >
         </ scp >
     </ target >
     < target  name = "l2r_upload_dir2dir"  description = "本地上传目录到服务器目录" >
         < echo  message = "本地上传目录到服务器目录"  />
         < scp  localFile = "${client.dir}"  remoteTodir = "${scp:deploy}:${server.dir}"  trust = "true" >
         </ scp >
     </ target >
     < target  name = "r2l_download_file2file"  description = "服务器文件下载到本地目录"  depends = "init" >
         < echo  message = "服务器文件下载到本地目录"  />
         < scp  remoteFile = "${server.user}@${server.host}:${server.file}"  localTofile = "${client.dir}"  trust = "true" >
         </ scp >
     </ target >
     < target  name = "r2l_download_dir2dir"  description = "服务器目录下载到本地目录"  depends = "init" >
         < echo  message = "服务器目录下载到本地目录"  />
         < scp  remoteFile = "${server.user}@${server.host}:${server.dir}"  localTodir = "${client.dir}"  trust = "true" >
         </ scp >
     </ target >
</ project >

     通过sshexec任务来进行远程调用Linux命令,scp任务来进行文件传输。

     如何使Build文件执行可控,方法很多,为了能在程序中控制它的执行这里用Java的任务极致来控制。

     下面是使Build定义执行的Java操作代码:

     

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import  java.io.File;
import  java.util.Timer;
import  java.util.TimerTask;
import  org.apache.tools.ant.DefaultLogger;
import  org.apache.tools.ant.Project;
import  org.apache.tools.ant.helper.ProjectHelper2;
public  class  TestTask {
     public  static  void  main(String[] args) {
         Timer timer =  new  Timer();
         System.out.println(System.currentTimeMillis());
         Schedule schedule =  new  Schedule();
         timer.schedule(schedule,  10000 10000 );
         System.out.println( "..." );
         System.out.println(schedule.scheduledExecutionTime());
     }
}
class  Schedule  extends  TimerTask {
     @Override
     public  void  run() {
         Project p =  new  Project();
         p.init();
         File build =  new  File(System.getProperty( "user.dir" ) + File.separator
                 "deploy.xml" ); //deploy.xml build文件
         ProjectHelper2 ph =  new  ProjectHelper2();
         ph.parse(p, build);
         DefaultLogger dl =  new  DefaultLogger();
         dl.setErrorPrintStream(System.err);
         dl.setOutputPrintStream(System.out);
         dl.setMessageOutputLevel(Project.MSG_VERBOSE);
         p.addBuildListener(dl);
         p.executeTarget(p.getDefaultTarget());
     }
}

   说明:这里使用的Ant版本是1.9,要使用ProjectHelper2类来解析build文件,ProjectHelper类是老版本用来解析build文件的助手类。

     使用Ant的任务完成一些特定的功能,既可以使用Build配置完成,也可以使用Java结合Ant的API来实现一些功能,一个简单的Java操作Ant的Mkdir任务例子:

     

1
2
3
4
5
6
7
8
9
10
public  void  test3() {
         Project p =  new  Project();
         Mkdir mkdir =  new  Mkdir();
         File f =  new  File(System.getProperty( "user.dir" ) + File.separator
                 "mkdir" );
         mkdir.setDir(f);
         mkdir.setProject(p);
         mkdir.execute();
         Assert.assertEquals( true , f.exists());
     }

     最后:关于Java通过Ant来备份远程服务器上的文件,基本流程是编写想要的Ant任务配置信息,Java程序封装Ant执行,定时等控制设定。



本文转自 secondriver 51CTO博客,原文链接:http://blog.51cto.com/aiilive/1346347,如需转载请自行联系原作者

相关文章
|
1月前
|
Java
java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法
java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法
74 9
|
1月前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
76 2
|
17天前
|
Java
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
80 34
|
1月前
|
消息中间件 存储 Java
RocketMQ文件刷盘机制深度解析与Java模拟实现
【11月更文挑战第22天】在现代分布式系统中,消息队列(Message Queue, MQ)作为一种重要的中间件,扮演着连接不同服务、实现异步通信和消息解耦的关键角色。Apache RocketMQ作为一款高性能的分布式消息中间件,广泛应用于实时数据流处理、日志流处理等场景。为了保证消息的可靠性,RocketMQ引入了一种称为“刷盘”的机制,将消息从内存写入到磁盘中,确保消息持久化。本文将从底层原理、业务场景、概念、功能点等方面深入解析RocketMQ的文件刷盘机制,并使用Java模拟实现类似的功能。
42 3
|
1月前
|
Java 测试技术 Maven
Maven clean 提示文件 java.io.IOException
在使用Maven进行项目打包时,遇到了`Failed to delete`错误,尝试手动删除目标文件也失败,提示`java.io.IOException`。经过分析,发现问题是由于`sys-info.log`文件被其他进程占用。解决方法是关闭IDEA和相关Java进程,清理隐藏的Java进程后重新尝试Maven clean操作。最终问题得以解决。总结:遇到此类问题时,可以通过任务管理器清理相关进程或重启电脑来解决。
|
1月前
|
IDE Java 编译器
开发 Java 程序一定要安装 JDK 吗
开发Java程序通常需要安装JDK(Java Development Kit),因为它包含了编译、运行和调试Java程序所需的各种工具和环境。不过,某些集成开发环境(IDE)可能内置了JDK,或可使用在线Java编辑器,无需单独安装。
72 1
|
1月前
|
存储 缓存 安全
在 Java 编程中,创建临时文件用于存储临时数据或进行临时操作非常常见
在 Java 编程中,创建临时文件用于存储临时数据或进行临时操作非常常见。本文介绍了使用 `File.createTempFile` 方法和自定义创建临时文件的两种方式,详细探讨了它们的使用场景和注意事项,包括数据缓存、文件上传下载和日志记录等。强调了清理临时文件、确保文件名唯一性和合理设置文件权限的重要性。
96 2
|
27天前
|
SQL 安全 Java
Java 异常处理:筑牢程序稳定性的 “安全网”
本文深入探讨Java异常处理,涵盖异常的基础分类、处理机制及最佳实践。从`Error`与`Exception`的区分,到`try-catch-finally`和`throws`的运用,再到自定义异常的设计,全面解析如何有效管理程序中的异常情况,提升代码的健壮性和可维护性。通过实例代码,帮助开发者掌握异常处理技巧,确保程序稳定运行。
40 0
|
前端开发 Java Linux
Java服务器宕机解决方法论(上)
Java服务器宕机解决方法论(上)
757 0
Java服务器宕机解决方法论(上)
|
Java 调度
Java服务器宕机解决方法论(下)
Java服务器宕机解决方法论(下)
379 0