开发人员在本地提交更新到 SVN 服务器后,往往需要测试人员重新测试。为了将更新内容即时反映到测试服务器,可以利用 post-commit 脚本将 SVN 更新同步到测试服务器中。
( 1 )利用 SVN 的工作副本( WORKINGCOPY )创建 TOMCATWEB 项目
cd /opt/tomcat_home/webapps
svn co svn://svn_host/prjname/trunk prjname
修改 tomcat 的配置文件 server.xml ,在 HOST 标签中添加如下内容
<Context crossContext="false" path="/prjname" docBase="prjname/WebContent/" reloadable="true"></Context>
在上述配置文件中,
path 指明的是通过浏览器访问该项目网页时在服务器 IP 及访问 PORT 后的路径。例如通过本地服务器访问该网页时的访问 URL 应为 http://localhost:8080/prjname 。如果指明 path=”” ,则表明访问 http://localhost:8080/ 时自动引导到 docBase指定的项目。
docBase 指明 WEB 项目的相对路径或绝对路径。例如上述例示中指明相对路径为HOST 标签所指定的 appBase 下 prjname/WebContent 文件夹。需要注意的是文件夹的名字可以为任何有效目录名,但 tomcat 的 WEB 项目必须遵照特定的目录结构存放。
- web_home - index.html - webpages ... + webpage_folder ++ webpages ... + javascript_folder ++ ....js + META-INF ++ MAINFEST.INF + WEB-INF ++ classes ++ lib ---- web.xml
静态页面 (*.html,*.js and*.jsp 等 ) 文件或文件夹放在 WEB 根目录( prjname/WebContent )下,编译后的类文件放在 prjname/WebContent/WEB-INF/classes 文件夹下。项目所用的库文件和配置文件 web.xml 也放在 prjname/WebContent/WEB-INF/classes 文件夹下。 TOMCAT 按照上述文件结构解析 WEB 项目。事实上,将 WEB 项目打包成 WAR 文件发布时,也必须安装上述结构组织源文件,而 TOMCAT 解压 WAR 文件后形成的 WEB 项目,和这里手动发布的 WEB 项目应是一样的。
( 2 )编写 ANT
编译文件
<?xml version="1.0" encoding="UTF-8"?> <!-- default 指定ANT无参数运行时的target --> <project name="prjname" default="compile" basedir="."> <!-- value指定目标项目根目录,"."则表示prjname.home为本build.xml所在目录。 以标准eclipse WEB项目为例,本例build.xml应位于项目根文件夹prjname下 --> <property name="prjname.home" value="."/> <property name="prjname.name" value="prjname"/> <property name="tomcat.home" value="/opt/tomcat7"/> <!-- home of web pages --> <!-- WEB 根目录 --> <property name="web.home" value="${prjname.home}/WebContent"/> <!-- home of java source files --> <!-- 待编译的源文件目录,eclipse标准WEB项目位于项目根目录下 --> <property name="src.home" value="${prjname.home}/src"/> <!-- home of class files after compile --> <!-- 编译后的CLASS文件,按照WEB项目特定文件组织结构放置 --> <property name="classes.home" value="${web.home}/WEB-INF/classes"/> <!-- home of lib for build --> <property name="lib.home" value="${web.home}/WEB-INF/lib"/> <property name="work.home" value="${tomcat.home}/work/Catalina/localhost"/> <path id="compile.classpath"> <pathelement location="${classes.home}"/> <fileset dir="${lib.home}"> <include name="*.jar"/> </fileset> <fileset dir="${tomcat.home}/lib"> <include name="*.jar"/> </fileset> <pathelement location="${tomcat.home}/common/classes"/> </path> <target name="help"> <echo message="Please specify a target! [usage:ant targetname]"/> <echo message="Here is a list of possible targets:"/> <echo message=" perpare....Creates directories if required"/> <echo message=" compile....Compiles source files"/> </target> <target name="prepare" > <tstamp/> <echo message="Ant vereion: ${ant.version}"/> <echo message="JDK version: ${java.runtime.version}"/> <echo message="Tomcat Home=${tomcat.home}"/> <echo message="Webapps Home=${webapps.home}"/> <echo message="classes Home=${classes.home}"/> <echo message="Java src Home=${src.home}"/> <!-- mkdir do nothing is the directory already exists. --> <mkdir dir="${lib.home}"/> <mkdir dir="${classes.home}"/> </target> <target name="compile" depends="prepare"> <javac srcdir="${src.home}" destdir="${classes.home}" includeantruntime="on" debug="true"> <compilerarg line="-encoding UTF-8"/> <classpath refid="compile.classpath"/> </javac> </target> </project>
将该 ANT 编译文件放在第 1 步从 SVN 导入 TOMCAT 的 WEB 项目根目录下,并执行
ant compile
后,即完成了 WEB 项目的发布工作。检查 WEB 根目录下的 WEB-INF/classes 文件夹,会发现 ANT 已经编译了 JAVA 源文件,生成了相应的 CLASS 文件。正常启动WEB 相关服务器后,即可使用 WEB 服务了。
( 3 ) post-commit 自动提交更新和 ANT 编译更新
post-commit 位于 SVN 项目目录下的子文件夹 hooks 中。使用 svnadmin 创建 SVN项目时,将自动创建前述的 hooks 文件夹并生成例示的 post-commit.tmpl 等文件。复制 post-commit.tmpl 并改名为 post-commit 后编辑该文件如下。 另外 利用 SVN 的 钩子 ( pre-commit ) 还可以写出很多的程序来控制 SVN 如代 码提交前查看是否有写日志, 是否有 tab , 有 将换成空格 , 是否有不允 许上传的文件 , 是否有超 过限制大小的文件等等。
REPOS="$1" REV="$2" SVNLOOK=/usr/bin/svnlook DES=/opt/tomcat7/webapps/prjname SVNUSER=svn_user SVNPW=svn_pw # FILTER判断更新文件的类别,如果是*.html, *.js或*.jsp文件,则无须启用ANT重新编译 # 实际这样做的用处并不大,ANT自动对比文件的编译日期和最后改动日期,判断是否需要重新编译 FILTER='\.(html|htm|js|jsp)$' export LANG=en_US.UTF-8 svn update $DES --username $SVNUSER --password $SVNPW changes=$($SVNLOOK changed $REPOS | awk '{print $1 "=" $2;}') for file in $changes do #写入提交日志 DATE=`date '+%Y-%m-%d %H:%M:%S'` AUTHOR="$($SVNLOOK author -r $REV $REPOS)" echo $DATE $file "committed by '$AUTHOR'" >> ./log.txt # check file type if echo $file | grep -Eq $FILTER; then continue else echo $DATE "compile" >> ./commit_log.txt ant compile -buildfile ${DES}/build.xml break fi done
保存后需要给该文件增加可执行权限。
chmod +x post-commit
在开发人员执行
commit
操作之后,
SVN
服务器会自动执行
post-commit
钩子程序。先更新
TOMCAT
中的工作副本,然后编译需要编译的文件。这样以来,
*.html,*.js
或
*.jsp
等文件的更新操作,即可在刷新相应的
WEB
页面之后即时反映,而
*.java
文件的更新则可能需要重新
TOMCAT
服务器后才能反映到业务逻辑中。