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,如需转载请自行联系原作者

相关文章
|
14天前
|
Java Apache 开发工具
【Azure 事件中心】 org.slf4j.Logger 收集 Event Hub SDK(Java) 输出日志并以文件形式保存
【Azure 事件中心】 org.slf4j.Logger 收集 Event Hub SDK(Java) 输出日志并以文件形式保存
|
3天前
|
Arthas Java 测试技术
Java字节码文件、组成,jclasslib插件、阿里arthas工具,Java注解
Java字节码文件、组成、详解、分析;常用工具,jclasslib插件、阿里arthas工具;如何定位线上问题;Java注解
Java字节码文件、组成,jclasslib插件、阿里arthas工具,Java注解
|
10天前
|
Linux
Linux 服务器下载百度网盘文件
本教程指导如何使用 `bypy` 库从百度网盘下载文件。首先通过 `pip install bypy` 安装库,接着运行 `bypy info` 获取登录链接并完成授权,最后将文件置于指定目录并通过 `bypy downdir /Ziya-13b-v1` 命令下载至本地。
17 1
Linux 服务器下载百度网盘文件
|
1天前
|
Java API 开发者
【Java字节码操控新篇章】JDK 22类文件API预览:解锁Java底层的无限可能!
【9月更文挑战第6天】JDK 22的类文件API为Java开发者们打开了一扇通往Java底层世界的大门。通过这个API,我们可以更加深入地理解Java程序的工作原理,实现更加灵活和强大的功能。虽然目前它还处于预览版阶段,但我们已经可以预见其在未来Java开发中的重要地位。让我们共同期待Java字节码操控新篇章的到来!
|
5天前
|
缓存 监控 安全
如何提高 Java 高并发程序的性能?
以下是提升Java高并发程序性能的方法:优化线程池设置,减少锁竞争,使用读写锁和无锁数据结构。利用缓存减少重复计算和数据库查询,并优化数据库操作,采用连接池和分库分表策略。应用异步处理,选择合适的数据结构如`ConcurrentHashMap`。复用对象和资源,使用工具监控性能并定期审查代码,遵循良好编程规范。
|
12天前
|
Java 应用服务中间件 HSF
Java应用结构规范问题之配置Logback以仅记录错误级别的日志到一个滚动文件中的问题如何解决
Java应用结构规范问题之配置Logback以仅记录错误级别的日志到一个滚动文件中的问题如何解决
|
9天前
|
缓存 安全 Java
Java服务器端技术:Servlet与JSP的集成与扩展
Java服务器端技术:Servlet与JSP的集成与扩展
11 3
|
12天前
|
Java 程序员
Java系统中的错误码设计问题之实现一个基于properties文件的错误消息管理系统如何解决
Java系统中的错误码设计问题之实现一个基于properties文件的错误消息管理系统如何解决
11 1
|
8天前
|
Java
java判断文件内容不为空
请注意,在实际的生产环境中,处理文件时需要考虑异常处理。在上述代码中,如果在文件读取过程中发生 `IOException`,则会被捕获,并在控制台打印堆栈跟踪信息。在更复杂的系统中,可能还需要更精细的异常处理策略。
19 0
|
9天前
|
前端开发 安全 Java
在Java服务器端开发的浩瀚宇宙中,Servlet与JSP犹如两颗璀璨的明星,它们联袂登场,共同编织出动态网站的绚丽篇章。
在Java服务器端开发的浩瀚宇宙中,Servlet与JSP犹如两颗璀璨的明星,它们联袂登场,共同编织出动态网站的绚丽篇章。
9 0
下一篇
DDNS