一、背景

笔者用 Hexo 搭建此博客系统,搭建过程非常方便。但是,有个麻烦的操作就是每次发布文章都需要重新 clean 和 generate。由于笔者使用的是云服务器,使用 Tomcat 运行博客系统,因此每次还得需要挑选新博文相关的文件远程上传到服务器上。为此,笔者通过 ant 实现自动部署项目。

二、编码

2.1 搭建环境

  1. 安装 jdk 和 ant,并配置环境变量。

  2. 下载 catalina-ant.jar,并将其添加到 CLASSPATH 中。如下图:

  1. 配置远程 Tomcat 连接的账号和密码。读者可以参考 《Maven 插件实现 Tomcat 热部署》 文章中的第二节内容设置 Tomcat。

2.2 目录结构

|--deploy_demo

|----public

|------web.xml

|----build.xml

其中,deploy_demo 为博客相关文件所在的目录,public 为 Hexo 模板生成的的博文源码文件夹, build.xml 为 ant 编译文件,其他文件/文件夹不一一描述。我们需要将 public 文件夹中的所有文件都部署到远程服务器的 Tomcat 中。

需要注意的是,我们需要手动将 web.xml 文件添加到 public 文件夹中,否则在执行 ant 后,会返回 build failed 的错误。因为 ant 将文件夹打包成 war 时会检测 web.xml 文件

2.3 实现步骤

  1. 将远程 tomcat 容器中的项目删除

  2. 将 public 文件夹打包成 war 文件

  3. 将 war 文件传输到远程 tomcat 容器中

这些步骤都在 build.xml 文件进行配置,内容如下:

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
<?xml version="1.0" encoding="UTF-8"?>
<project name="deployBlog" default="redeploy" basedir=".">

<property name="dist.dir" value="${basedir}" />
<property name="url" value="http://192.168.2.25:8080/manager/text" />
<property name="username" value="tomcat" />
<property name="password" value="tomcat" />
<property name="path" value="/ROOT" />


<target name="_def_tomcat_tasks">
<taskdef name="deploy" classname="org.apache.catalina.ant.DeployTask" />
<taskdef name="list" classname="org.apache.catalina.ant.ListTask" />
<taskdef name="reload" classname="org.apache.catalina.ant.ReloadTask" />
<taskdef name="resources" classname="org.apache.catalina.ant.ResourcesTask" />
<taskdef name="roles" classname="org.apache.catalina.ant.RolesTask" />
<taskdef name="start" classname="org.apache.catalina.ant.StartTask" />
<taskdef name="stop" classname="org.apache.catalina.ant.StopTask" />
<taskdef name="undeploy" classname="org.apache.catalina.ant.UndeployTask" />
</target>

<target name="war" description="WebSip manage">
<war destfile="${dist.dir}/ROOT.war" webxml="${dist.dir}/public/web.xml" >
<fileset dir="${dist.dir}/public"/>
</war>
</target>

<target name="redeploy" description="Remove and Install web application" depends="_def_tomcat_tasks">
<antcall target="undeploy" />
<antcall target="deploy" />
</target>

<target name="deploy" description="Install web application" depends="_def_tomcat_tasks,war">
<deploy url="${url}" username="${username}" password="${password}" path="${path}" war="${dist.dir}/ROOT.war" />
</target>

<target name="undeploy" description="Remove web application" depends="_def_tomcat_tasks">
<undeploy url="${url}" username="${username}" password="${password}" path="${path}" />
</target>

<target name="reload" description="Reload web application" depends="_def_tomcat_tasks,war">
<reload url="${url}" username="${username}" password="${password}" path="${path}" />
</target>
</project>

如果读者想使用上边的配置,只需按照目录结构放置文件和修改远程服务器相关配置即可。

三、部署

全部就绪后,只需在当前目录中打开命令行键入: ant 即可。

编译结果如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
E:\demo\ant\deploy_demo>ant
Buildfile: E:\demo\ant\deploy_demo\build.xml

_def_tomcat_tasks:
Trying to override old definition of datatype resources

redeploy:

_def_tomcat_tasks:

undeploy:
[undeploy] OK - Undeployed application at context path /

_def_tomcat_tasks:

war:
[war] Building war: E:\demo\ant\deploy_demo\ROOT.war

deploy:
[deploy] OK - Deployed application at context path /

BUILD SUCCESSFUL
Total time: 2 seconds

就这样,项目被打包部署到远程服务器上了。

我们还可以编写脚本将所有步骤一起执行,以下是笔者编写的 bat 脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@echo off

echo =================开始操作=================

E:

cd \demo\ant\deploy_demo

call hexo clean

call hexo g

call gulp

call ant -f E:\demo\ant\deploy_demo\build.xml

echo =================执行完毕=================

pause

脚本中执行的命令根据自己的要求而定。

将这个脚本保存为任意名(如:upload.bat),并在环境变量中设置其所在目录。这样,我们在任意目录打开 CMD 执行 upload.bat 都可以实现项目的自动化部署。

四、参考资料