您的位置:首页 > 运维架构 > Tomcat

ANT发布SVN WEB项目到TOMCAT以及利用post-commit自动提交编译更新

2014-07-21 22:56 841 查看
开发人员在本地提交更新到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
|-- webpage_files
|++ webpage_folder
|-- webpage_files
|++ javascript_folder
|-- javascript_files
|++ css_folder
|-- css_files
|++ META-INF
|-- MAINFEST.INF
|++ WEB-INF
|++ classes
|-- class_files
|++ lib
|-- jar_lib_files
|-- web.xml

静态页面(*.html,*.js and*.jsp等)文件或文件夹放在WEB根目录(prjname/WebContent)下;编译后的类文件放在prjname/WebContent/WEB-INF/classes文件夹下;项目配置文件例如db.properites和web.xml等放在prjname/WebContent/WEB-INF/目录下,tomcat加载WEB项目时,会读入并分析这些配置文件,初始化一些运行配置。WEB-INF/文件夹下的资源和文件时不能被客户端通过URL访问;项目所用的库文件放在prjname/WebContent/WEB-INF/lib文件夹下,但注意这里的库文件不能和TOMCAT自带的库文件重复,否则,在生成库中的类的类对象时,会出现类定义冲突。TOMCAT按照上述文件结构解析WEB项目。事实上,将WEB项目打包成WAR文件发布时,也必须安装上述结构组织源文件,而TOMCAT解压WAR文件后形成的WEB项目,和这里手动发布的WEB项目应是一样的。
需要注意到是,利用svn checkout构建WEB项目,一般只适用于构建测试环境的情况。实际发布为产品时,应使用svn export导出不含更新配置文件的干净版本后,最好打包成WAR文件发布。

(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服务器后才能反映到业务逻辑中。


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息