<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>修行的武者</title>
    <description></description>
    <link>http://foxgem.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
      <item>
        <title>Grails中的Controller单元测试</title>
        <author>foxgem</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://foxgem.javaeye.com">foxgem</a>&nbsp;
          链接：<a href="http://foxgem.javaeye.com/blog/85641" style="color:red;">http://foxgem.javaeye.com/blog/85641</a>&nbsp;
          发表时间: 2007年06月01日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>对于Controller的单元测试，Grails也提供了很方便的支持，使得书写非常简单，有代码为证：</p>
<div class="code_title">单元测试代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="keyword">class</span><span>&nbsp;CategoryControllerTests&nbsp;</span><span class="keyword">extends</span><span>&nbsp;GroovyTestCase&nbsp;{ &nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">void</span><span>&nbsp;setUp(){ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;test1=&nbsp;</span><span class="keyword">new</span><span>&nbsp;Category(name:&nbsp;</span><span class="string">&quot;Test1&quot;</span><span>,&nbsp;parent:&nbsp;</span><span class="keyword">null</span><span>).save() &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;test2=&nbsp;</span><span class="keyword">new</span><span>&nbsp;Category(name:&nbsp;</span><span class="string">&quot;Test2&quot;</span><span>,&nbsp;parent:&nbsp;</span><span class="keyword">null</span><span>).save() &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;test3=&nbsp;</span><span class="keyword">new</span><span>&nbsp;Category(name:&nbsp;</span><span class="string">&quot;Test3&quot;</span><span>,&nbsp;parent:&nbsp;</span><span class="keyword">null</span><span>).save() &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;test11=&nbsp;</span><span class="keyword">new</span><span>&nbsp;Category(name:&nbsp;</span><span class="string">&quot;Test11&quot;</span><span>,&nbsp;parent:&nbsp;test1).save() &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;test12=&nbsp;</span><span class="keyword">new</span><span>&nbsp;Category(name:&nbsp;</span><span class="string">&quot;Test12&quot;</span><span>,&nbsp;parent:&nbsp;test1).save() &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;test21=&nbsp;</span><span class="keyword">new</span><span>&nbsp;Category(name:&nbsp;</span><span class="string">&quot;Test21&quot;</span><span>,&nbsp;parent:&nbsp;test2).save() &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">void</span><span>&nbsp;testListRoot()&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;controller=&nbsp;</span><span class="keyword">new</span><span>&nbsp;CategoryController()</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //categoryList对应返回的model&nbsp;&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;categoryList=&nbsp;controller.list()?.categoryList &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;assertEquals&nbsp;</span><span class="number">3</span><span>,&nbsp;categoryList.size() &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;assertEquals&nbsp;'Test1',&nbsp;categoryList[</span><span class="number">0</span><span>].name &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;assertEquals&nbsp;'Test2',&nbsp;categoryList[</span><span class="number">1</span><span>].name &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;assertEquals&nbsp;'Test3',&nbsp;categoryList[</span><span class="number">2</span><span>].name &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">void</span><span>&nbsp;testListTest1(){ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;controller=&nbsp;</span><span class="keyword">new</span><span>&nbsp;CategoryController()</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //其中的params表示的是requestparameter，后面的id是传入的参数。</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //对于session之类以此类推。&nbsp;&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;controller.params.id=&nbsp;</span><span class="number">1</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;categoryList=&nbsp;controller.list()?.categoryList &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;assertEquals&nbsp;</span><span class="number">2</span><span>,&nbsp;categoryList.size() &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;assertEquals&nbsp;'Test11',&nbsp;categoryList[</span><span class="number">0</span><span>].name &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;assertEquals&nbsp;'Test12',&nbsp;categoryList[</span><span class="number">1</span><span>].name &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class=""><span>} &nbsp;&nbsp;</span> </li>
</ol>
</div>
<p><font face="Arial"></font></p>
<div class="code_title">Controller部分代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="keyword">class</span><span>&nbsp;CategoryController&nbsp;{ &nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;index&nbsp;=&nbsp;{&nbsp;redirect(action:list,params:params)&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;allowedMethods&nbsp;=&nbsp;[save:'POST'] &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;list&nbsp;=&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(!params.id){ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;[&nbsp;categoryList:&nbsp;Category.findAllByParentIsNull()&nbsp;] &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><span class="keyword">else</span><span>{ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;category=&nbsp;Category.get(params.id) &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(category){ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;[&nbsp;categoryList:&nbsp;Category.findAll(</span><span class="string">&quot;from&nbsp;Category&nbsp;c&nbsp;where&nbsp;c.parent.id=$params.id&quot;</span><span>)</span><span>,&nbsp;path:&nbsp;category.getPath()] &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><span class="keyword">else</span><span>{ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;flash.message&nbsp;=&nbsp;</span><span class="string">&quot;Category&nbsp;not&nbsp;found&nbsp;with&nbsp;id&nbsp;${params.id}&quot;</span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;redirect(action:list) &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}</span> </li>
    <li class=""><span>......</span> </li>
    <li class=""><span>}&nbsp;&nbsp;</span> </li>
</ol>
</div>
<p><font face="Arial">以上的代码基本上向开发者隐藏了背后的Mock机制，使用起来也更加简单方便。对于如此简单就能完成Controller的测试，我们没有理由不把TDD进行到底。</font></p>
          <br/>
          <span style="color:red;">
            <a href="http://foxgem.javaeye.com/blog/85641#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 01 Jun 2007 12:39:00 +0800</pubDate>
        <link>http://foxgem.javaeye.com/blog/85641</link>
        <guid>http://foxgem.javaeye.com/blog/85641</guid>
      </item>
      <item>
        <title>SWF is not business flow!</title>
        <author>foxgem</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://foxgem.javaeye.com">foxgem</a>&nbsp;
          链接：<a href="http://foxgem.javaeye.com/blog/41816" style="color:red;">http://foxgem.javaeye.com/blog/41816</a>&nbsp;
          发表时间: 2006年12月31日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          &nbsp;
<p class="MsoNormal"><span lang="EN-US"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>SWF</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">捕捉的是界面流程，注意界面流程与业务流程的区别：</span></p>
<p class="MsoNormal" style="MARGIN-LEFT: 42pt; TEXT-INDENT: -21pt; LINE-HEIGHT: 150%; mso-list: l0 level1 lfo1; tab-stops: list 42.0pt"><span lang="EN-US" style="FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings"><span style="mso-list: Ignore">l<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">工作流技术关注于业务过程的捕捉、组织、复用；</span><span lang="EN-US">SWF</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">则关注于界面流程。二者虽然类似，但不等价：有的业务过程就不需要界面支持，如自动提醒流程；同样，有的界面流程就不是业务流程，如窗体的提交处理流程。而且业务流程往往涉及<strong style="mso-bidi-font-weight: normal">多人</strong>的协同工作，界面流程则指<strong style="mso-bidi-font-weight: normal">一个人</strong>进行操作时的界面转换过程。</span></p>
<p class="MsoNormal" style="MARGIN-LEFT: 42pt; TEXT-INDENT: -21pt; LINE-HEIGHT: 150%; mso-list: l0 level1 lfo1; tab-stops: list 42.0pt"><span lang="EN-US" style="FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings"><span style="mso-list: Ignore">l<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">工作流与</span><span lang="EN-US">SWF</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">关注对象的不同，带来了描述语法上的差异。如</span><span lang="EN-US">SWF</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的描述语法中就缺少一般工作流中都有的并行任务、任务角色等相关元素。</span></p>
<p class="MsoNormal" style="MARGIN-LEFT: 42pt; TEXT-INDENT: -21pt; LINE-HEIGHT: 150%; mso-list: l0 level1 lfo1; tab-stops: list 42.0pt"><span lang="EN-US" style="FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings"><span style="mso-list: Ignore">l<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">工作流技术的研究对象是业务流程，它属于业务层的技术；</span><span lang="EN-US">SWF</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">则是界面流程，属于表现层的范畴。</span></p>
<p class="MsoNormal" style="MARGIN-LEFT: 21pt"><strong style="mso-bidi-font-weight: normal"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">警告：不要将业务逻辑包含到界面流程之中。</span><span lang="EN-US"><o:p></o:p></span></strong></p>
          <br/>
          <span style="color:red;">
            <a href="http://foxgem.javaeye.com/blog/41816#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 31 Dec 2006 10:32:00 +0800</pubDate>
        <link>http://foxgem.javaeye.com/blog/41816</link>
        <guid>http://foxgem.javaeye.com/blog/41816</guid>
      </item>
      <item>
        <title>Maven2 + Subversion + CruiseControl搭建持续集成环境</title>
        <author>foxgem</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://foxgem.javaeye.com">foxgem</a>&nbsp;
          链接：<a href="http://foxgem.javaeye.com/blog/24620" style="color:red;">http://foxgem.javaeye.com/blog/24620</a>&nbsp;
          发表时间: 2006年09月19日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          1.创建Maven2项目，并import到Subversion Repository。<br />2.下载CruiseControl，版本2.5。<br />3.创建CruiseControl的工作目录，结构如下：<br /><pre name="code" class="java">ccworkplace\
      \logs
        \project_name
      \checkout
         \project_name
      \artifacts
         \project_name</pre> <br /><br /><span style="color: blue">注：CruiseControl支持构建多个项目，每个项目涉及：logs、checkout、artifacts。它们的作用分别是：记录build结果、checkout代码的工作目录、部件发布地。这个结构就是为了这三个目的而创建的，每一级下的project_name都是对应的。</span><br />4.修改%CruiseControl_Home%/ webapps/cruisecontrol/WEB-INF/web.xml：<br />- 查找：context-param logDir；修改它的值：…/ccworkplace/logs<br />- 查找：ArtifactServlet的init-param rootDir；修改它的值：…/ccworkplace/artifacts<br />5. 修改%CruiseControl_Home%/config.xml，内容：<br /><pre name="code" class="java">&lt;cruisecontrol>
    &lt;property name="cruisedir" value="…/ccworkplace"/>
    &lt;property name="logdir" value="${cruisedir}/logs"/>
    &lt;property name="checkoutdir" value="${cruisedir}/checkout"/>
    &lt;property name="artifactdir" value="${cruisedir}/artifacts"/>
 
    &lt;project name="codelinecomponents">
        &lt;listeners>
            &lt;currentbuildstatuslistener file="${logdir}/${project.name}/status.txt"/>
        &lt;/listeners>
        &lt;bootstrappers>
            &lt;svnbootstrapper localWorkingCopy="${checkoutdir}/${project.name}" />
        &lt;/bootstrappers>
        &lt;modificationset quietperiod="30">
            &lt;svn localWorkingCopy="${checkoutdir}/${project.name}"/>
        &lt;/modificationset>
        &lt;schedule interval="300">
            &lt;maven2 mvnscript="%M2_Home%/bin/mvn.bat"
                    pomfile="${checkoutdir}/${project.name}/pom.xml"
                    goal="clean site package"/>
        &lt;/schedule>
        &lt;log dir="${logdir}/${project.name}">
            &lt;merge dir="${checkoutdir}/${project.name}/target/surefire-reports"/>
        &lt;/log>
        &lt;publishers>
            &lt;onsuccess>
                &lt;artifactspublisher dest="${artifactdir}/${project.name}" 
                            file="${checkoutdir}/${project.name}/target/${project.name}.jar"/>
            &lt;/onsuccess>
        &lt;/publishers>
    &lt;/project>
&lt;/cruisecontrol> </pre><br />6.运行%CruiseControl_Home%/cruisecontrol.bat，因为cruisecontrol.bat已经自带了jetty，之后进入：http://localhost:8080/即可。
          <br/>
          <span style="color:red;">
            <a href="http://foxgem.javaeye.com/blog/24620#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 19 Sep 2006 14:34:03 +0800</pubDate>
        <link>http://foxgem.javaeye.com/blog/24620</link>
        <guid>http://foxgem.javaeye.com/blog/24620</guid>
      </item>
  </channel>
</rss>