网上流传了好多关于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,如需转载请自行联系原作者