﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-BaoYaEr-文章分类-其它</title><link>http://www.blogjava.net/baoyaer/category/17629.html</link><description>java</description><language>zh-cn</language><lastBuildDate>Thu, 17 May 2012 01:20:58 GMT</lastBuildDate><pubDate>Thu, 17 May 2012 01:20:58 GMT</pubDate><ttl>60</ttl><item><title>maven 的配置收藏</title><link>http://www.blogjava.net/baoyaer/articles/378325.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Wed, 16 May 2012 08:54:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/378325.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/378325.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/378325.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/378325.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/378325.html</trackback:ping><description><![CDATA[<div>http://yingzhuo.iteye.com/blog/1007839</div><img src ="http://www.blogjava.net/baoyaer/aggbug/378325.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2012-05-16 16:54 <a href="http://www.blogjava.net/baoyaer/articles/378325.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Maven仓库管理-Nexus</title><link>http://www.blogjava.net/baoyaer/articles/355040.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Tue, 26 Jul 2011 03:22:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/355040.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/355040.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/355040.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/355040.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/355040.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: @import url(http://www.blogjava.net/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);@import url(http://www.blogjava.net/CuteSoft_Client/C...&nbsp;&nbsp;<a href='http://www.blogjava.net/baoyaer/articles/355040.html'>阅读全文</a><img src ="http://www.blogjava.net/baoyaer/aggbug/355040.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2011-07-26 11:22 <a href="http://www.blogjava.net/baoyaer/articles/355040.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>XPath语法</title><link>http://www.blogjava.net/baoyaer/articles/354820.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Thu, 21 Jul 2011 13:22:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/354820.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/354820.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/354820.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/354820.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/354820.html</trackback:ping><description><![CDATA[<h2>XML示例文档</h2>
<p>我们将使用如下的简单XML文档描述XPath语法：<br />
<br />
<br />
</p>
<div style="background-color: #eeeeee; font-size: 13px; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000; "><br />
<span style="color: #0000FF; ">&lt;?</span><span style="color: #FF00FF; ">xml&nbsp;version="1.0"&nbsp;encoding="ISO-8859-1"</span><span style="color: #0000FF; ">?&gt;</span><span style="color: #000000; "><br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">catalog</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">cd&nbsp;</span><span style="color: #FF0000; ">country</span><span style="color: #0000FF; ">="USA"</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">title</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">Empire&nbsp;Burlesque</span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">title</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">artist</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">Bob&nbsp;Dylan</span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">artist</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">price</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">10.90</span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">price</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">cd</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">cd&nbsp;</span><span style="color: #FF0000; ">country</span><span style="color: #0000FF; ">="UK"</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">title</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">Hide&nbsp;your&nbsp;heart</span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">title</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">artist</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">Bonnie&nbsp;Tyler</span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">artist</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">price</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">9.90</span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">price</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">cd</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">cd&nbsp;</span><span style="color: #FF0000; ">country</span><span style="color: #0000FF; ">="USA"</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">title</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">Greatest&nbsp;Hits</span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">title</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">artist</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">Dolly&nbsp;Parton</span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">artist</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">price</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">9.90</span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">price</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">cd</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; "><br />
&nbsp;&nbsp;</span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">catalog</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; "><br />
</span></div>
<br />
<span  style="font-size: 21px; font-weight: bold; ">定位节点</span><br />
<p>XML文档可以看作是一个节点树（非常类似于计算机的树形文件夹）。</p>
<p>XPath使用模式表达式识别XML文档里的节点。一个XPath模式是一个以斜线分隔的子元素名列表，用于描述XML文档的一个路径。模式选择匹配该路径的元素。</p>
<p>
<p>下面的XPath表达式选择catalog元素的所有cd元素的所有price元素：</p>
<table cellspacing="0" width="100%" border="1">
    <tbody>
        <tr>
            <td>
            <p>/catalog/cd/price &nbsp; &nbsp; &nbsp;//如果路径以一个斜线（/）开始，代表相对于一个元素的绝对路径</p>
            </td>
        </tr>
    </tbody>
</table>
<p><strong><br />
</strong></p>
<strong>注意：</strong>&nbsp;如果路径以两个斜线开始，表示选择文档中所有符合该条件的元素（即使它们在不同的XML树的级别）！下面的XPath表达式选择catalog元素的所有cd元素的所有price元素：<br />
<div style="background-color: #eeeeee; font-size: 13px; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000; ">//cd &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //<span  style="font-size: 14px; ">&nbsp;如果路径以两个斜线开始，表示选择文档中所有符合该条件的元素（即使它们在不同的XML树的级别）！下面的XPath表达式选择catalog元素的所有cd元素的所有price元素：</span></div>
<br />
<br />
<h2>选择未知元素</h2>
<p>通配符（*）用来选择未知XML元素。</p>
<p>
<div style="background-color: #eeeeee; font-size: 13px; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000; ">/catalog/cd/* &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;//<span  style="font-size: 14px; ">XPath表达式选择catalog元素下所有cd元素的所有子元素</span></div>
</p>
</span><br />
<div style="background-color: #eeeeee; font-size: 13px; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000; ">/catalog/*/price &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //</span><span  style="font-size: 14px; ">XPath表达式选择catalog元素的孙子元素下所有的price元素</span></div>
</p>
</span><br />
<div style="background-color: #eeeeee; font-size: 13px; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000; ">/*/*/price &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //<span  style="font-size: 14px; ">XPath表达式选择有两个祖先的所有price元素</span></span></div>
<br />
<div style="background-color: #eeeeee; font-size: 13px; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000; ">//* &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //</span><span  style="font-size: 14px; ">XPath表达式选择文档中所有元素</span></div>
<br />
<br />
<h2>选择分支</h2>
<p>通过在XPath表达式中使用方括号可以进一步地指定一个元素。<br />
<br />
<div style="background-color: #eeeeee; font-size: 13px; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000; "><br />
/catalog/cd[1] &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;//<span  style="font-size: 14px; ">XPath表达式选择catalog元素的第一个cd子元素</span></div>
<br />
</p>
<p>
<div style="background-color: #eeeeee; font-size: 13px; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000; ">/catalog/cd[last()] &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;//</span><span  style="font-size: 14px; ">XPath表达式选择catalog元素的最后一个子元素</span></div>
</p>
</span><br />
<div style="background-color: #eeeeee; font-size: 13px; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000; ">/catalog/cd[price] &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;//</span><span  style="font-size: 14px; ">XPath表达式选择catalog元素下含有price子元素的所有cd元素</span></div>
<br />
<div style="background-color: #eeeeee; font-size: 13px; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000; ">/catalog/cd[price=10.90] &nbsp; &nbsp; &nbsp; &nbsp; //</span><span  style="font-size: 14px; ">XPath表达式选择catalog元素下子元素price值等于10.90的所有cd元素</span></div>
<br />
<div style="background-color: #eeeeee; font-size: 13px; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000; ">/catalog/cd[price=10.90]/price &nbsp; //</span><span  style="font-size: 14px; ">XPath表达式选择catalog元素下price元素值等于10.90的所有cd元素的price元素</span></div>
<br />
<br />
<br />
<h2>选择多个路径</h2>
<p>通过在XPath表达式中使用|操作符，可以选择多个路径。</p>
<p>下面的XPath表达式选择catalog元素的子元素cd元素下所有的title和artist元素：<br />
<div style="background-color: #eeeeee; font-size: 13px; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000; ">/catalog/cd/title&nbsp;|&nbsp;/catalog/cd/artist &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;//<span  style="font-size: 14px; ">XPath表达式选择catalog元素的子元素cd元素下所有的title和artist元素</span></div>
</p>
</span><br />
<div style="background-color: #eeeeee; font-size: 13px; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><span style="color: #000000; ">//title&nbsp;|&nbsp;//artist &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //</span><span  style="font-size: 14px; ">XPath表达式选择文档中所有title元素和artist元素：</span></div>
<br />
<br />
<h2>选择属性</h2>
<p>在XPath中，所有属性以前缀@指定。</p>
<p>下面的XPath表达式选择所有名为country的属性：<br />
<div style="background-color: #eeeeee; font-size: 13px; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000; ">//@country &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //<span  style="font-size: 14px; ">XPath表达式选择所有名为country的属性</span></div>
</p>
</span><br />
<div style="font-size: 13px; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; background-color: #eeeeee; "><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000; ">//cd[@country] &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //</span><span  style="font-size: 14px; ">XPath表达式选择所有含有country属性的cd元素：</span></div>
<br />
<div style="background-color: #eeeeee; font-size: 13px; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000; ">//cd[@*] &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //</span><span  style="font-size: 14px; ">XPath表达式选择选择所有含有任何属性的cd元素</span></div>
<br />
<div style="background-color: #eeeeee; font-size: 13px; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000; ">//cd[@country='UK'] &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //</span><span  style="font-size: 14px; ">XPath表达式选择属性country等于UK的所有cd元素</span></div>
<br />
<br />
<br />
<br />
<br />
<br />
<p>&nbsp;</p>
</span>
@import url(http://www.blogjava.net/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);<img src ="http://www.blogjava.net/baoyaer/aggbug/354820.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2011-07-21 21:22 <a href="http://www.blogjava.net/baoyaer/articles/354820.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SVN版本库的迁移</title><link>http://www.blogjava.net/baoyaer/articles/293079.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Sat, 29 Aug 2009 04:11:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/293079.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/293079.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/293079.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/293079.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/293079.html</trackback:ping><description><![CDATA[<h2 class="post-title">【版本控制之类】SVN版本库的迁移</h2>
<div class="post-body"><span style="font-family: Verdana; color: rgb(0,0,0); font-size: 10pt"><strong><span style="color: rgb(255,0,0)"><span style="font-family: Verdana; font-size: 10pt"><strong>&nbsp;【1.业务需求】</strong></span></span>
<hr style="color: rgb(0,0,0)" />
</strong>经过前面的SVN搭建，权限配置和强制写日志的工作之后，今天的任务是把原来其它分散的各个版本库统一迁移到新的版本库，集中统一管理。要求不改变原有的版本库的内容和版本号。<br />
<br />
<strong><span style="color: rgb(255,0,0)">【2.基本思路】</span>
<hr style="color: rgb(0,0,0)" />
</strong>要实现版本库的无缝迁移，必须通过以下3个步骤：<br />
&nbsp;①导出旧的版本库<br />
&nbsp;②导入新的版本库<br />
&nbsp;③通知客户端切换版本库分支<br />
<br />
首先来看第一步：导出旧的版本库。我们知道SVN提供了check out命令和export命令签出，导出版本库中的内容。对于版本库内容比较少的情况这种方法可以采用。但是如果版本库中内容比较多，那么这种方法就显得 很笨重了，而且还涉及到版本号改变的问题。所以首先摈弃这种做法。<br />
<br />
我们知道Oracle提供了export/import命令来将数据库导出成一个二进制文件，然后导入。同样的SVN也提供了一对命令：dump和 load。不同的是这两个命令导出的是文本内容(肉眼可以读懂)。而且还有一次性导出和增量导出，单版本导出与多版本导出等多种选择操作，就是这个了。<br />
<br />
其次我们来看&#8220;通知客户端切换版本库分支&#8221;。在我们完成服务器端的版本迁移之后，必须通知客户端运行切换分支的命令，否则客户端的提交还是提交到旧的版本库去。SVN也为我们准备了这样的命令：svn switch。<br />
<br />
<strong><span style="color: rgb(255,0,0)">【3.相关命令】</span>
<hr style="color: rgb(0,0,0)" />
</strong>首先我们来看一下SVN的dump和load命令<br />
<br />
<strong>①svnadmin dump命令语法</strong><br />
<div style="border-bottom: rgb(204,204,204) 1px solid; border-left: rgb(204,204,204) 1px solid; padding-bottom: 4px; background-color: rgb(238,238,238); padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; border-top: rgb(204,204,204) 1px solid; border-right: rgb(204,204,204) 1px solid; padding-top: 4px"><img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" /><span style="color: rgb(0,0,0)">svnadmin&nbsp;dump&nbsp;REPOS_PATH&nbsp;</span><span style="color: rgb(128,0,0); font-weight: bold">[</span><span style="color: rgb(128,0,0)">-r&nbsp;LOWER[:UPPER</span><span style="color: rgb(128,0,0); font-weight: bold">]</span><span style="color: rgb(0,0,0)">]&nbsp;</span><span style="color: rgb(128,0,0); font-weight: bold">[</span><span style="color: rgb(128,0,0)">--incremental</span><span style="color: rgb(128,0,0); font-weight: bold">]</span></div>
<br />
svnadmin dump命令用于导出整个Repository或Repository下的某个范围的修订版本。REPOS_PATH是版本库的路径，[-r LOWER[:UPPER]]用于指定导出的修订版本范围，由参数-r和两个用:号隔开阿拉伯数字组成。例如：-r 0:50表示导出才版本0到版本50之间的所有修订版，-r是revision的缩写。<br />
<br />
而另一个关键参数是--incremental。它使用增量方式来导出版本，即每次都只导出自上一个版本以来的修改。这样的好处是第一：可以把一个大的文 件切分成若干个小的文件。第二：在版本库已经存在的情况下，我们只需要每次导出修改的部分，不需要每次都导出整个版本库的内容。甚至可以通过hook脚本 每天晚上自动将当天的修改dump出来做备份用。<br />
<br />
<strong>②svnadmin load命令语法</strong>
<div style="border-bottom: rgb(204,204,204) 1px solid; border-left: rgb(204,204,204) 1px solid; padding-bottom: 4px; background-color: rgb(238,238,238); padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; border-top: rgb(204,204,204) 1px solid; border-right: rgb(204,204,204) 1px solid; padding-top: 4px"><img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" /><span style="color: rgb(0,0,0)">svnadmin&nbsp;load&nbsp;REPOS_PATH</span></div>
<br />
svnadmin load命令用于从标准输入流/其它流中导入版本库，REPOS_PATH是要导入的目标版本库。<br />
<br />
<strong>③dump和load的输出/入重定向</strong>
<div style="border-bottom: rgb(204,204,204) 1px solid; border-left: rgb(204,204,204) 1px solid; padding-bottom: 4px; background-color: rgb(238,238,238); padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; border-top: rgb(204,204,204) 1px solid; border-right: rgb(204,204,204) 1px solid; padding-top: 4px"><img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" /><span style="color: rgb(0,0,0)">svnadmin&nbsp;dump&nbsp;myrepos&nbsp;&gt;&nbsp;dumpfile<br />
<img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" /><br />
<img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" />svnadmin&nbsp;load&nbsp;newrepos&nbsp;&lt;&nbsp;dumpfile</span></div>
<br />
默认情况下dump和load命令分别输出到默认输出设备(屏幕)和从默认输入设备(键盘)导入。但我们也可以把输出流/输入流重定向。例如上面的第一个 命令，使用重定向符&gt;把屏幕的输出定向当前目录下的dumpfile，而第二个命令从当前目录下的dumpfile文件导入。<br />
<br />
上面的命令使用起来已经很方便了，那么还有没有更加方便的用法呢？当然有！就是使用管道命令把两个命令合二为一。
<div style="border-bottom: rgb(204,204,204) 1px solid; border-left: rgb(204,204,204) 1px solid; padding-bottom: 4px; background-color: rgb(238,238,238); padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; border-top: rgb(204,204,204) 1px solid; border-right: rgb(204,204,204) 1px solid; padding-top: 4px"><img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" /><span style="color: rgb(0,0,0)">svnadmin&nbsp;dump&nbsp;myrepos&nbsp;|&nbsp;svnadmin&nbsp;load&nbsp;newrepos</span></div>
<br />
<strong>④svn switch命令语法</strong>
<div style="border-bottom: rgb(204,204,204) 1px solid; border-left: rgb(204,204,204) 1px solid; padding-bottom: 4px; background-color: rgb(238,238,238); padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; border-top: rgb(204,204,204) 1px solid; border-right: rgb(204,204,204) 1px solid; padding-top: 4px"><img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" /><span style="color: rgb(0,0,0)">svn&nbsp;switch&nbsp;URL&nbsp;</span><span style="color: rgb(128,0,0); font-weight: bold">[</span><span style="color: rgb(128,0,0)">PATH</span><span style="color: rgb(128,0,0); font-weight: bold">]</span><span style="color: rgb(0,0,0)"><br />
<img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" />switch&nbsp;--relocate&nbsp;FROM&nbsp;TO&nbsp;</span><span style="color: rgb(128,0,0); font-weight: bold">[</span><span style="color: rgb(128,0,0)">PATH<img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span style="color: rgb(128,0,0); font-weight: bold">]</span></div>
svn switch命令用于更新工作副本的URL。意即指向新的版本库位置。首先要注意的一点是我们即可以将整个工作副本指向新的URL，也可将工作副本下的某个目录指向新的URL。<br />
<br />
另外一个重要的参数就是--relocate。这个参数是否使用对于结果如何有很大影响，使用不当甚至可能会造成版本库不可用。其中有两条重要的规则：<br />
<strong style="color: red">&nbsp;A.假如工作副本只是映射到同一个版本库内的不同位置，那么使用svn switch即可<br />
&nbsp;B.假如工作副本已是映射到不同的版本库，那么必须使用svn switch --relocate<br />
</strong><br />
上面第二条规则通常发生在我们需要将整个版本库迁移到另外一台机，或者同一台机的不同版本库时。这个时候使用--relocate会刷新原有工作副本中每个文件的URL头部。<br />
<br />
<strong style="color: red">【4.示例操作】</strong>
<hr style="color: rgb(0,0,0)" />
好了，下面我们来看如何执行版本库的迁移工作。<br />
<br />
<strong>①查看当前旧版本库最新的版本号是多少</strong>
<div style="border-bottom: rgb(204,204,204) 1px solid; border-left: rgb(204,204,204) 1px solid; padding-bottom: 4px; background-color: rgb(238,238,238); padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; border-top: rgb(204,204,204) 1px solid; border-right: rgb(204,204,204) 1px solid; padding-top: 4px"><img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" /><span style="color: rgb(0,0,0)">C:\peng\Other&gt;svnlook&nbsp;youngest&nbsp;newRepo<br />
<img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" /></span><span style="color: rgb(0,0,0)">161</span></div>
<br />
<strong>②分批增量导出版本库内容</strong>
<div style="border-bottom: rgb(204,204,204) 1px solid; border-left: rgb(204,204,204) 1px solid; padding-bottom: 4px; background-color: rgb(238,238,238); padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; border-top: rgb(204,204,204) 1px solid; border-right: rgb(204,204,204) 1px solid; padding-top: 4px"><img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" /><span style="color: rgb(0,0,0)">C:\peng\Other&gt;<span style="background-color: rgb(0,255,0)"><span style="color: rgb(0,0,0)">svnadmin&nbsp;dump&nbsp;newRepo&nbsp;-r&nbsp;</span><span style="color: rgb(0,0,0)">0</span><span style="color: rgb(0,0,0)">:</span><span style="color: rgb(0,0,0)">50</span><span style="color: rgb(0,0,0)">&nbsp;&gt;&nbsp;dumpfile1<br />
</span></span></span><span style="color: rgb(0,0,0)"><img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" />*&nbsp;Dumped&nbsp;revision&nbsp;</span><span style="color: rgb(0,0,0)">0</span><span style="color: rgb(0,0,0)">.<br />
<img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" />*&nbsp;Dumped&nbsp;revision&nbsp;</span><span style="color: rgb(0,0,0)">1</span><span style="color: rgb(0,0,0)">.<br />
<img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" />*&nbsp;Dumped&nbsp;revision&nbsp;</span><span style="color: rgb(0,0,0)">2</span><span style="color: rgb(0,0,0)">.<br />
<img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" />*&nbsp;Dumped&nbsp;revision&nbsp;</span><span style="color: rgb(0,0,0)">3</span><span style="color: rgb(0,0,0)">.<br />
<img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" /><img alt="" src="http://www.blogjava.net/Images/dot.gif" /><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span></div>
导出第一个文件，版本号从0到50的修订版本<br />
<br />
<div style="border-bottom: rgb(204,204,204) 1px solid; border-left: rgb(204,204,204) 1px solid; padding-bottom: 4px; background-color: rgb(238,238,238); padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; border-top: rgb(204,204,204) 1px solid; border-right: rgb(204,204,204) 1px solid; padding-top: 4px"><img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" /><span style="color: rgb(0,0,0)">C:\peng\Other&gt;<span style="background-color: rgb(0,255,0)"><span style="color: rgb(0,0,0)">svnadmin&nbsp;dump&nbsp;newRepo&nbsp;-r&nbsp;</span><span style="color: rgb(0,0,0)">51</span><span style="color: rgb(0,0,0)">:</span><span style="color: rgb(0,0,0)">100</span><span style="color: rgb(0,0,0)">&nbsp;<strong style="color: rgb(255,0,0)">--incremental</strong>&nbsp;&gt;&nbsp;dumpfile2</span></span></span><span style="color: rgb(0,0,0)"><br />
</span><span style="color: rgb(0,0,0)"><img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" />*&nbsp;Dumped&nbsp;revision&nbsp;</span><span style="color: rgb(0,0,0)">51</span><span style="color: rgb(0,0,0)">.<br />
<img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" />*&nbsp;Dumped&nbsp;revision&nbsp;</span><span style="color: rgb(0,0,0)">52</span><span style="color: rgb(0,0,0)">.<br />
<img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" />*&nbsp;Dumped&nbsp;revision&nbsp;</span><span style="color: rgb(0,0,0)">53</span><span style="color: rgb(0,0,0)">.<br />
<img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" />*&nbsp;Dumped&nbsp;revision&nbsp;</span><span style="color: rgb(0,0,0)">54</span><span style="color: rgb(0,0,0)">.<br />
<img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" />*&nbsp;Dumped&nbsp;revision&nbsp;</span><span style="color: rgb(0,0,0)">55</span><span style="color: rgb(0,0,0)">.<br />
<img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" /><img alt="" src="http://www.blogjava.net/Images/dot.gif" /><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span></div>
导出第二个文件，版本号从51到100的修订版本<br />
<br />
<div style="border-bottom: rgb(204,204,204) 1px solid; border-left: rgb(204,204,204) 1px solid; padding-bottom: 4px; background-color: rgb(238,238,238); padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; border-top: rgb(204,204,204) 1px solid; border-right: rgb(204,204,204) 1px solid; padding-top: 4px"><img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" /><span style="color: rgb(0,0,0)">C:\peng\Other&gt;<span style="background-color: rgb(0,255,0)"><span style="color: rgb(0,0,0)">svnadmin&nbsp;dump&nbsp;newRepo&nbsp;-r&nbsp;</span><span style="color: rgb(0,0,0)">101</span><span style="color: rgb(0,0,0)">:</span><span style="color: rgb(0,0,0)">161</span><span style="color: rgb(0,0,0)">&nbsp;<span style="color: rgb(255,0,0)"><strong>--incremental&nbsp;</strong></span>&gt;&nbsp;dumpfile3<br />
</span></span></span><span style="color: rgb(0,0,0)"><img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" />*&nbsp;Dumped&nbsp;revision&nbsp;</span><span style="color: rgb(0,0,0)">101</span><span style="color: rgb(0,0,0)">.<br />
<img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" />*&nbsp;Dumped&nbsp;revision&nbsp;</span><span style="color: rgb(0,0,0)">102</span><span style="color: rgb(0,0,0)">.<br />
<img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" />*&nbsp;Dumped&nbsp;revision&nbsp;</span><span style="color: rgb(0,0,0)">103</span><span style="color: rgb(0,0,0)">.<br />
<img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" />*&nbsp;Dumped&nbsp;revision&nbsp;</span><span style="color: rgb(0,0,0)">104</span><span style="color: rgb(0,0,0)">.<br />
<img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" />*&nbsp;Dumped&nbsp;revision&nbsp;</span><span style="color: rgb(0,0,0)">105</span><span style="color: rgb(0,0,0)">.<br />
<img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" /><img alt="" src="http://www.blogjava.net/Images/dot.gif" /><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span></div>
<p>请注意我们上面三个命令中第2，3个命令多了一个--incremental的参数，这就是采用了增量的方式导出，下面我们一次按照顺序导入<br />
<br />
<strong>③分批导入版本库文件<br />
</strong></p>
<div style="border-bottom: rgb(204,204,204) 1px solid; border-left: rgb(204,204,204) 1px solid; padding-bottom: 4px; background-color: rgb(238,238,238); padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; border-top: rgb(204,204,204) 1px solid; border-right: rgb(204,204,204) 1px solid; padding-top: 4px"><img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" /><span style="color: rgb(0,0,0)">C:\peng\Other&gt;svnadmin&nbsp;load&nbsp;newRepo2&nbsp;&lt;&nbsp;dumpfile1<br />
<img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" />&lt;&lt;&lt;&nbsp;开始新的事务，基于最初的修订版&nbsp;</span><span style="color: rgb(0,0,0)">1</span><span style="color: rgb(0,0,0)"><br />
<img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;正在添加路径：a&nbsp;<img alt="" src="http://www.blogjava.net/Images/dot.gif" />&nbsp;done.<br />
<img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" /><br />
<img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" />-------&nbsp;提交后的修订版&nbsp;</span><span style="color: rgb(0,0,0)">1</span><span style="color: rgb(0,0,0)">&nbsp;&gt;&gt;&gt;<br />
<img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" /><br />
<img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" />&lt;&lt;&lt;&nbsp;开始新的事务，基于最初的修订版&nbsp;</span><span style="color: rgb(0,0,0)">2</span><span style="color: rgb(0,0,0)"><br />
<img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;正在删除路径：a&nbsp;<img alt="" src="http://www.blogjava.net/Images/dot.gif" />&nbsp;done.<br />
<img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" /><img alt="" src="http://www.blogjava.net/Images/dot.gif" /><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span></div>
首先导入dumpfile1，然后是dumpfile2，dumpfile3<br />
<br />
<div style="border-bottom: rgb(204,204,204) 1px solid; border-left: rgb(204,204,204) 1px solid; padding-bottom: 4px; background-color: rgb(238,238,238); padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; border-top: rgb(204,204,204) 1px solid; border-right: rgb(204,204,204) 1px solid; padding-top: 4px"><img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" /><span style="color: rgb(0,0,0)">C:\peng\Other&gt;svnadmin&nbsp;load&nbsp;newRepo2&nbsp;&lt;&nbsp;dumpfile2<br />
<img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" />&lt;&lt;&lt;&nbsp;开始新的事务，基于最初的修订版&nbsp;</span><span style="color: rgb(0,0,0)">50</span><span style="color: rgb(0,0,0)"><br />
<img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;正在添加路径：branches&nbsp;<img alt="" src="http://www.blogjava.net/Images/dot.gif" />&nbsp;done.<br />
<img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" /><br />
<img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" />-------&nbsp;提交新修订版&nbsp;</span><span style="color: rgb(0,0,0)">12</span><span style="color: rgb(0,0,0)">&nbsp;(从原始修订版&nbsp;</span><span style="color: rgb(0,0,0)">50</span><span style="color: rgb(0,0,0)">&nbsp;装载)&nbsp;&gt;&gt;&gt;<br />
<img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" /><br />
<img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" />&lt;&lt;&lt;&nbsp;开始新的事务，基于最初的修订版&nbsp;</span><span style="color: rgb(0,0,0)">51</span><span style="color: rgb(0,0,0)"><br />
<img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;正在删除路径：branches&nbsp;<img alt="" src="http://www.blogjava.net/Images/dot.gif" />&nbsp;done.<br />
<img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" /><br />
<img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" />-------&nbsp;提交新修订版&nbsp;</span><span style="color: rgb(0,0,0)">13</span><span style="color: rgb(0,0,0)">&nbsp;(从原始修订版&nbsp;</span><span style="color: rgb(0,0,0)">51</span><span style="color: rgb(0,0,0)">&nbsp;装载)&nbsp;&gt;&gt;&gt;<br />
<img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" /><img alt="" src="http://www.blogjava.net/Images/dot.gif" /><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span></div>
导入文件dumpfile2。依次类推dumpfile3。<br />
<br />
如果我们前面不使用--incremental方式导出，此处分批导入三个dump文件，则会提示错误：版本库文件已经存在。<br />
<br />
<strong>④客户端切换工作副本URL<br />
</strong>
<div style="border-bottom: rgb(204,204,204) 1px solid; border-left: rgb(204,204,204) 1px solid; padding-bottom: 4px; background-color: rgb(238,238,238); padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; border-top: rgb(204,204,204) 1px solid; border-right: rgb(204,204,204) 1px solid; padding-top: 4px"><img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" /><span style="color: rgb(0,0,0)">C:\peng\Other&gt;svnserve&nbsp;-d&nbsp;-r&nbsp;c:\peng\other</span></div>
<br />
首先我们把SVN服务的根目录指向c:\peng\other目录，在这个目录下有两个repository，其中一个名为newRepo，另外一个名为呢wRepo2。
<div style="border-bottom: rgb(204,204,204) 1px solid; border-left: rgb(204,204,204) 1px solid; padding-bottom: 4px; background-color: rgb(238,238,238); padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; border-top: rgb(204,204,204) 1px solid; border-right: rgb(204,204,204) 1px solid; padding-top: 4px"><img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" /><span style="color: rgb(0,0,0)">C:\peng\Other&gt;dir<br />
<img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" />&nbsp;Volume&nbsp;in&nbsp;drive&nbsp;C&nbsp;is&nbsp;ESOE_W2K<br />
<img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" />&nbsp;Volume&nbsp;Serial&nbsp;Number&nbsp;is&nbsp;BC1B-</span><span style="color: rgb(0,0,0)">22E6</span><span style="color: rgb(0,0,0)"><br />
<img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" /><br />
<img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" />&nbsp;Directory&nbsp;of&nbsp;C:\peng\Other<br />
<img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" /><br />
<img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" /></span><span style="color: rgb(0,0,0)">2008</span><span style="color: rgb(0,0,0)">-</span><span style="color: rgb(0,0,0)">12</span><span style="color: rgb(0,0,0)">-</span><span style="color: rgb(0,0,0)">26</span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;</span><span style="color: rgb(0,0,0)">15</span><span style="color: rgb(0,0,0)">:</span><span style="color: rgb(0,0,0)">10</span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;DIR&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.<br />
<img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" /></span><span style="color: rgb(0,0,0)">2008</span><span style="color: rgb(0,0,0)">-</span><span style="color: rgb(0,0,0)">12</span><span style="color: rgb(0,0,0)">-</span><span style="color: rgb(0,0,0)">26</span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;</span><span style="color: rgb(0,0,0)">15</span><span style="color: rgb(0,0,0)">:</span><span style="color: rgb(0,0,0)">10</span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;DIR&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;..<br />
<img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" /></span><span style="color: rgb(0,0,0)">2008</span><span style="color: rgb(0,0,0)">-</span><span style="color: rgb(0,0,0)">12</span><span style="color: rgb(0,0,0)">-</span><span style="color: rgb(0,0,0)">23</span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;</span><span style="color: rgb(0,0,0)">10</span><span style="color: rgb(0,0,0)">:</span><span style="color: rgb(0,0,0)">04</span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;DIR&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Backup<br />
<img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" /></span><span style="color: rgb(0,0,0)">2008</span><span style="color: rgb(0,0,0)">-</span><span style="color: rgb(0,0,0)">12</span><span style="color: rgb(0,0,0)">-</span><span style="color: rgb(0,0,0)">26</span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;</span><span style="color: rgb(0,0,0)">14</span><span style="color: rgb(0,0,0)">:</span><span style="color: rgb(0,0,0)">21</span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,0)">45</span><span style="color: rgb(0,0,0)">,</span><span style="color: rgb(0,0,0)">578</span><span style="color: rgb(0,0,0)">&nbsp;dumpfile1<br />
<img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" /></span><span style="color: rgb(0,0,0)">2008</span><span style="color: rgb(0,0,0)">-</span><span style="color: rgb(0,0,0)">12</span><span style="color: rgb(0,0,0)">-</span><span style="color: rgb(0,0,0)">26</span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;</span><span style="color: rgb(0,0,0)">14</span><span style="color: rgb(0,0,0)">:</span><span style="color: rgb(0,0,0)">22</span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,0)">39</span><span style="color: rgb(0,0,0)">,</span><span style="color: rgb(0,0,0)">567</span><span style="color: rgb(0,0,0)">&nbsp;dumpfile2<br />
<img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" /></span><span style="color: rgb(0,0,0)">2008</span><span style="color: rgb(0,0,0)">-</span><span style="color: rgb(0,0,0)">12</span><span style="color: rgb(0,0,0)">-</span><span style="color: rgb(0,0,0)">26</span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;</span><span style="color: rgb(0,0,0)">14</span><span style="color: rgb(0,0,0)">:</span><span style="color: rgb(0,0,0)">23</span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,0)">55</span><span style="color: rgb(0,0,0)">,</span><span style="color: rgb(0,0,0)">740</span><span style="color: rgb(0,0,0)">&nbsp;dumpfile3<br />
<img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" /></span><span style="color: rgb(0,0,0)">2008</span><span style="color: rgb(0,0,0)">-</span><span style="color: rgb(0,0,0)">12</span><span style="color: rgb(0,0,0)">-</span><span style="color: rgb(0,0,0)">15</span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;</span><span style="color: rgb(0,0,0)">09</span><span style="color: rgb(0,0,0)">:</span><span style="color: rgb(0,0,0)">08</span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;DIR&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;newRepo<br />
<img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" /></span><span style="color: rgb(0,0,0)">2008</span><span style="color: rgb(0,0,0)">-</span><span style="color: rgb(0,0,0)">12</span><span style="color: rgb(0,0,0)">-</span><span style="color: rgb(0,0,0)">26</span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;</span><span style="color: rgb(0,0,0)">14</span><span style="color: rgb(0,0,0)">:</span><span style="color: rgb(0,0,0)">20</span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;DIR&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;newRepo2<br />
<img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" /></span><span style="color: rgb(0,0,0)">2008</span><span style="color: rgb(0,0,0)">-</span><span style="color: rgb(0,0,0)">12</span><span style="color: rgb(0,0,0)">-</span><span style="color: rgb(0,0,0)">26</span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;</span><span style="color: rgb(0,0,0)">15</span><span style="color: rgb(0,0,0)">:</span><span style="color: rgb(0,0,0)">25</span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;DIR&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ps<br />
<img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" /></span><span style="color: rgb(0,0,0)">2008</span><span style="color: rgb(0,0,0)">-</span><span style="color: rgb(0,0,0)">12</span><span style="color: rgb(0,0,0)">-</span><span style="color: rgb(0,0,0)">24</span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;</span><span style="color: rgb(0,0,0)">15</span><span style="color: rgb(0,0,0)">:</span><span style="color: rgb(0,0,0)">11</span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;DIR&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Toolbar<br />
<img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,0)">3</span><span style="color: rgb(0,0,0)">&nbsp;File(s)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,0)">140</span><span style="color: rgb(0,0,0)">,</span><span style="color: rgb(0,0,0)">885</span><span style="color: rgb(0,0,0)">&nbsp;bytes<br />
<img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,0)">7</span><span style="color: rgb(0,0,0)">&nbsp;Dir(s)&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,0)">2</span><span style="color: rgb(0,0,0)">,</span><span style="color: rgb(0,0,0)">668</span><span style="color: rgb(0,0,0)">,</span><span style="color: rgb(0,0,0)">414</span><span style="color: rgb(0,0,0)">,</span><span style="color: rgb(0,0,0)">976</span><span style="color: rgb(0,0,0)">&nbsp;bytes&nbsp;free<br />
<img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" /><br />
<img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" />C:\peng\Other&gt;</span></div>
<br />
首先我们从newRepo这个版本库中check out出一个子目录ps
<div style="border-bottom: rgb(204,204,204) 1px solid; border-left: rgb(204,204,204) 1px solid; padding-bottom: 4px; background-color: rgb(238,238,238); padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; border-top: rgb(204,204,204) 1px solid; border-right: rgb(204,204,204) 1px solid; padding-top: 4px"><img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" /><span style="color: rgb(0,0,0)">C:\Documents&nbsp;and&nbsp;Settings\qlinpen.E0015609D6309&gt;svn&nbsp;checkout&nbsp;svn://localhost/newRepo/ps&nbsp;c:/peng/other/ps<br />
<img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" />A&nbsp;&nbsp;&nbsp;&nbsp;C:\peng\Other\ps\ps.txt<br />
<img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" />取出修订版&nbsp;</span><span style="color: rgb(0,0,0)">170</span><span style="color: rgb(0,0,0)">。</span></div>
<br />
现在该工作副本已经和:svn://localhost/newRepo/ps发生了映射关系。我们可以使用svnlook info来显示这个工作副本的一般信息
<div style="border-bottom: rgb(204,204,204) 1px solid; border-left: rgb(204,204,204) 1px solid; padding-bottom: 4px; background-color: rgb(238,238,238); padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; border-top: rgb(204,204,204) 1px solid; border-right: rgb(204,204,204) 1px solid; padding-top: 4px"><img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" /><span style="color: rgb(0,0,0)">C:\peng\Other&gt;cd&nbsp;ps<br />
<img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" /><br />
<img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" /><span style="background-color: rgb(0,255,0)">C:\peng\Other\ps&gt;svn&nbsp;info<br />
</span><img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" />路径：.<br />
<img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" /><span style="background-color: rgb(0,255,0)">地址(URL)：svn://localhost/<strong style="color: red">newRepo</strong>/ps</span><br />
<img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" />Repository&nbsp;Root:&nbsp;svn://localhost/newRepo<br />
<img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" />档案库&nbsp;UUID：6fbeb35b-c7e4-984d-b2ac-32812dcf3078<br />
<img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" />修订版：</span><span style="color: rgb(0,0,0)">170</span><span style="color: rgb(0,0,0)"><br />
<img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" />节点种类：目录<br />
<img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" />调度：正常<br />
<img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" />最后修改的作者：admin<br />
<img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" />最后修改的修订版：</span><span style="color: rgb(0,0,0)">170</span><span style="color: rgb(0,0,0)"><br />
<img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" />最后修改的时间:&nbsp;</span><span style="color: rgb(0,0,0)">2008</span><span style="color: rgb(0,0,0)">-</span><span style="color: rgb(0,0,0)">12</span><span style="color: rgb(0,0,0)">-</span><span style="color: rgb(0,0,0)">26</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,0)">14</span><span style="color: rgb(0,0,0)">:</span><span style="color: rgb(0,0,0)">52</span><span style="color: rgb(0,0,0)">:</span><span style="color: rgb(0,0,0)">32</span><span style="color: rgb(0,0,0)">&nbsp;+</span><span style="color: rgb(0,0,0)">0800</span><span style="color: rgb(0,0,0)">&nbsp;(星期五</span><span style="color: rgb(0,0,0)">,</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,0)">26</span><span style="color: rgb(0,0,0)">&nbsp;十二月&nbsp;</span><span style="color: rgb(0,0,0)">2008</span><span style="color: rgb(0,0,0)">)</span></div>
<br />
输出信息中明确地指出ps目录指向了svn://localhost/newRepo/ps。下面我们来把它指向另一个repository下的同名位置：svn://localhost/newRepo2/ps。
<div style="border-bottom: rgb(204,204,204) 1px solid; border-left: rgb(204,204,204) 1px solid; padding-bottom: 4px; background-color: rgb(238,238,238); padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; border-top: rgb(204,204,204) 1px solid; border-right: rgb(204,204,204) 1px solid; padding-top: 4px"><img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" /><span style="color: rgb(0,0,0)"><span style="background-color: rgb(0,255,0)"><span style="color: rgb(0,0,0)">C:\peng\Other\ps&gt;svn&nbsp;switch&nbsp;<strong style="color: red">--relocate</strong>&nbsp;svn://localhost/newRepo/ps&nbsp;svn://localhost/newRepo2/ps<br />
</span></span><img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" /><br />
<img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" />C:\peng\Other\ps&gt;</span></div>
<br />
经过上面的切换后，再次使用svnlook info输出一般信息，发现URL已经被成功切换过来了
<div style="border-bottom: rgb(204,204,204) 1px solid; border-left: rgb(204,204,204) 1px solid; padding-bottom: 4px; background-color: rgb(238,238,238); padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; border-top: rgb(204,204,204) 1px solid; border-right: rgb(204,204,204) 1px solid; padding-top: 4px"><img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" /><span style="color: rgb(0,0,0)"><span style="background-color: rgb(0,255,0)"><span style="color: rgb(0,0,0)">C:\peng\Other\ps&gt;svn&nbsp;info<br />
</span></span><img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" />路径：.<br />
<img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" /><span style="background-color: rgb(0,255,0)">地址(URL)：svn://localhost/<strong style="color: red">newRepo<span style="color: red">2</span></strong>/ps</span><br />
<img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" />Repository&nbsp;Root:&nbsp;svn://localhost/newRepo2<br />
<img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" />档案库&nbsp;UUID：6fbeb35b-c7e4-984d-b2ac-32812dcf3078<br />
<img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" />修订版：</span><span style="color: rgb(0,0,0)">170</span><span style="color: rgb(0,0,0)"><br />
<img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" />节点种类：目录<br />
<img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" />调度：正常<br />
<img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" />最后修改的作者：admin<br />
<img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" />最后修改的修订版：</span><span style="color: rgb(0,0,0)">170</span><span style="color: rgb(0,0,0)"><br />
<img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" />最后修改的时间:&nbsp;</span><span style="color: rgb(0,0,0)">2008</span><span style="color: rgb(0,0,0)">-</span><span style="color: rgb(0,0,0)">12</span><span style="color: rgb(0,0,0)">-</span><span style="color: rgb(0,0,0)">26</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,0)">14</span><span style="color: rgb(0,0,0)">:</span><span style="color: rgb(0,0,0)">52</span><span style="color: rgb(0,0,0)">:</span><span style="color: rgb(0,0,0)">32</span><span style="color: rgb(0,0,0)">&nbsp;+</span><span style="color: rgb(0,0,0)">0800</span><span style="color: rgb(0,0,0)">&nbsp;(星期五</span><span style="color: rgb(0,0,0)">,</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,0)">26</span><span style="color: rgb(0,0,0)">&nbsp;十二月&nbsp;</span><span style="color: rgb(0,0,0)">2008</span><span style="color: rgb(0,0,0)">)</span></div>
<br />
我们尝试着在ps目录下修改文件ps.txt为ps.doc，然后提交看看会提交到那个repos去？
<div style="border-bottom: rgb(204,204,204) 1px solid; border-left: rgb(204,204,204) 1px solid; padding-bottom: 4px; background-color: rgb(238,238,238); padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; border-top: rgb(204,204,204) 1px solid; border-right: rgb(204,204,204) 1px solid; padding-top: 4px"><img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" /><span style="color: rgb(0,0,0)"><span style="background-color: rgb(0,255,0)"><span style="color: rgb(0,0,0)">C:\peng\Other\ps&gt;svn&nbsp;list&nbsp;svn://localhost/newRepo/ps</span></span><br />
<img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" />ps.txt<br />
<img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" /><br />
<img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" /><span style="background-color: rgb(0,255,0)">C:\peng\Other\ps&gt;svn&nbsp;list&nbsp;svn://localhost/newRepo2/ps</span><br />
<img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" />ps.doc<br />
<img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" /><br />
<img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" />C:\peng\Other\ps&gt;</span></div>
<br />
很明显现在的提交全部都去到新的位置了！切换成功。</span> </div>
<img src ="http://www.blogjava.net/baoyaer/aggbug/293079.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2009-08-29 12:11 <a href="http://www.blogjava.net/baoyaer/articles/293079.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Subversion备份【zt】</title><link>http://www.blogjava.net/baoyaer/articles/261454.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Mon, 23 Mar 2009 02:17:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/261454.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/261454.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/261454.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/261454.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/261454.html</trackback:ping><description><![CDATA[<p>版本控制最关键的一件事是保证数据的安全性，不能因为磁盘损坏，程序故障造成版本库无可挽回的错误，为此必须制定较完备的<a onclick="javascript:tagshow(event, '%B1%B8%B7%DD');" href="javascript:;" target="_self"><u><strong>备份</strong></u></a>策略。在Subversion中，我们有三种备份方式：完全备份，增量备份和同步版本库。<br />
</p>
<h3>1, 完全备份</h3>
<p>最常见和简单的备份就是直接使用拷贝命令，将版本库目录拷贝到备份目录上，就可以了。但是这样不是很安全的方式，因为如果在拷贝时版本库发生变化，将会造成备份的结果不够准确，失去备份的作用，为此Subversion提供了&#8220;svnadmin hotcopy&#8221;命令，可以防止这种问题。</p>
<p>还记得我们的版本库目录吗？</p>
<blockquote dir="ltr" style="margin-right: 0px">
<p>D:\SVNROOT<br />
├─project1<br />
│&nbsp; ├─conf<br />
│&nbsp; ├─dav<br />
│&nbsp; ├─db<br />
│&nbsp; │&nbsp; ├─revprops<br />
│&nbsp; │&nbsp; ├─revs<br />
│&nbsp; │&nbsp; └─transactions<br />
│&nbsp; ├─hooks<br />
│&nbsp; └─locks<br />
└─project2<br />
&nbsp;&nbsp;&nbsp; ├─conf<br />
&nbsp;&nbsp;&nbsp; ├─dav<br />
&nbsp;&nbsp;&nbsp; ├─db<br />
&nbsp;&nbsp;&nbsp; │&nbsp; ├─revprops<br />
&nbsp;&nbsp;&nbsp; │&nbsp; ├─revs<br />
&nbsp;&nbsp;&nbsp; │&nbsp; └─transactions<br />
&nbsp;&nbsp;&nbsp; ├─hooks<br />
&nbsp;&nbsp;&nbsp; └─locks<br />
&nbsp;&nbsp;&nbsp;<br />
</p>
</blockquote>
<p dir="ltr">如果要把project1备份到d:\svnrootbak目录下，只需要运行：</p>
<blockquote dir="ltr" style="margin-right: 0px">
<p dir="ltr">svnadmin hotcopy d:\svnroot\project1 d:\svnrootbak\project1</p>
</blockquote>
<p dir="ltr">但是我们作为配置管理员，必须想办法优化这个过程，如果我们这个目录下有许多版本库，需要为每个版本库写这样一条语句备份，为此我写了下面的脚本，实现备份一个目录下的所有版本库。我们在D:\SVNROOT下创建了两个文件，simpleBackup.bat：</p>
<blockquote dir="ltr" style="margin-right: 0px">
<p>@echo 正在备份版本库%1......<br />
@%SVN_HOME%\bin\svnadmin hotcopy %1 %BACKUP_DIRECTORY%\%2<br />
@echo 版本库%1成功备份到了%2！</p>
</blockquote>
<p>这个文件仅仅是对&#8220;svnadmin hotcopy&#8221;的包装，然后是backup.bat：</p>
<blockquote dir="ltr" style="margin-right: 0px">
<p>echo off</p>
<p>rem Subversion的安装目录<br />
set SVN_HOME="D:\Subversion"</p>
<p>rem 所有版本库的父目录<br />
set SVN_ROOT=D:\svnroot</p>
<p>rem 备份的目录<br />
set BACKUP_SVN_ROOT=D:\svnrootbak</p>
<p>set BACKUP_DIRECTORY=%BACKUP_SVN_ROOT%\%date:~0,10%<br />
if exist %BACKUP_DIRECTORY% goto checkBack<br />
echo 建立备份目录%BACKUP_DIRECTORY%&gt;&gt;%SVN_ROOT%/backup.log</p>
<p>mkdir %BACKUP_DIRECTORY%</p>
<p>rem 验证目录是否为版本库，如果是则取出名称备份<br />
for /r %SVN_ROOT% %%I in (.) do @if exist "%%I\conf\svnserve.conf" %SVN_ROOT%\simpleBackup.bat "%%~fI" %%~nI<br />
goto end</p>
<p>:checkBack<br />
echo 备份目录%BACKUP_DIRECTORY%已经存在，请清空。<br />
goto end</p>
<p>:end</p>
</blockquote>
<p>你在使用的时候，只需要修改backup.bat开头的三个路径，将两个脚本拷贝到&#8220;SVN_ROOT&#8221;下就可以了。根据以上的配置，你只需要运行backup.bat，就可以把&#8220;SVN_ROOT&#8221;下的版本库都备份到&#8220;BACKUP_SVN_ROOT&#8221;里，并且存放在备份所在日的目录里，例如&#8220;D:\svnrootbak\2006-10-22&#8221;。</p>
<p>虽然这部分工作很简单，可是必须有人定时地去执行这个操作（例如每周一凌晨），为了避免发生遗忘的情况，我们可以将这个操作加入到系统的at任务当中去，例如还是上面的环境，为了安装at任务，我们运行：</p>
<blockquote dir="ltr" style="margin-right: 0px">
<pre>at<span style="color: #cc66cc">1</span>:<span style="color: #cc66cc">00</span>/every:M D:\svnroot\backup.bat</pre>
</blockquote>
<p>这样在每周一凌晨1:00都会执行这个备份过程。当然备份在本机也是不安全的，你也许需要上传到别的机器，这个就要靠你自己去实现了。</p>
<h3><br />
2, 增量备份</h3>
<p>尽管完全备份非常简单，但是也是有代价的，当版本库非常巨大时，经常进行完全备份是不现实的，也并不必要，但是一旦版本库在备份之间发生问题，该如何呢，这里我们就用到了增量备份。</p>
<p>增量备份通常要与完全备份结合使用，就像<a onclick="javascript:tagshow(event, 'oracle');" href="javascript:;" target="_self"><u><strong>oracle</strong></u></a><a onclick="javascript:tagshow(event, '%CA%FD%BE%DD%BF%E2');" href="javascript:;" target="_self"><u><strong>数据库</strong></u></a>的归档日志，记录着每次Subversion提交的变化，然后在需要<a onclick="javascript:tagshow(event, '%BB%D6%B8%B4');" href="javascript:;" target="_self"><u><strong>恢复</strong></u></a>时能够回到最新的可用状态。在我们这个例子中我们使用的是，svnadmin dump命令进行增量的备份，使用方法是：</p>
<blockquote dir="ltr" style="margin-right: 0px">
<p>svnadmin dump&nbsp;project1&nbsp;--revision 15 --incremental &gt; dumpfile2</p>
</blockquote>
<p>上面的命令实现了对修订版本15进行增量的备份，其中的输出文件dumpfile2只保存了修订版本15更改的内容。</p>
<p>为了记录每次提交的结果，我们需要使用一项Subversion的特性--<a href="http://www.subversion.org.cn/svnbook/1.1/svn-ch-5-sect-2.html#svn-ch-5-sect-2.1"><u><font color="#800080">钩子（hook）</font></u></a>，看看我们的project1目录：</p>
<blockquote dir="ltr" style="margin-right: 0px">
<p>├─project1<br />
│&nbsp; ├─conf<br />
│&nbsp; ├─dav<br />
│&nbsp; ├─db<br />
│&nbsp; │&nbsp; ├─revprops<br />
│&nbsp; │&nbsp; ├─revs<br />
│&nbsp; │&nbsp; └─transactions<br />
│&nbsp; ├─hooks<br />
│&nbsp; └─locks</p>
</blockquote>
<p>其中的hooks目录里存放的就是钩子脚本，我们在此处只使用post-commit钩子，这个钩子会在每次提交之后执行，为了实现我们的备份功能，我们在hooks下建立一个文件post-commit.bat，内容如下：</p>
<blockquote dir="ltr" style="margin-right: 0px">
<address>echo off<br />
set SVN_HOME="C:\Program Files\Subversion"<br />
set SVN_ROOT=D:\svnroot<br />
set UNIX_SVN_ROOT=D:/svnroot<br />
set DELTA_BACKUP_SVN_ROOT=D:\svnrootbak\delta</address>
<address>set LOG_FILE=%1\backup.log<br />
echo backup revision %2 &gt;&gt; %LOG_FILE%</address>
<address>for /r %SVN_ROOT% %%I in (.) do if D:/svnroot/%%~nI == %1 %SVN_ROOT%\%%~nI\hooks\deltaBackup.bat %%~nI %2<br />
goto end</address>
<address>:end</address>
</blockquote>
<p>通过这个脚本，可以实现D:\svnroot下的版本库提交时自动增量备份到D:\svnrootbak\delta（确定这个目录存在），其中使用的deltaBackup.bat其实可以放在任何地方，只是对脚本的svnadmin dump的包装，内容如下：</p>
<blockquote dir="ltr" style="margin-right: 0px">
<p>@echo 正在备份版本库%2......<br />
%SVN_HOME%\bin\svnadmin dump %SVN_ROOT%\%1 --incremental --revision %2 &gt;&gt; %DELTA_BACKUP_SVN_ROOT%\%1.dump<br />
@echo 版本库%2成功备份到了%3！</p>
</blockquote>
<p>以上两个脚本可以直接拷贝到project2的hooks目录下，不需要修改就可以实现project2的自动备份。</p>
<p>以上的操作已经OK了，现在需要做的是将完全备份和增量备份结合起来，也就是在完全备份后清理增量备份的结果，使之只保存完全备份后的结果。</p>
<p>当果真出现版本库的故障，就要求我们实现版本库的恢复操作了，这是用要使用svnadmin load命令，同时也需要上次的完全备份例如要把上次完全备份backuprepo，和之后的增量备份dumpfile：</p>
<blockquote dir="ltr" style="margin-right: 0px">
<p>svnadmin load&nbsp;backuprepo &lt; dumpfile</p>
</blockquote>
<p>最后的结果，可以下载<a href="http://www.subversion.org.cn/images/stories/svnroot.rar">svnroot.rar</a>，将之解压缩到d:\下，然后修改几个bat文件的SVN_HOME就可以使用了。</p>
<h3>3, 版本库同步</h3>
<p>Subversion 1.4增加了同步机制，可以实现一个版本库同另一个版本库的同步（但好像只是单向的），我们可以用来实现版本库的备份或镜像。</p>
<h5>3.1. 对目标库初始化</h5>
<blockquote dir="ltr" style="margin-right: 0px">
<pre>svnsync init <a onclick="javascript:tagshow(event, 'svn');" href="javascript:;" target="_self"><u><strong>svn</strong></u></a>:<span style="color: #808080">//localhost/project2 svn://localhost/project1</span>&nbsp;</pre>
</blockquote>
<p><font size="2">其中project2是目标的版本库，而project1是源版本库。其中的目标版本库必须为空，而且必须允许修订版本属性的修改，也就是在目标的版本库的hooks目录里添加一个文件pre-revprop-change.bat，内容为空即可。</font></p>
<h5>3.2. 同步project2到project1</h5>
<blockquote dir="ltr" style="margin-right: 0px">
<pre>svnsync sync svn:<span style="color: #808080">//localhost/project2</span>&nbsp;</pre>
</blockquote>
<p>这时候你update一下你的project2的一个工作拷贝，就会发现有了project1的所有内容。如果project1又有提交，这时候project2的版本库无法看到最新的变化，还需要再运行一遍sync操作，这样才能将最新的变化同步。需要注意的是，目标版本库只能做成只读的，如果目标版本库发生了变更，则无法继续同步了。</p>
<h5>3.3. 同步历史属性的修改</h5>
<p>因为同步不会更新对历史属性的修改，所以svnsync还有子命令copy-revprops，可以同步某个版本的属性。</p>
<h5>3.4. 钩子自动同步</h5>
<p>希望在每次提交时同步，则需要在源版本库增加post-commit脚本，内容如下：</p>
<blockquote dir="ltr" style="margin-right: 0px">
<pre><a href="http://www.php.net/echo"><span style="color: #000066">echo</span></a>off
set SVN_HOME=<span style="color: #ff0000">"D:<span style="font-weight: bold; color: #000099">\S</span>ubversion"</span>%SVN_HOME%\bin\svnsync sync  --non-interactive svn:<span style="color: #808080">//localhost/project2</span>&nbsp;</pre>
</blockquote>
<p>把以上内容存放为post-commit.bat，然后放到版本库project1下的hooks目录下，这样project1每次提交，都会引起project2的同步。</p>
<img src ="http://www.blogjava.net/baoyaer/aggbug/261454.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2009-03-23 10:17 <a href="http://www.blogjava.net/baoyaer/articles/261454.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用 Resin 自带的身份验证机制给页面加入密码保护</title><link>http://www.blogjava.net/baoyaer/articles/248907.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Mon, 29 Dec 2008 07:31:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/248907.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/248907.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/248907.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/248907.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/248907.html</trackback:ping><description><![CDATA[<p>Resin 自带了很多种身份验证机制, 例如纯文本, XML 和 JDBC 格式的等等, 详见 Resin 安装后自带的 resin-doc 里的网页. 这样一来如果我们想给某些页面加入密码保护机制, 就很容易了. 最典型的例子例如本站使用的是 JSPWiki 2.2.33, 它自身没有带严格的身份验证机制, 这样一来如果放到公网上, 就会非常危险. 例如说原来没有开放的时候我只想一个人来编辑, 就可以做如下的配置(修改 WEB-INF/web.xml): </p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">&nbsp;</span><span style="color: #008000">&lt;!--</span><span style="color: #008000">&nbsp;Add&nbsp;user&nbsp;names&nbsp;and&nbsp;passwords&nbsp;that&nbsp;can&nbsp;edit&nbsp;the&nbsp;wiki&nbsp;</span><span style="color: #008000">--&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">authenticator&nbsp;</span><span style="color: #ff0000">type</span><span style="color: #0000ff">="com.caucho.server.security.XmlAuthenticator"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">init</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #008000">&lt;!--</span><span style="color: #008000">&nbsp;可以加入多个&nbsp;user,&nbsp;格式:&nbsp;&lt;&nbsp;user&nbsp;&gt;用户名:密码:角色&lt;&nbsp;/&nbsp;user&nbsp;&gt;&nbsp;</span><span style="color: #008000">--&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">user</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">adminuser:password:admin</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">user</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">password-digest</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">none</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">password-digest</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">init</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">authenticator</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #008000">&lt;!--</span><span style="color: #008000">指定验证方式为&nbsp;basic,&nbsp;就是浏览器弹出对话框的那种&nbsp;</span><span style="color: #008000">--&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">login-config&nbsp;</span><span style="color: #ff0000">auth-method</span><span style="color: #0000ff">='basic'/&gt;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #ff0000">&lt;!--被保护的页面地址及其响应的角色名&nbsp;--</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">security-constraint&nbsp;</span><span style="color: #ff0000">url-pattern</span><span style="color: #0000ff">='/Delete.jsp'&nbsp;</span><span style="color: #ff0000">role-name</span><span style="color: #0000ff">='admin'/&gt;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<br />
<p>这时候点击 Delete.jsp 后, 系统就会弹出窗口要求您进行身份验证. 是不是很简单呢? </p>
<img src ="http://www.blogjava.net/baoyaer/aggbug/248907.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2008-12-29 15:31 <a href="http://www.blogjava.net/baoyaer/articles/248907.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>mysql 使用</title><link>http://www.blogjava.net/baoyaer/articles/226746.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Wed, 03 Sep 2008 10:49:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/226746.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/226746.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/226746.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/226746.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/226746.html</trackback:ping><description><![CDATA[导入数据<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">.</span><span style="color: #808080">/</span><span style="color: #000000">mysql&nbsp;</span><span style="color: #808080">-</span><span style="color: #000000">umarduk&nbsp;</span><span style="color: #808080">-</span><span style="color: #000000">pmarduk&nbsp;cnaudit&nbsp;</span><span style="color: #808080">&lt;</span><span style="color: #000000">cnbak0902.sql&nbsp;</span></div>
<br />
也可以使用：<br />
常用source 命令<br />
进入mysql数据库控制台，如mysql -u root -p<br />
<br />
mysql&gt;use 数据库<br />
<br />
然后使用source命令，后面参数为脚本文件（如这里用到的.sql）<br />
<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">mysql</span><span style="color: #808080">&gt;</span><span style="color: #000000">source&nbsp;d:\aiker_db.sql<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></div>
<br />
<br />
导出数据<br />
导出整个数据库<br />
<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">&nbsp;.</span><span style="color: #808080">/</span><span style="color: #000000">mysqldump&nbsp;</span><span style="color: #808080">-</span><span style="color: #000000">u&nbsp;ssj&nbsp;</span><span style="color: #808080">-</span><span style="color: #000000">p&nbsp;cnaudit&nbsp;</span><span style="color: #808080">&gt;/</span><span style="color: #000000">home</span><span style="color: #808080">/</span><span style="color: #000000">cnaudit0902.sql</span></div>
<br />
导出一个表<br />
mysqldump -u 用户名 -p 数据库名 表名&gt; 导出的文件名<br />
<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">mysqldump&nbsp;</span><span style="color: #808080">-</span><span style="color: #000000">u&nbsp;aiker&nbsp;</span><span style="color: #808080">-</span><span style="color: #000000">p&nbsp;aikersql&nbsp;users</span><span style="color: #808080">&gt;</span><span style="color: #000000">&nbsp;aiker_users.sql<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></div>
<br />
<br />
3.导出一个数据库结构<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">mysqldump&nbsp;</span><span style="color: #808080">-</span><span style="color: #000000">u&nbsp;root&nbsp;</span><span style="color: #808080">-</span><span style="color: #000000">p&nbsp;</span><span style="color: #808080">-</span><span style="color: #000000">d&nbsp;</span><span style="color: #008080">--</span><span style="color: #008080">add-drop-table&nbsp;aikersql&gt;d:\aiker_db.sql</span><span style="color: #008080"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></div>
<br />
-d 没有数据 --add-drop-table 在每个create语句之前增加一个drop table<br />
<br />
4.导出表的部分数据<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">.</span><span style="color: #808080">/</span><span style="color: #000000">mysqldump&nbsp;</span><span style="color: #808080">-</span><span style="color: #000000">u&nbsp;ssj&nbsp;</span><span style="color: #808080">-</span><span style="color: #000000">p&nbsp;cnaudit&nbsp;&nbsp;CNAUDIT_AUDIT_HISTORY_TABLE&nbsp;"</span><span style="color: #008080">--</span><span style="color: #008080">where=REG_DATE&gt;'2008-07-31'"&gt;/home/cnaudit0902.sql</span></div>
<br />
<br />
建立索引：<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #0000ff">alter</span><span style="color: #000000">&nbsp;&nbsp;</span><span style="color: #0000ff">table</span><span style="color: #000000">&nbsp;audit_table&nbsp;</span><span style="color: #0000ff">add</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">index</span><span style="color: #000000">&nbsp;reg_date_index(reg_date);</span></div>
<br />
<br />
<img src ="http://www.blogjava.net/baoyaer/aggbug/226746.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2008-09-03 18:49 <a href="http://www.blogjava.net/baoyaer/articles/226746.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>CruiseControl 入门</title><link>http://www.blogjava.net/baoyaer/articles/215240.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Wed, 16 Jul 2008 08:14:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/215240.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/215240.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/215240.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/215240.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/215240.html</trackback:ping><description><![CDATA[1. cinfig.xml配置文件<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #0000ff">&lt;</span><span style="color: #800000">cruisecontrol</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">project&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="hello"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">listeners</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">currentbuildstatuslistener&nbsp;</span><span style="color: #ff0000">file</span><span style="color: #0000ff">="logs/hello/status.txt"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">listeners</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">bootstrappers</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">cvsbootstrapper&nbsp;</span><span style="color: #ff0000">localWorkingCopy</span><span style="color: #0000ff">="projects/hello"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">bootstrappers</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;!</span><span style="color: #ff00ff">—监控本地工作目录，如果在下面的目录中发生变化则自动执行下面的build.xml，没有变化则不再执行下面的构建工作&nbsp;--</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">modificationset&nbsp;</span><span style="color: #ff0000">quietperiod</span><span style="color: #0000ff">="30"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">&lt;!</span><span style="color: #ff00ff">—监控前的静默&nbsp;--</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">cvs&nbsp;</span><span style="color: #ff0000">localWorkingCopy</span><span style="color: #0000ff">="projects/hello"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">cvs&nbsp;</span><span style="color: #ff0000">localWorkingCopy</span><span style="color: #0000ff">="projects/hello/main/src/java/com/test/qik"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">modificationset</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;!</span><span style="color: #ff00ff">—计划时间间隔，单位秒&nbsp;--</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">schedule&nbsp;</span><span style="color: #ff0000">interval</span><span style="color: #0000ff">="30"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">ant&nbsp;</span><span style="color: #ff0000">anthome</span><span style="color: #0000ff">="apache-ant-1.6.3"</span><span style="color: #ff0000">&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buildfile</span><span style="color: #0000ff">="projects/hello/build.xml"</span><span style="color: #ff0000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;target</span><span style="color: #0000ff">="CI"</span><span style="color: #0000ff">/&gt;</span><span style="color: #0000ff">&lt;!</span><span style="color: #ff00ff">—构建时执行的build.xml&nbsp;--</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">schedule</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">log</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">merge&nbsp;</span><span style="color: #ff0000">dir</span><span style="color: #0000ff">="projects/hello/test-reports"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">log</span><span style="color: #0000ff">&gt;</span><span style="color: #0000ff">&lt;!</span><span style="color: #ff00ff">—记载日志报告的位置&nbsp;--</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">publishers</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">artifactspublisher&nbsp;</span><span style="color: #ff0000">dest</span><span style="color: #0000ff">="artifacts"</span><span style="color: #ff0000">&nbsp;file</span><span style="color: #0000ff">="projects/hello/target/hello.jar"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">publishers</span><span style="color: #0000ff">&gt;</span><span style="color: #0000ff">&lt;!</span><span style="color: #ff00ff">—发布jar包的位置，我都是在build.xml中将jar包打好放在这个位置&nbsp;--</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">project</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">cruisecontrol</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></div>
<br />
本人自己config.xml<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">&lt;</span><span style="color: #800000">cruisecontrol</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">project&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="CruiseControlTest"</span><span style="color: #ff0000">&nbsp;buildafterfailed</span><span style="color: #0000ff">="true"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">listeners</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">currentbuildstatuslistener&nbsp;</span><span style="color: #ff0000">file</span><span style="color: #0000ff">="logs/CruiseControlTest/status.txt"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">listeners</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">bootstrappers</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">antbootstrapper&nbsp;</span><span style="color: #ff0000">anthome</span><span style="color: #0000ff">="apache-ant-1.7.0"</span><span style="color: #ff0000">&nbsp;buildfile</span><span style="color: #0000ff">="projects/CruiseControlTest/build.xml"</span><span style="color: #ff0000">&nbsp;target</span><span style="color: #0000ff">="clean"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">svnbootstrapper&nbsp;</span><span style="color: #ff0000">localWorkingCopy</span><span style="color: #0000ff">="projects/CruiseControlTest"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">bootstrappers</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">modificationset&nbsp;</span><span style="color: #ff0000">quietperiod</span><span style="color: #0000ff">="30"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">&lt;!--</span><span style="color: #008000">&nbsp;系统自动检查版本库,如发生变化，这执行update</span><span style="color: #008000">--&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">svn&nbsp;</span><span style="color: #ff0000">LocalWorkingCopy</span><span style="color: #0000ff">="projects/CruiseControlTest"</span><span style="color: #ff0000">&nbsp;&nbsp;username</span><span style="color: #0000ff">="XXX"</span><span style="color: #ff0000">&nbsp;password</span><span style="color: #0000ff">="XXX"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">modificationset</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">schedule&nbsp;</span><span style="color: #ff0000">interval</span><span style="color: #0000ff">="30"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">ant&nbsp;</span><span style="color: #ff0000">anthome</span><span style="color: #0000ff">="apache-ant-1.7.0"</span><span style="color: #ff0000">&nbsp;buildfile</span><span style="color: #0000ff">="projects/CruiseControlTest/build.xml"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">schedule</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">log</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">&lt;!--</span><span style="color: #008000">&nbsp;此处位置一定要配置正确，CC才能正确的显示测试结果，否则，CC只会用行测试用例，但是报告No&nbsp;Tests&nbsp;Run&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;This&nbsp;project&nbsp;doesn't&nbsp;have&nbsp;any&nbsp;tests&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">--&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">merge&nbsp;</span><span style="color: #ff0000">dir</span><span style="color: #0000ff">="projects/CruiseControlTest/target/test-results"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">log</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">publishers</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">onsuccess</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">artifactspublisher&nbsp;</span><span style="color: #ff0000">dest</span><span style="color: #0000ff">="artifacts/CruiseControlTest"</span><span style="color: #ff0000">&nbsp;file</span><span style="color: #0000ff">="projects/CruiseControlTest/target/CruiseControlTest.jar"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">onsuccess</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">email&nbsp;</span><span style="color: #ff0000">mailhost</span><span style="color: #0000ff">="example.cn"</span><span style="color: #ff0000">&nbsp;returnaddress</span><span style="color: #0000ff">="system@example.cn"</span><span style="color: #ff0000">&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;skipusers</span><span style="color: #0000ff">="true"</span><span style="color: #ff0000">&nbsp;&nbsp;&nbsp;subjectprefix</span><span style="color: #0000ff">="[CruiseControl]"</span><span style="color: #ff0000">&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buildresultsurl</span><span style="color: #0000ff">="http://localhost:8888/buildresults/CruiseControlTest"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">failure&nbsp;</span><span style="color: #ff0000">address</span><span style="color: #0000ff">="system@example.cn"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000">&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">success&nbsp;</span><span style="color: #ff0000">address</span><span style="color: #0000ff">="system@example.cn"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000">&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">email</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">publishers</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">project</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">cruisecontrol</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<br />
<br />
<img src ="http://www.blogjava.net/baoyaer/aggbug/215240.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2008-07-16 16:14 <a href="http://www.blogjava.net/baoyaer/articles/215240.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>maven2 起步 </title><link>http://www.blogjava.net/baoyaer/articles/193523.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Wed, 16 Apr 2008 09:32:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/193523.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/193523.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/193523.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/193523.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/193523.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;安装：&nbsp;&nbsp;&nbsp; 安装maven2很简单，把下载来的maven包解开就行了。（目前我的配置都在win2003上，还没有应用于linux，所有所有的配置都针对windows).增加相应的环境变量m2_home=maven2的安装目录，不要忘了设置java_home的目录。另外在path中增加%m2_home%\bin;可以直接在命令行下面使用mvn。...&nbsp;&nbsp;<a href='http://www.blogjava.net/baoyaer/articles/193523.html'>阅读全文</a><img src ="http://www.blogjava.net/baoyaer/aggbug/193523.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2008-04-16 17:32 <a href="http://www.blogjava.net/baoyaer/articles/193523.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>windows安装基于Apache的SVN服务器(包括SSL配置)[</title><link>http://www.blogjava.net/baoyaer/articles/191482.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Tue, 08 Apr 2008 06:38:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/191482.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/191482.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/191482.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/191482.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/191482.html</trackback:ping><description><![CDATA[<strong>1. 引言</strong><br />
在所有的Subversion服务器配置方式中，基于Apache的是最灵活的。虽然配置起来有一点点复杂，但是它提供了其它方式所没有的好处：<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">WebDAV<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />基于Apache配置的Subversion服务器使用了被许多其它程序支持的WebDAV协议。举个例子，你可以在Windows的资源管理器中将这样的一个版本库挂载成一个&#8220;Webfolder&#8221;，然后像文件系统中的其它文件夹一样访问它。<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />浏览版本库<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />你可以在不安装Subversion客户端的情况下，使用浏览器来浏览版本库中的内容。这将使得更大范围的用户可以访问你的数据。<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />用户验证<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />你可以使用任何Apache支持的验证机制，包括SSPI和LDAP。<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />安全<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />Apache是非常的稳定和安全，因此你的版本库自然而然地拥有同样的安全性。包括SSL加密。<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<br />
. 安装过程<br />
<strong>2.1. 安装Apache</strong><br />
安装Apache前，你要有一台运行Windows2000、Windows XP + sp1或Windows2003的电脑。<br />
<br />
<em>警告</em>：请注意，没安装Service Pack 1的Windows XP将导致错误的网络数据从而破坏你的版本库！<br />
<br />
从<a href="http://httpd.apache.org/download.cgi" target="_blank">http://httpd.apache.org/download.cgi</a> 最新版本的Apache Web服务器。确保你下载的版本大于2.0.54。2.0.54版本的Apache将不能与Subversion 1.3.xx配合工作。而且，小于2.0.54的Apache也因为在windows上的编译存在一个bug而导致不能与subversion1.2配合使用。<br />
<br />
一旦你已经有了Apache2的安装程序，你可以双击它，它将引导你完成整个安装过程。请确保你输入正确的服务器URL（如果你的服务器没有DNS名称，你可以直接输入IP地址）。我建议你将Apache安装成 for all Users,on Port 80,as a service。注意：如果你已经有一个IIS或者其它的程序使用80端口，安装可能会失败。如果是这样，你可以到程序目录下的Apache Group\Apache2\conf目录中找到文件httpd.conf，将其中的Listen 80改成一个不用的端口，比如Listen 81。然后重新运行这个安装程序，这次应该不会再有问题了。<br />
<br />
现在你可以在你的浏览器中键入 <a href="http://loccalhost/" target="_blank">http://loccalhost</a>，如果呈现了一个已经配置好的网站，那么你的Apache就安装成功了。<br />
<br />
<em>警告</em>：<br />
<br />
如果你将Apache安装成一个服务，它将以本地system帐户来运行。为Apache创建一个单独的用户来运行它将会更安全一些。<br />
<br />
请确保运行Apache的用户有版本库的完全访问<span class="t_tag" onclick="tagshow(event)" href="tag.php?name=%E6%9D%83%E9%99%90">权限</span>（右键版本库目录-&gt;属性-&gt;安全）。要不然，用户将无法提交他们的更改。<br />
<br />
就算Apache以本机system来运行，你也要设置它能完全读写版本库目录。<br />
<br />
如果没有为Apache配置这个许可，用户将会得到"禁止访问"的错误信息，在Apache的错误日志中表现为错误500。<br />
<br />
<strong>2.2. 安装Subversion</strong><br />
从<a href="http://subversion.tigris.org/servlets/ProjectDocumentList?folderID=91" target="_blank">http://subversion.tigris.org/ser ... entList?folderID=91</a> (英文)<br />
或<br />
<a href="http://bbs.iusesvn.com/forum-7-1.html" target="_blank">http://bbs.iusesvn.com/forum-7-1.html</a>（<span class="t_tag" onclick="tagshow(event)" href="tag.php?name=%E4%B8%AD%E6%96%87">中文</span>）下载最新版本的Subversion。<br />
<br />
运行Subversion安装程序，如果安装程序能够识别你已经安装了Apache，那么你的安装基本上就OK了。如果它不能，那么你要做一些额外的步骤。<br />
<em>注：如果你先安装Apache，再安装Subversion，正常情况下下面的工作(2.3配置前)Subversion安装程序已经帮你完成了</em><br />
使用资源管理器，进入Sibversion的安装目录（通常为c:\program files\Subversion），找到文件httpd/mod_dav_svn.so和mod_authz_svn.so，将它们拷贝到Apache的modules目录（通常为c:\program files\apache group\apache2\modules）。<br />
<br />
从Subversion的安装目录拷贝文件libdb43.dll到Apache的modules目录。<br />
<br />
使用如记事本之类的文本编辑器编辑Apache的配置文件(通常为c:\program files\apache group\apache2\conf\httd.conf)，修改以下内容：<br />
<br />
去掉以下行的注释（将开头的#删除）：<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">#LoadModule&nbsp;dav_fs_module&nbsp;modules</span><span style="color: #000000">/</span><span style="color: #000000">mod_dav_fs.so&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />#LoadModule&nbsp;dav_module&nbsp;modules</span><span style="color: #000000">/</span><span style="color: #000000">mod_dav.so<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<br />
在LoadModule节的最后添加以下两行：<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">LoadModule&nbsp;dav_svn_module&nbsp;modules</span><span style="color: #000000">/</span><span style="color: #000000">mod_dav_svn.so&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />LoadModule&nbsp;authz_svn_module&nbsp;modules</span><span style="color: #000000">/</span><span style="color: #000000">mod_authz_svn.so<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<br />
<br />
<strong>2.3. 配置</strong><br />
现在，你已经安装了Apache和Subversion，但是Apache还不知道如果处理像TortoiseSVN一样的Subversion客户端。要让Apache知道哪个URL将被Subversion使用，你要像下面这样编辑Apache的配置文件（通常在c:\program files\apache group\apache2\conf\httpd.conf）：<br />
<br />
在配置文件的最后添加下面这些行：<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">&lt;</span><span style="color: #000000">Location&nbsp;</span><span style="color: #000000">/</span><span style="color: #000000">svn</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />DAV&nbsp;svn<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />SVNParentPath&nbsp;D:\SVN&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />AuthType&nbsp;Basic&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />AuthName&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">Subversion&nbsp;repositories</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />AuthUserFile&nbsp;D:\passwd&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />#AuthzSVNAccessFile&nbsp;D:\svnaccessfile&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />Require&nbsp;valid</span><span style="color: #000000">-</span><span style="color: #000000">user&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000">&lt;/</span><span style="color: #000000">Location</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<br />
<br />
这样配置表示：你所有的版本库将位于D:\SVN目录下，要访问你的版本库可以使用这样的URL：<a href="http://myserver/svn/" target="_blank">http://MyServer/svn/</a>，访问权限将由passwd文件中的用户名/密码来限制。<br />
<br />
要创建passwd文件，可以打开命令行(DOS窗口)，将当前目录切换到apache2目录（通常为c:\program files\apache group\apache2），然后打入以下命令以创建文件：<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">bin\htpasswd&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">c&nbsp;passwd&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">username</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<br />
<br />
此命令执行bin目录下的htpasswd.exe来创建一个密码文件，重启Apache服务。<br />
<br />
将你的浏览器指向<a href="http://myserver/svn/MyNewRepository%28MyNewRepository" target="_blank">http://MyServer/svn/MyNewRepository(MyNewRepository</a>是你之前创建的Subversion版本库)。如果一切正常，你将被提示输入用户名密码，输入正确的用户名密码后你就可以看到版本库中的内容了。<br />
<br />
对你刚刚输入的apache配置作一些简短的说明：<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">&lt;</span><span style="color: #000000">Location&nbsp;</span><span style="color: #000000">/</span><span style="color: #000000">svn</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />意味着可以通过像这样的URL(http:</span><span style="color: #008000">//</span><span style="color: #008000">MyServer/svn)来访问Subversion版本库</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />DAV&nbsp;svn<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />告诉Apache哪个模块负责服务像那样的URL－－在这里就是Subversion模块<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />SVNListParentPath&nbsp;on<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />在Subversion&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">.3及更高版本中，这个指示器使得Subversion列出由SVNParentPath指定的目录下所有的版本库<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />SVNParentPath&nbsp;D:\SVN<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />告诉Subversion在目录D:\SVN下寻找版本库<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />AuthType&nbsp;Basic<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />启用基本的验证，比如用户名</span><span style="color: #000000">/</span><span style="color: #000000">密码对<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />AuthName&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">Subversion&nbsp;repositories</span><span style="color: #000000">"</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />当一个验证对话框弹出时，告诉用户这个验证是用来做什么的<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />AuthUserFile&nbsp;D:\passwd<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />指定D:\passwd用为密码文件用来验证用户的用户名及密码<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />AuthzSVNAccessFile&nbsp;D:\svnaccessfile<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />指定D:\svnaccessfile来限定各个用户或组在版本库中目录的访问权限<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />Require&nbsp;valid</span><span style="color: #000000">-</span><span style="color: #000000">user<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />限定用户只有输入正确的用户名及密码后才能访问这个路径<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<br />
<br />
上面的配置仅仅是一个简单的示例。你还可以对Apache进行许许多多的配置。<br />
<br />
1如果你想让所有用户对版本库都有读的权限而只有特定的用户才有写的权限，你可以将这行
<div class="blockcode"><span class="headactions" onclick="copycode($('code4'));">复制内容到剪贴板</span>
<h5>代码:</h5>
<code id="code4">Require valid-user</code></div>
改为
<div class="blockcode"><span class="headactions" onclick="copycode($('code5'));">复制内容到剪贴板</span>
<h5>代码:</h5>
<code id="code5">&lt;LimitExcept GET PROPFIND OPTIONS REPORT&gt;<br />
Require valid-user<br />
&lt;/LimitExcept&gt;</code></div>
2上面的配置使用了passwd文件将你所有的版本库作为一个单元来限定访问权限。如果你想获得更多的控制，如限定某个用户可以访问版本库中的哪个目录，可以把下面这行的#去掉：
<div class="blockcode"><span class="headactions" onclick="copycode($('code6'));">复制内容到剪贴板</span>
<h5>代码:</h5>
<code id="code6">#AuthzSVNAccessFile D:\svnaccessfile</code></div>
然后用文本编辑器创建一个Subversion授权文件。Apache将确保只有有效的用户可以访问你的/svn位置，然后将用户名传到AuthzSVNAccessFile模块，这样可以依据Subversion授权文件得到更精细的权限控制。注意，路径将被指定为[库:路径]或者简单的[路径]。如果你不明确指定一个库，访问规则将应用到由SVNParentPath指定的目录下所有的版本库中。一个授权文件例子可能像这样：<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">[groups]<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />admin&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;john,&nbsp;kate<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />devteam1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;john,&nbsp;rachel,&nbsp;sally<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />devteam2&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;kate,&nbsp;peter,&nbsp;mark<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />docs&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;bob,&nbsp;jane,&nbsp;mike<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />training&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;zak<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />#&nbsp;为所有库指定默认访问规则<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />#&nbsp;所有人可以读，管理员可以写，危险分子没有任何权限<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />[</span><span style="color: #000000">/</span><span style="color: #000000">]<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;r<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />@admin&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;rw<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />dangerman&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />#&nbsp;允许开发人员可以完全访问他们的项目版本库<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />[proj1:</span><span style="color: #000000">/</span><span style="color: #000000">]<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />@devteam1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;rw<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />[proj2:</span><span style="color: #000000">/</span><span style="color: #000000">]<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />@devteam2&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;rw<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />[bigproj:</span><span style="color: #000000">/</span><span style="color: #000000">]<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />@devteam1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;rw<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />@devteam2&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;rw<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />trevor&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;rw<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />#&nbsp;文档编写人员对所有的docs目录有写权限<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />[</span><span style="color: #000000">/</span><span style="color: #000000">trunk</span><span style="color: #000000">/</span><span style="color: #000000">doc]<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />@docs&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;rw<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />#&nbsp;培训人员可以完全访问培训版本库<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />[TrainingRepos:</span><span style="color: #000000">/</span><span style="color: #000000">]<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />@training&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;rw<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<br />
<br />
<strong>2.4. 使用SSL来保护你的服务器</strong><br />
以上的工作已经可以让你的svn服务器正常工作了。<br />
如果你要更安全一些，可以配置ssl来保护你的服务器。<br />
因为美国出口限制，默认安装的Apache服务器不支持SSL。但是你自己可以很容易地在其它地方下载到所需要的模块，然后安装它。<br />
<br />
首先你需要SSL的必需文件。你可以<a href="http://hunter.campbus.com/" target="_blank">http://hunter.campbus.com/</a> 或这里找到相应的软件包（或者下载本主题的附件1： <img class="absmiddle" alt="" src="http://bbs.iusesvn.com/images/attachicons/rar.gif" border="0" /> <span id="attach_24" onmouseover="showMenu(this.id)" style="white-space: nowrap"><a href="http://bbs.iusesvn.com/attachment.php?aid=24" target="_blank"><strong>mod_ssl_etc.rar</strong></a> (595.45 KB)</span>
<div class="t_attach" id="attach_24_menu" style="display: none; position: absolute"><img class="absmiddle" alt="" src="http://bbs.iusesvn.com/images/attachicons/rar.gif" border="0" /> <a href="http://bbs.iusesvn.com/attachment.php?aid=24" target="_blank"><strong>mod_ssl_etc.rar</strong></a> (595.45 KB)<br />
下载次数: 2714<br />
<div class="t_smallfont">2006-10-16 15:30</div>
</div>
）。然后只要将包解开将其中的mod_ssl.so拷到Apache的modules目录、openssl.exe、libeay32.dll、ssleay32.dll拷到bin目录、conf/ssl.conf拷到conf目录。<br />
<br />
在Apache的conf目录中用文本编辑器打开ssl.conf。<br />
<br />
将下面这些行用#注释掉：
<div class="blockcode"><span class="headactions" onclick="copycode($('code8'));">复制内容到剪贴板</span>
<h5>代码:</h5>
<code id="code8">DocumentRoot "c:/apache/htdocs"<br />
ServerName [url]www.example.com:443[/url]<br />
ServerAdmin [email]you@example.com[/email]<br />
ErrorLog logs/<span class="t_tag" onclick="tagshow(event)" href="tag.php?name=error">error</span>_log<br />
TransferLog logs/access_log</code></div>
修改
<div class="blockcode"><span class="headactions" onclick="copycode($('code9'));">复制内容到剪贴板</span>
<h5>代码:</h5>
<code id="code9">SSLCertificateFile conf/ssl.crt/server.crt</code></div>
为
<div class="blockcode"><span class="headactions" onclick="copycode($('code10'));">复制内容到剪贴板</span>
<h5>代码:</h5>
<code id="code10">SSLCertificateFile conf/ssl/my-server.cert</code></div>
修改
<div class="blockcode"><span class="headactions" onclick="copycode($('code11'));">复制内容到剪贴板</span>
<h5>代码:</h5>
<code id="code11">SSLCertificateKeyFile conf/ssl.key/server.key</code></div>
为
<div class="blockcode"><span class="headactions" onclick="copycode($('code12'));">复制内容到剪贴板</span>
<h5>代码:</h5>
<code id="code12">SSLCertificateKeyFile conf/ssl/my-server.key</code></div>
修改
<div class="blockcode"><span class="headactions" onclick="copycode($('code13'));">复制内容到剪贴板</span>
<h5>代码:</h5>
<code id="code13">SSLMutex file:logs/ssl_mutex</code></div>
为
<div class="blockcode"><span class="headactions" onclick="copycode($('code14'));">复制内容到剪贴板</span>
<h5>代码:</h5>
<code id="code14">SSLMutex default</code></div>
删除以下两行(如果有)：
<div class="blockcode"><span class="headactions" onclick="copycode($('code15'));">复制内容到剪贴板</span>
<h5>代码:</h5>
<code id="code15">&lt;IfDefine SSL&gt;<br />
&lt;/IfDefine&gt;</code></div>
打开Apache配置文件(httpd.conf)，去掉这行的注释
<div class="blockcode"><span class="headactions" onclick="copycode($('code16'));">复制内容到剪贴板</span>
<h5>代码:</h5>
<code id="code16">#LoadModule ssl_module modules/mod_ssl.so</code></div>
Openssl需要一个配置文件。你可以从这里下载一个可工作的版本<a href="http://tud.at/programm/openssl.cnf" target="_blank">http://tud.at/programm/openssl.cnf</a> (或者本主题附件2： <img class="absmiddle" alt="" src="http://bbs.iusesvn.com/images/attachicons/rar.gif" border="0" /> <span id="attach_25" onmouseover="showMenu(this.id)" style="white-space: nowrap"><a href="http://bbs.iusesvn.com/attachment.php?aid=25" target="_blank"><strong>openssl.cnf.rar</strong></a> (1.21 KB)</span>
<div class="t_attach" id="attach_25_menu" style="display: none; position: absolute"><img class="absmiddle" alt="" src="http://bbs.iusesvn.com/images/attachicons/rar.gif" border="0" /> <a href="http://bbs.iusesvn.com/attachment.php?aid=25" target="_blank"><strong>openssl.cnf.rar</strong></a> (1.21 KB)<br />
下载次数: 1496<br />
<div class="t_smallfont">2006-9-10 19:11</div>
</div>
)。将它保存到bin/openssl.cnf。<br />
<br />
下面你要创建一个SSL证书。你可以打开一个命令行窗口，然后cd到Apache安装目录（比如C:\program files\apache group\apache2），敲入以下命令：
<div class="blockcode"><span class="headactions" onclick="copycode($('code17'));">复制内容到剪贴板</span>
<h5>代码:</h5>
<code id="code17">bin\openssl req -config bin\openssl.cnf -new -out my-server.csr</code></div>
你将被问及一句口令短语。请注意，不要使用简单的几个词，而应该输入一整个句子，比如一篇诗词的一部份，越长越好。同样，你还要输入你的服务器URL。然后其它的问题都是可选问答的，不过我建议你也将它们填充。<br />
<br />
下一步，敲入以下命令：
<div class="blockcode"><span class="headactions" onclick="copycode($('code18'));">复制内容到剪贴板</span>
<h5>代码:</h5>
<code id="code18">bin\openssl rsa -in privkey.pem -out my-server.key</code></div>
以及（注意，只有一行）
<div class="blockcode"><span class="headactions" onclick="copycode($('code19'));">复制内容到剪贴板</span>
<h5>代码:</h5>
<code id="code19">bin\openssl x509 -in my-server.csr -out my-server.cert -req -signkey my-server.key -days 4000</code></div>
这样将创建一个4000天后才过期的证书。最后敲入：
<div class="blockcode"><span class="headactions" onclick="copycode($('code20'));">复制内容到剪贴板</span>
<h5>代码:</h5>
<code id="code20">bin\openssl x509 -in my-server.cert -out my-server.der.crt -outform DER</code></div>
这些命令在Apache目录下创建了一些文件（my-server.der.crt, my-server.csr, my-server.key, .rnd, privkey.pem, my-server.cert）。将这些文件拷贝到目录conf/ssl<br />
<br />
（比如C:\program files\apache group\apache2\conf\ssl），如果目录ssl不存在，你必须先创建一个。<br />
<br />
重启Apache服务。<br />
<br />
现在可以用类似这样的url来访问你的版本库了<a href="https://servername/svn/project" target="_blank">https://servername/svn/project</a>
<div class="quote">
<h5>引用:</h5>
<blockquote>强制通过SSL来访问<br />
<br />
当你配置了SSL来提高版本库安全时，你可能想禁用无SSL的http访问方式，而只允许通过https访问。要达到这种效果，你要在&lt;Location&gt;块加入另外一个指示器SSLRequireSSL。<br />
<br />
一个示例&lt;Location&gt;块可能像这样：<br />
<br />
&lt;Location /svn&gt;<br />
<br />
DAV svn<br />
<br />
SVNParentPath D:\SVN<br />
<br />
SSLRequireSSL<br />
<br />
AuthType Basic<br />
<br />
AuthName "Subversion repositories"<br />
<br />
AuthUserFile passwd<br />
<br />
#AuthzSVNAccessFile svnaccessfile<br />
<br />
Require valid-user<br />
<br />
&lt;/Location&gt;</blockquote></div>
<img src ="http://www.blogjava.net/baoyaer/aggbug/191482.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2008-04-08 14:38 <a href="http://www.blogjava.net/baoyaer/articles/191482.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ant  实例操作</title><link>http://www.blogjava.net/baoyaer/articles/169126.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Thu, 20 Dec 2007 10:36:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/169126.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/169126.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/169126.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/169126.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/169126.html</trackback:ping><description><![CDATA[<p>做互联网应用的各位tx都已经被部署过程的繁琐烦透了吧？</p>
<p>先要压缩，然后一台机器一台机器的上传，接着还要停止服务器，解压缩，重新启动。。。。。。</p>
<p>如果只有两天台机器，那么还可以忍受；但是如果你有七八台机器要部署时，你的感觉一定是要疯掉了。更何况如工程比较大的话，压缩、上传都要花费很多的时间，我们宝贵的时间就这样溜走了。更可恶的是我们很多时候需要加班也是因为部署的效率太慢。</p>
<p>废话太多了，还是直接进入主题吧，让你和我们一起分享部署的乐趣吧！</p>
<p>&nbsp;</p>
<p>首先说明几个主要的ant命令：</p>
<ol>
    <li>scp：一个optional task，用来上传文件到远程服务器上；
    <li>sshexec：ssh大家很熟悉吧？这个任务就是用来执行一个ssh脚本命令，可以执行远程服务器的命令；
    <li>fileset：这个大家应该也比较熟悉，用来设置一个文件的集合，关键的是它的一个子元素date可以用来设定文件的日期范围，比如&lt;date datetime="2007.12.18 00:00:00" pattern="yyyy.MM.dd HH:mm:ss" when="after" /&gt;指定2007年12月18日以后的文件，具体的说明请参见<a href="http://ant.apache.org/manual/index.html">http://ant.apache.org/manual/index.html</a>； </li>
</ol>
<p>主要就是这几个命令，很简单吧。</p>
<p>接着我们分析一下我们部署的一般流程吧。</p>
<ol>
    <li>我们要先把本地的文件压缩到一个压缩文件中，实现增量部署的关键也是在这里（感谢付成睿的帮助）。最好的方式是每次只压缩最近修改的内容，而那些没有修改的内容没有必要再次上传。压缩一个时间点以后的文件可以通过date来实现，不过我们需要自动的记录上一次部署的时间。现在有两种方式可以做这件事，一种是付成睿的，比较简单，但会修改配置文件；另外一种就是我的方式，也就是将日期保存到一个文件中，如果没有文件就认为是全部部署，并创建文件。<br />
    具体的代码如下：<br />
    <font style="font-size: 10.5pt">&nbsp;&lt;target name="appZipModified"&gt;<br style="font-size: 10.5pt" />
    &nbsp;&nbsp;&lt;!-- 判断文件是否存在 --&gt;<br style="font-size: 10.5pt" />
    &nbsp;&nbsp;&lt;condition property="local.app.timestamp.present"&gt;<br style="font-size: 10.5pt" />
    &nbsp;&nbsp;&nbsp;&lt;available file="${app.zip.timestamp.file}" type="file" /&gt;<br style="font-size: 10.5pt" />
    &nbsp;&nbsp;&lt;/condition&gt;<br style="font-size: 10.5pt" />
    &nbsp;&nbsp;&lt;!-- 如果文件不存在则创建文件&nbsp;--&gt;<br style="font-size: 10.5pt" />
    &nbsp;&nbsp;&lt;antcall target="mkStampFile"&gt;<br style="font-size: 10.5pt" />
    &nbsp;&nbsp;&nbsp;&lt;param name="zipFilePresent" value="${local.app.timestamp.present}" /&gt;<br style="font-size: 10.5pt" />
    &nbsp;&nbsp;&nbsp;&lt;param name="newZipFile" value="${app.zip.timestamp.file}" /&gt;<br style="font-size: 10.5pt" />
    &nbsp;&nbsp;&lt;/antcall&gt;<br style="font-size: 10.5pt" />
    &nbsp; &lt;!-- 从文件中获取上次部署的时间&nbsp;--&gt;<br style="font-size: 10.5pt" />
    &nbsp;&nbsp;&lt;echo&gt;Load the old timestamp from the disk file&lt;/echo&gt;<br style="font-size: 10.5pt" />
    &nbsp;&nbsp;&lt;loadfile property="old.zip.timestamp" srcFile="${app.zip.timestamp.file}" /&gt;<br style="font-size: 10.5pt" />
    &nbsp;&nbsp;&lt;!--&nbsp;获取当前时间&nbsp;--&gt;<br style="font-size: 10.5pt" />
    &nbsp; &lt;tstamp&gt;<br style="font-size: 10.5pt" />
    &nbsp;&nbsp;&nbsp;&lt;format property="this.zip.timestamp" pattern="${ts.pattern}" /&gt;<br style="font-size: 10.5pt" />
    &nbsp;&nbsp;&lt;/tstamp&gt;<br style="font-size: 10.5pt" />
    &nbsp;&nbsp;&lt;echo&gt;zip the new modified files &amp;amp; folders that after ${old.zip.timestamp} to ${appzip} &lt;/echo&gt;<br style="font-size: 10.5pt" />
    &nbsp;&nbsp;&lt;!-- 先删除上次的zip文件，这样保证上次的压缩的文件不会再次上传&nbsp;--&gt;<br style="font-size: 10.5pt" />
    &nbsp;&nbsp;&lt;delete file="${appzip}" /&gt;<br style="font-size: 10.5pt" />
    &nbsp;&nbsp;&lt;!-- 执行压缩操作&nbsp;--&gt;<br style="font-size: 10.5pt" />
    &nbsp;&nbsp;&lt;zip destfile="${appzip}"&gt;<br style="font-size: 10.5pt" />
    &nbsp;&nbsp;&nbsp;&lt;fileset dir="../WebRoot"&gt;<br style="font-size: 10.5pt" />
    &nbsp;&nbsp;&nbsp;&nbsp;&lt;include name="**/*" /&gt;<br style="font-size: 10.5pt" />
    &nbsp;&nbsp;&nbsp; &lt;!-- 这个语句是关键，只压缩old.zip.timestamp以后修改的文件&nbsp;--&gt;<br style="font-size: 10.5pt" />
    &nbsp;&nbsp;&nbsp;&nbsp;&lt;date datetime="${old.zip.timestamp}" pattern="${ts.pattern}" when="after" /&gt;<br style="font-size: 10.5pt" />
    &nbsp;&nbsp;&nbsp;&lt;/fileset&gt;<br style="font-size: 10.5pt" />
    &nbsp;&nbsp;&lt;/zip&gt;<br style="font-size: 10.5pt" />
    &nbsp;&nbsp;&lt;echo&gt;Replace the old timestamp with the new timestamp&lt;/echo&gt;<br style="font-size: 10.5pt" />
    &nbsp;&nbsp;&lt;!-- 最后将当前的时间更新到文件中&nbsp;--&gt;<br style="font-size: 10.5pt" />
    &nbsp;&nbsp;&lt;replace file="${app.zip.timestamp.file}" token="${old.zip.timestamp}" value="${this.zip.timestamp}" /&gt;<br style="font-size: 10.5pt" />
    &nbsp;&lt;/target&gt;<br style="font-size: 10.5pt" />
    &nbsp;&lt;!-- 创建文件的操作，unless的含义是zipFilePresent为false时才执行，与之对应的是if&nbsp;--&gt;<br style="font-size: 10.5pt" />
    &nbsp;&lt;target name="mkStampFile" unless="zipFilePresent"&gt;<br style="font-size: 10.5pt" />
    &nbsp;&nbsp;&lt;echo&gt;Create txt file to store timestamp&lt;/echo&gt;<br style="font-size: 10.5pt" />
    &nbsp;&nbsp;&lt;!-- 创建一个文件&nbsp;--&gt;<br style="font-size: 10.5pt" />
    &nbsp;&nbsp;&lt;touch file="${newZipFile}" datetime="12/19/2007 21:20 pm" /&gt;<br style="font-size: 10.5pt" />
    &nbsp; &lt;!-- 应用正则表达式的replace命令，写入一个很早的时间（正则真是太神奇了！）&nbsp;--&gt;<br style="font-size: 10.5pt" />
    &nbsp;&nbsp;&lt;replaceregexp file="${newZipFile}" match=".*" replace="2000.01.01 00:00:00" byline="true" /&gt;<br style="font-size: 10.5pt" />
    &nbsp;&lt;/target&gt;<br style="font-size: 10.5pt" />
    <font style="font-size: 12pt"><br />
    这种方式还是比较复杂的，使用付成睿的方法则更简单。只是需要在properties文件中增加last.zip.timestamp的设置。<br />
    <font style="font-size: 10.5pt">&nbsp;&lt;target name="zipModified"&gt;<br style="font-size: 10.5pt" />
    &nbsp;&nbsp;&lt;echo&gt;zip modified files&lt;/echo&gt;<br style="font-size: 10.5pt" />
    &nbsp;&nbsp;&lt;echo&gt;get current time stamp&lt;/echo&gt;<br style="font-size: 10.5pt" />
    &nbsp;&nbsp;&lt;tstamp&gt;<br style="font-size: 10.5pt" />
    &nbsp;&nbsp;&nbsp;&lt;format property="this.zip.timestamp" pattern="${ts.pattern}" /&gt;<br style="font-size: 10.5pt" />
    &nbsp;&nbsp;&lt;/tstamp&gt;<br style="font-size: 10.5pt" />
    &nbsp;&nbsp;&lt;echo&gt;current time stamp: ${this.zip.timestamp}&lt;/echo&gt;<br style="font-size: 10.5pt" />
    </font></font></font><font style="font-size: 10.5pt"><font style="font-size: 10.5pt">&nbsp;&nbsp;&lt;echo&gt;zip modified files aflter ${last.zip.timestamp}&lt;/echo&gt;<br style="font-size: 10.5pt" />
    &nbsp;&nbsp;&lt;zip destfile="${local.testZip}"&gt;<br style="font-size: 10.5pt" />
    &nbsp;&nbsp;&nbsp;&lt;fileset dir="./test"&gt;<br style="font-size: 10.5pt" />
    &nbsp;&nbsp;&nbsp;&nbsp;&lt;date datetime="${last.zip.timestamp}" pattern="${ts.pattern}" when="after" /&gt;<br style="font-size: 10.5pt" />
    &nbsp;&nbsp;&nbsp;&lt;/fileset&gt;<br style="font-size: 10.5pt" />
    &nbsp;&nbsp;&lt;/zip&gt;<br style="font-size: 10.5pt" />
    </font></font><font style="font-size: 10.5pt"><font style="font-size: 10.5pt">&nbsp;&nbsp;&lt;echo&gt;save this zip time stamp&lt;/echo&gt;<br style="font-size: 10.5pt" />
    &nbsp;&nbsp;&lt;replace file="build.properties" token="${last.zip.timestamp}" value="${this.zip.timestamp}" /&gt;<br style="font-size: 10.5pt" />
    </font></font><font style="font-size: 10.5pt"><font style="font-size: 10.5pt">&nbsp;&lt;/target&gt;<br style="font-size: 10.5pt" />
    </font></font>
    <li>有了zip文件后下面就需要把文件上传到服务器上，方法如下：<br />
    <font style="font-size: 10.5pt">&nbsp;&lt;!-- 上传zip压缩文件 --&gt;<br style="font-size: 10.5pt" />
    &nbsp;&lt;target name="uploadZipApp" description="upload ziped app file to remote server"&gt;<br style="font-size: 10.5pt" />
    &nbsp;&nbsp;&lt;echo&gt;upload ziped app file to remote server&lt;/echo&gt;<br style="font-size: 10.5pt" />
    &nbsp;&nbsp;&lt;scp file="${appzip}" todir="user</font><a href="mailto:user@$%7Bhost%7D:/path/test.zip"><font style="font-size: 10.5pt">@${host}:/path/test.zip</font></a><font style="font-size: 10.5pt">" password="${pass}" trust="yes" /&gt;<br style="font-size: 10.5pt" />
    &nbsp;&lt;/target&gt;<br style="font-size: 10.5pt" />
    </font>很简单吧？
    <li>上传完后就是在服务器的操作了（例子用的是unix），包括解压缩、停止服务器、重新启动等，主要还是如何远程调用服务器命令。<br />
    下面的例子是将文件解压缩，最关键的是sshexec命令的用法。<br />
    <font style="font-size: 10.5pt">&nbsp;&nbsp;&lt;!-- 解压缩备份文件 --&gt;<br style="font-size: 10.5pt" />
    &nbsp;&lt;target name="unZipBackupResource" description="decompress the backup tar file back to the file system"&gt;<br style="font-size: 10.5pt" />
    &nbsp;&nbsp;&lt;echo&gt;decompress the backup tar file back to the file system&lt;/echo&gt;<br style="font-size: 10.5pt" />
    &nbsp;&nbsp;&lt;sshexec host="${host}" username="user" command="<strong style="font-size: 10.5pt">tar xvf test.tar</strong>" password="${pass}" trust="yes" /&gt;<br style="font-size: 10.5pt" />
    &nbsp;&lt;/target&gt;<br style="font-size: 10.5pt" />
    </font>做其他的操作只要把上面例子中的黑体字部分去掉就可以了。
    <li>最后最好将一个完整的部署流程封装到一个target中，这样部署一台服务器只要输入相应的密码就可以了。
    <li>而现在部署时你要做的操作只是在outline模式下在一个部署的target上点击右键，然后run就可以了。 </li>
</ol>
<p>这就是完整的流程。</p>
<p>如果部署的是jsp文件或者静态文件，那就更简单了，直接上传解压缩就可以了。</p>
<p>其他tz有什么更好的方法也一起分享啊，我在这算是抛砖引玉了。。。。。。</p>
<img src ="http://www.blogjava.net/baoyaer/aggbug/169126.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2007-12-20 18:36 <a href="http://www.blogjava.net/baoyaer/articles/169126.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Eclipse一个新发现（用了一年才知道的  ^^） </title><link>http://www.blogjava.net/baoyaer/articles/167490.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Thu, 13 Dec 2007 06:15:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/167490.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/167490.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/167490.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/167490.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/167490.html</trackback:ping><description><![CDATA[Eclipse竟然有条件设置断点功能，今天同事发现的<br />
<br />
<br />
<img style="width: 383px; height: 337px" height="337" alt="" src="http://www.blogjava.net/images/blogjava_net/baoyaer/canImageupload/eclipse_unknow1.gif" width="383" border="0" /><br />
<br />
<br />
<br />
<br />
<img alt="" src="http://www.blogjava.net/images/blogjava_net/baoyaer/eclipse_unkonw2.gif" border="0" />
<img src ="http://www.blogjava.net/baoyaer/aggbug/167490.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2007-12-13 14:15 <a href="http://www.blogjava.net/baoyaer/articles/167490.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Tomcat6.0   ||  5.5 中数据源的配置 </title><link>http://www.blogjava.net/baoyaer/articles/167442.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Thu, 13 Dec 2007 03:08:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/167442.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/167442.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/167442.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/167442.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/167442.html</trackback:ping><description><![CDATA[<strong style="color: red">Tomcat6.0&nbsp;:</strong><br />
<br />
&nbsp;在$CATALINA_HOME/conf/server.xml文件中的&lt;Host&gt;&lt;/Host&gt;标签之间加入如下的Context代码<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">Context&nbsp;</span><span style="color: #ff0000">path</span><span style="color: #0000ff">="/articlesystem"</span><span style="color: #ff0000">&nbsp;docBase</span><span style="color: #0000ff">="articlesystem"</span><span style="color: #ff0000">&nbsp;debug</span><span style="color: #0000ff">="5"</span><span style="color: #ff0000">&nbsp;reloadable</span><span style="color: #0000ff">="true"</span><span style="color: #ff0000">&nbsp;crossContext</span><span style="color: #0000ff">="true"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">Resource&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="jdbc/StrutsArticle"</span><span style="color: #ff0000">&nbsp;auth</span><span style="color: #0000ff">="Container"</span><span style="color: #ff0000">&nbsp;type</span><span style="color: #0000ff">="javax.sql.DataSource"</span><span style="color: #ff0000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;maxActive</span><span style="color: #0000ff">="100"</span><span style="color: #ff0000">&nbsp;maxIdle</span><span style="color: #0000ff">="30"</span><span style="color: #ff0000">&nbsp;maxWait</span><span style="color: #0000ff">="10000"</span><span style="color: #ff0000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;username</span><span style="color: #0000ff">="root"</span><span style="color: #ff0000">&nbsp;password</span><span style="color: #0000ff">="root"</span><span style="color: #ff0000">&nbsp;driverClassName</span><span style="color: #0000ff">="com.mysql.jdbc.Driver"</span><span style="color: #ff0000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;url</span><span style="color: #0000ff">="jdbc:mysql://localhost:3306/strutsaritclecharacterEncoding=GBK&amp;amp;useUnicode=TRUE&amp;amp;autoReconnect=true"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">Context</span><span style="color: #0000ff">&gt;</span></div>
<span style="color: red">注意要把这段代码配置到Host&gt;&lt;/Host&gt;标签之间。<br />
</span><br />
完成以上工作后，数据库就配置成功了。。也不必像官方文档说的那样在、在web应用的web.xml中配置&lt;resource-ref&gt;标签的属性了。<br />
<p>另. Context元素代表一个web应用，运行在某个特定的虚拟主机上。你可以在一个Host元素中嵌套任意多的Context元素。每个Context的路径必须是惟一的，由path属性定义。</p>
<p>所有Context的实现支持如下属性：<br />
<br />
<table cellpadding="5" border="1">
    <tbody>
        <tr>
            <th width="15%" bgcolor="#023264"><font color="#ffffff">属性</font></th>
            <th width="75%" bgcolor="#023264"><font color="#ffffff">描述</font></th>
        </tr>
        <tr>
            <td valign="middle" align="left"><code><font face="新宋体">backgroundProcessorDelay</font></code></td>
            <td valign="top" align="left"><code><font face="新宋体">这个</font></code>值代表在context及其子容器（包括所有的wrappers）上调用backgroundProcess方法的延时，以秒为单位。如果延时值非负，子容器不会被调用，也就是说子容器使用自己的处理线程。如果该值为正，会创建一个新的线程。在等待指定的时间以后，该线程在主机及其 子容器上调用backgroundProcess方法。context利用后台处理session过期，监测类的变化用于重新载入。如果没有指定，该属性的缺省值是－1，说明context依赖其所属的Host的后台处理。</td>
        </tr>
        <tr>
            <td valign="middle" align="left"><code><font face="新宋体">className</font></code></td>
            <td valign="top" align="left">实现的Java类名。该类必须实现<code><font face="新宋体">org.apache.catalina.Context</font></code>接口。如果没有指定，使用标准实现（在下面定义）。</td>
        </tr>
        <tr>
            <td valign="middle" align="left"><code><font face="新宋体">cookies</font></code></td>
            <td valign="top" align="left">
            <p>如果想利用cookies来传递session identifier（需要客户端支持cookies），设为ture。否则为false，这种情况下只能依靠URL Rewriting传递session identifier。</p>
            <p>&nbsp;</p>
            </td>
        </tr>
        <tr>
            <td valign="middle" align="left"><code><font face="新宋体">crossContext</font></code></td>
            <td valign="top" align="left">
            <p>如果想在应用内调用ServletContext.getContext()来返回在该虚拟主机上运行的其他web application的request dispatcher,设为true。在安全性很重要的环境中，设为false，使得getContext()总是返回null。缺省值为false。</p>
            </td>
        </tr>
        <tr>
            <td valign="middle" align="left"><code><font face="新宋体">docBase</font></code></td>
            <td valign="middle" align="left">
            <p>该web应用的文档基准目录（Document Base，也称为Context Root），或者是WAR文件的路径。可以使用绝对路径，也可以使用相对于context所属的Host的appBase路径。</p>
            <p>&nbsp;</p>
            </td>
        </tr>
        <tr>
            <td valign="middle" align="left"><code><font face="新宋体">override</font></code></td>
            <td valign="middle" align="left">
            <p>如果想利用该Context元素中的设置覆盖DefaultContext中相应的设置，设为true。缺省情况下使用DefaultContext中的设置。</p>
            </td>
        </tr>
        <tr>
            <td valign="middle" align="left"><code><font face="新宋体">privileged</font></code></td>
            <td valign="middle" align="left">
            <p>设为true，允许context使用container servlets，比如manager servlet。</p>
            <p>&nbsp;</p>
            </td>
        </tr>
        <tr>
            <td valign="middle" align="left"><code><font face="新宋体">path</font></code></td>
            <td valign="top" align="left">
            <p>web应用的context路径。catalina将每个URL的起始和context path进行比较，选择合适的web应用处理该请求。特定Host下的context path必须是惟一的。如果context path为空字符串（""），这个context是所属Host的缺省web应用,用来处理不能匹配任何context path的请求。</p>
            <p>&nbsp;</p>
            </td>
        </tr>
        <tr>
            <td valign="middle" align="left"><code><font face="新宋体">reloadable</font></code></td>
            <td valign="top" align="left">如果希望Catalina监视/WEB-INF/classes/和/WEB-INF/lib下面的类是否发生变化，在发生变化的时候自动重载web application，设为true。这个特征在开发阶段很有用，但也大大增加了服务器的开销。因此，在发布以后，不推荐使用。但是，你可以使用Manager应用在必要的时候触发应用的重载。</td>
        </tr>
        <tr>
            <td valign="middle" align="left"><code><font face="新宋体">wrapperClass</font></code></td>
            <td valign="middle" align="left">
            <p>org.apache.catalina.Wrapper实现类的名称，用于该Context管理的servlets。如果没有指定，使用标准的缺省值。</p>
            </td>
        </tr>
    </tbody>
</table>
<br />
<br />
<br />
&nbsp;java代码得到连接:<br />
</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">&nbsp;Context&nbsp;initCtx&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;InitialContext();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Context&nbsp;ctx&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(Context)initCtx.lookup(</span><span style="color: #000000">"</span><span style="color: #000000">java:comp/env</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object&nbsp;obj&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(Object)&nbsp;ctx.lookup(</span><span style="color: #000000">"</span><span style="color: #000000">jdbc/sqlserver</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;javax.sql.DataSource&nbsp;ds&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(javax.sql.DataSource)obj;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conn&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;ds.getConnection();</span></div>
<br />
<br />
&nbsp;Hibernate得到连接:<br />
<br />
在hibernate-cfg.xml中<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="connection.datasource"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">java:comp/env/jdbc/sqlserver</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">property</span><span style="color: #0000ff">&gt;</span></div>
<br />
<br />
&nbsp;Spring中得到连接:<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">&lt;</span><span style="color: #800000">bean&nbsp;</span><span style="color: #ff0000">id</span><span style="color: #0000ff">="dataSource"</span><span style="color: #ff0000">&nbsp;class</span><span style="color: #0000ff">="org.springframework.jndi.JndiObjectFactoryBean"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="jndiName"</span><span style="color: #0000ff">&gt;&lt;</span><span style="color: #800000">value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">java:comp/env/jdbc/dermis</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">value</span><span style="color: #0000ff">&gt;&lt;/</span><span style="color: #800000">property</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">bean</span><span style="color: #0000ff">&gt;</span></div>
<br />
<p>&nbsp;如果你用的是jboss服务器:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 把java:comp/env 改成java:就足够了</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果你用的是apache的dbcp包:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1.type="org.apache.commons.dbcp.BasicDataSouce"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.driverClassName="net.sourceforge.jtds.jdbc.Driver"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3.url="jdbc:jtds:sqlserver://127.0.0.1:1433/dataBasename"</p>
<p>&nbsp;如果你用的是MySQL:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1.driverClassName="com.mysql.jdbc.Driver"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.url="jdbc:mysql://127.0.0.1:3306/dbname"<br />
&nbsp;如果是Oracle:<br />
&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1.driverClassName="oracel.jdbc.driver.OracleDriver"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.url="jdbc:oracle:thin://127.0.0.1:1521/dbname"&nbsp; </p>
<span style="color: red">Tomcat 5.5<br />
<p>首先编辑Server.xml，添加数据源代码<br />
</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">&lt;</span><span style="color: #800000">Context&nbsp;</span><span style="color: #ff0000">path</span><span style="color: #0000ff">="/StudentManager"</span><span style="color: #ff0000">&nbsp;docbase</span><span style="color: #0000ff">="StudentManager"</span><span style="color: #ff0000">&nbsp;debug</span><span style="color: #0000ff">="5"</span><span style="color: #ff0000">&nbsp;reload</span><span style="color: #0000ff">="true"</span><span style="color: #ff0000">&nbsp;crossContext</span><span style="color: #0000ff">="true"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">Resource&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="jdbc/StudentManager"</span><span style="color: #ff0000">&nbsp;auth</span><span style="color: #0000ff">="Container"</span><span style="color: #ff0000">&nbsp;type</span><span style="color: #0000ff">="javax.sql.DataSource"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">ResourceParams&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="jdbc/StudentManager"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">parameter</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">factory</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">values</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">org.apache.commons.dbcp.BasicDataSourceFactory</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">values</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">parameter</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">parameter</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">url</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">values</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">jdbc:mysql://localhost:3306/studentmanager</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">values</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">parameter</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">parameter</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">driverclassname</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">values</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">com.mysql.jdbc.Driver</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">values</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">parameter</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">parameter</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">username</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">values</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">root</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">values</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">parameter</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">parameter</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">password</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">values</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">root</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">values</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">parameter</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">parameter</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">maxWait</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">values</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">3000</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">values</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">parameter</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">parameter</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">maxIdle</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">values</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">10</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">values</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">parameter</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">parameter</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">maxActive</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">values</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">100</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">values</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">parameter</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">ResourceParams</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">Context</span><span style="color: #0000ff">&gt;</span></div>
<p>在Web.xml中加入对jndi的引用<br />
</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">&lt;</span><span style="color: #800000">resource-ref</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">description</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">SqlServer&nbsp;&nbsp;&nbsp;Datasource&nbsp;&nbsp;&nbsp;example</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">description</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">res-ref-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">jdbc/StudentManager</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">res-ref-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">res-type</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">javax.sql.DataSource</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">res-type</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">res-auth</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">Container</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">res-auth</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">resource-ref</span><span style="color: #0000ff">&gt;</span></div>
<p>&nbsp;</p>
<p>测试代码：</p>
<p><br />
&nbsp;</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img id="Codehighlighter1_2_664_Open_Image" onclick="this.style.display='none'; Codehighlighter1_2_664_Open_Text.style.display='none'; Codehighlighter1_2_664_Closed_Image.style.display='inline'; Codehighlighter1_2_664_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_2_664_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_2_664_Closed_Text.style.display='none'; Codehighlighter1_2_664_Open_Image.style.display='inline'; Codehighlighter1_2_664_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /><span style="color: #000000; background-color: #ffff00">&lt;%</span><span id="Codehighlighter1_2_664_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_2_664_Open_Text"><span style="color: #000000; background-color: #f5f5f5"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; background-color: #f5f5f5">String</span><span style="color: #000000; background-color: #f5f5f5">&nbsp;jndi</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">java:comp/env/jdbc/StudentManager</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;DataSource&nbsp;ds</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #0000ff; background-color: #f5f5f5">null</span><span style="color: #000000; background-color: #f5f5f5">;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />{&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Context&nbsp;initCtx</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #0000ff; background-color: #f5f5f5">new</span><span style="color: #000000; background-color: #f5f5f5">&nbsp;InitialContext();&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; background-color: #f5f5f5">//</span><span style="color: #000000; background-color: #f5f5f5">初始化上下文，可以读配置文件如：web.xml&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; background-color: #f5f5f5">if</span><span style="color: #000000; background-color: #f5f5f5">(initCtx</span><span style="color: #000000; background-color: #f5f5f5">==</span><span style="color: #0000ff; background-color: #f5f5f5">null</span><span style="color: #000000; background-color: #f5f5f5">)&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;</span><span style="color: #0000ff; background-color: #f5f5f5">new</span><span style="color: #000000; background-color: #f5f5f5">&nbsp;Exception(</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">Initial&nbsp;&nbsp;&nbsp;Failed!</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Context&nbsp;ctx</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5">(Context)initCtx.lookup(</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">java:comp/env</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">);&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; background-color: #f5f5f5">if</span><span style="color: #000000; background-color: #f5f5f5">(ctx!</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #0000ff; background-color: #f5f5f5">null</span><span style="color: #000000; background-color: #f5f5f5">)&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ds</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5">(DataSource)ctx.lookup(</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">jdbc/StudentManager</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">);&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; background-color: #f5f5f5">if</span><span style="color: #000000; background-color: #f5f5f5">(ds</span><span style="color: #000000; background-color: #f5f5f5">==</span><span style="color: #0000ff; background-color: #f5f5f5">null</span><span style="color: #000000; background-color: #f5f5f5">)&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;</span><span style="color: #0000ff; background-color: #f5f5f5">new</span><span style="color: #000000; background-color: #f5f5f5">&nbsp;Exception(</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">Look&nbsp;&nbsp;&nbsp;up&nbsp;&nbsp;&nbsp;DataSource&nbsp;&nbsp;&nbsp;Failed!</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">);&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;catch(Exception&nbsp;e)<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />{&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(e.getMessage());&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;}<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(ds);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />&nbsp;</span></span><span style="color: #000000; background-color: #ffff00">%&gt;</span></div>
<p><br />
&nbsp;</p>
</span>
<img src ="http://www.blogjava.net/baoyaer/aggbug/167442.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2007-12-13 11:08 <a href="http://www.blogjava.net/baoyaer/articles/167442.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>谁在使用这个端口</title><link>http://www.blogjava.net/baoyaer/articles/167315.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Wed, 12 Dec 2007 11:51:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/167315.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/167315.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/167315.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/167315.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/167315.html</trackback:ping><description><![CDATA[<p>谁在使用这个端口？&nbsp; </p>
<p>经常，我们在启动应用的时候发现系统需要的端口被别的程序占用，如何知道谁占有了我们需要的端口，很多人都比较头疼，下面就介绍一种非常简单的方法，希望对大家有用 </p>
<p>假如我们需要确定谁占用了我们的9050端口 </p>
<p>1、Windows平台<br />
在windows命令行窗口下执行：</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">C:\&gt;netstat&nbsp;-aon|findstr&nbsp;"9050"&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />TCP&nbsp;&nbsp;&nbsp;&nbsp;127.0.0.1:9050&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0.0.0.0:0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LISTENING&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2016&nbsp;</span></div>
<br />
看到了吗，端口被进程号为2016的进程占用，继续执行下面命令：<br />
<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">C:\&gt;tasklist|findstr&nbsp;"2016"&nbsp;</span></div>
<br />
tor.exe&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2016 Console&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp; 16,064 K<br />
很清楚吧，tor占用了你的端口 <br />
<img src ="http://www.blogjava.net/baoyaer/aggbug/167315.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2007-12-12 19:51 <a href="http://www.blogjava.net/baoyaer/articles/167315.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>apache + resin的多机部署方案实现方法</title><link>http://www.blogjava.net/baoyaer/articles/167113.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Wed, 12 Dec 2007 01:07:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/167113.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/167113.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/167113.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/167113.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/167113.html</trackback:ping><description><![CDATA[<p>前言：前段时间，对公司前台多机分布方案的做了一些探索，总结了一些东西，贴出来分享。类似内容网上比较多，但是都不够详细，我第一次弄时费力不少，希望后来人可以更方便一些。</p>
<p>一. 编译安装apache <br />
1) 从apache官网上下载apache最新的 release版本2.2.6 <br />
unix版本取httpd-2.2.6.tar.gz <br />
2) 解开包 <br />
gunzip httpd-2.2.6.tar.gz <br />
tar xvf httpd-2.2.6.tar <br />
3) 编译安装 <br />
进入解压后的目录httpd-2.2.6，依次执行 <br />
./configure --prefix=/*要安装apache的目录*/ --enable-so <br />
make <br />
make install <br />
成功后apache就安装到前面指定的目录了</p>
<p>二) 启动apache <br />
进入apache安装目录 <br />
1) 修改apache/conf/httpd.conf <br />
Listen 80 修改80为需要的端口如 11280 <br />
2) 启动 <br />
进入apache/bin/执行： ./apachectl start <br />
3) 打开浏览起访问 <br />
<a href="http://ip:2011280/" target="blank">http://ip: 11280</a> </p>
<p>三) 编译安装resin</p>
<p>./configure --prefix=/data/aoxj/artest/resin --with-apxs=/data/aoxj/artest/apache/bin/apxs --with-apache=/data/aoxj/artest/apache <br />
make <br />
make install <br />
上述操作除了编译安装resin外（其实不做这些操作，resin本身也是可以跑起来的），还会修改apache，包括： <br />
1. copy mod_caucho.so到apache目录（就是前面指定的--with-apache=/data/aoxj/artest/apache）的modules <br />
2. 修改apache的配置文件conf/httpd.conf，自动增加以下内容 <br />
LoadModule caucho_module ***/modules/mod_caucho.so <br />
ResinConfigServer localhost 6802 <br />
CauchoConfigCacheDirectory /tmp <br />
CauchoStatus yes </p>
<p>四）配置resin <br />
需要修改resin.conf文件</p>
<p>&lt;cluster&gt; <br />
&lt;srun server-id="a" host="192.168.0.1" port="6802"/&gt; <br />
&lt;srun server-id="a" host="192.168.0.1" port="6802"/&gt; <br />
&lt;/cluster&gt;</p>
<p>五）启动resin <br />
运行resin/bin/httpd.sh <br />
注意一定要加-server，否则resin启动后是监听80/8080这样的端口，而不是上面cluster设置里面的6802 <br />
./httpd.sh -server a start <br />
这样resin才会监听6802，建议手工telnet确认一下。如果resin启动不正确，后面apache启动后访问resin就会失败，然后在页面报503错误。 <br />
以后stop/restart 时也需要加-server</p>
<p>六) 配置apache <br />
确认conf/httpd.conf文件中的以下内容 <br />
1) LoadModule caucho_module ***/modules/mod_caucho.so <br />
检查mod_caucho.so是否存在 <br />
2) ResinConfigServer localhost 6802 <br />
这个ResinConfigServer只能出现一行,如果resin有多台,请在这里指定的那台resin配置文件中的&lt;cluster&gt;中配置其他机器的ip/port <br />
3) CauchoConfigCacheDirectory /tmp <br />
4)CauchoStatus yes </p>
<p>最后修改的配置为: </p>
<p>LoadModule caucho_module "/data/aoxj/artest/apache/modules/mod_caucho.so" <br />
ResinConfigServer 192.168.0.1 6802 <br />
AddHandler caucho-request .action <br />
CauchoConfigCacheDirectory /tmp <br />
CauchoStatus yes</p>
<p>八）web访问 <br />
启动apache <br />
用浏览器访问apache的端口，注意不是访问resin的端口 </p>
<img src ="http://www.blogjava.net/baoyaer/aggbug/167113.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2007-12-12 09:07 <a href="http://www.blogjava.net/baoyaer/articles/167113.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【服务配置】apache+tomcat配置负载均衡的网站 【摘】      </title><link>http://www.blogjava.net/baoyaer/articles/153476.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Wed, 17 Oct 2007 02:01:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/153476.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/153476.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/153476.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/153476.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/153476.html</trackback:ping><description><![CDATA[<div>
<p><a href="http://www.blogjava.net/flyffa/archive/2006/11/06/79356.aspx">http://www.blogjava.net/flyffa/archive/2006/11/06/79356.aspx</a></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;在网上找了一些文档，还是觉得不是很清楚，自己走了些弯路，才把这个配置好，还是写下来吧，以备后查。 </p>
<h1 style="margin: 17pt 0cm 16.5pt 21.25pt; text-indent: -21.25pt; tab-stops: list 21.25pt">1.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp; </span><span style="font-family: 宋体">目标</span> </h1>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">使用</span> apache <span style="font-family: 宋体">和</span> tomcat <span style="font-family: 宋体">配置一个可以应用的</span> web <span style="font-family: 宋体">网站，要达到以下要求：</span> </p>
<p style="margin: 0cm 0cm 0pt 18pt; text-indent: -18pt; tab-stops: list 18.0pt">1、&nbsp;Apache <span style="font-family: 宋体">做为</span> HttpServer <span style="font-family: 宋体">，后面连接多个</span> tomcat <span style="font-family: 宋体">应用实例，并进行负载均衡。</span> </p>
<p style="margin: 0cm 0cm 0pt 18pt; text-indent: -18pt; tab-stops: list 18.0pt">2、&nbsp;<span style="font-family: 宋体">为系统设定</span> Session <span style="font-family: 宋体">超时时间，包括</span> Apache <span style="font-family: 宋体">和</span> tomcat </p>
<p style="margin: 0cm 0cm 0pt 18pt; text-indent: -18pt; tab-stops: list 18.0pt">3、&nbsp;<span style="font-family: 宋体">为系统屏蔽文件列表，包括</span> Apache <span style="font-family: 宋体">和</span> tomcat </p>
<h1 style="margin: 17pt 0cm 16.5pt 21.25pt; text-indent: -21.25pt; tab-stops: list 21.25pt">2.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp; </span><span style="font-family: 宋体">安装</span> tomcat </h1>
<h2 style="margin: 13pt 0cm 13pt 1cm; text-indent: -1cm; tab-stops: list 1.0cm">2.1. <span style="font-family: 黑体">下载，解压</span> tomcat </h2>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">不要下载安装版</span> , <span style="font-family: 宋体">下载地址</span> </p>
<p style="margin: 0cm 0cm 0pt"><a href="http://tomcat.apache.org/">http://tomcat.apache.org</a> </p>
<h2 style="margin: 13pt 0cm 13pt 1cm; text-indent: -1cm; tab-stops: list 1.0cm">2.2. <span style="font-family: 黑体">配置</span> tomcat </h2>
<h3 style="margin: 13pt 0cm 13pt 35.45pt; text-indent: -35.45pt; tab-stops: list 35.45pt">2.2.1. <span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">配置</span> server <span style="font-family: 宋体">的关闭口</span> </h3>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span style="font-family: 宋体">我们需要在一台机器上跑</span> 2 <span style="font-family: 宋体">个不同的</span> tomcat <span style="font-family: 宋体">，需要修改不同的</span> tomcat <span style="font-family: 宋体">的关闭口，避免出现端口被占用的情况。在</span> server.xml <span style="font-family: 宋体">中找到</span> server, <span style="font-family: 宋体">将：</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="background: silver">&lt;Server port="8005" shutdown="SHUTDOWN"&gt;</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">改为</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="background: silver">&lt;Server port="<span style="color: #ff6600">XXXX</span>" shutdown="SHUTDOWN"&gt;</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="color: #ff6600">XXXX</span> <span style="font-family: 宋体">在这里表示不同的端口：我的两个</span> tomcat <span style="font-family: 宋体">分别使用</span> 8035 <span style="font-family: 宋体">，</span> 8045 </p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">注意：这里之所以要配置不同的</span> tomcat <span style="font-family: 宋体">关闭口，只是因为我们使用了多个</span> tomcat <span style="font-family: 宋体">，其实用一个</span> server <span style="font-family: 宋体">多个实例也可以。</span> </p>
<h3 style="margin: 13pt 0cm 13pt 35.45pt; text-indent: -35.45pt; tab-stops: list 35.45pt">2.2.2. <span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">配置</span> service </h3>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span style="font-family: 宋体">我们需要对不同的</span> tomcat <span style="font-family: 宋体">的</span> service <span style="font-family: 宋体">取不同的名字，在</span> server.xml <span style="font-family: 宋体">中找到：</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="background: silver">&lt;Service name="Catalina"&gt;</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">改为：</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="background: silver">&lt;Service name="<span style="color: #ff6600">XXXX</span>"&gt;</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">两个</span> service <span style="font-family: 宋体">分别为</span> tomcat6 <span style="font-family: 宋体">和</span> tomcat5 </p>
<h3 style="margin: 13pt 0cm 13pt 35.45pt; text-indent: -35.45pt; tab-stops: list 35.45pt">2.2.3. <span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">配置</span> Connector </h3>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">这个部分主要是要改两个</span> Connector <span style="font-family: 宋体">，当然前提是你的</span> tomcat <span style="font-family: 宋体">只有两个</span> Connector <span style="font-family: 宋体">。</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">修改</span> ajp1.3 <span style="font-family: 宋体">的端口：</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">找到：</span> <span style="background: silver">&lt;Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /&gt;</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">改为：</span> <span style="background: silver">&lt;Connector port="<span style="color: #ff6600">XXXX</span>" protocol="AJP/1.3" redirectPort="8443" /&gt;</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">两个</span> Service <span style="font-family: 宋体">的</span> ajp/1.3 <span style="font-family: 宋体">的端口分别为：</span> 8019 <span style="font-family: 宋体">，</span> 8029 </p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">修改</span> http <span style="font-family: 宋体">的端口：</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">找到：</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="background: silver">&lt;Connector port="8080" protocol="HTTP/1.1" </span></p>
<p style="margin: 0cm 0cm 0pt"><span style="background: silver">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; maxThreads="150" connectionTimeout="20000" </span></p>
<p style="margin: 0cm 0cm 0pt"><span style="background: silver">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; redirectPort="8443" /&gt;</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">改为：</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="background: silver">&lt;Connector port="<span style="color: #ff6600">XXXX</span>" protocol="HTTP/1.1" </span></p>
<p style="margin: 0cm 0cm 0pt"><span style="background: silver">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; maxThreads="150" connectionTimeout="20000" </span></p>
<p style="margin: 0cm 0cm 0pt"><span style="background: silver">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; redirectPort="8443" /&gt;</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">两个</span> Service <span style="font-family: 宋体">的</span> ajp/1.3 <span style="font-family: 宋体">的端口分别为：</span> 8060 <span style="font-family: 宋体">，</span> 8070 </p>
<h3 style="margin: 13pt 0cm 13pt 35.45pt; text-indent: -35.45pt; tab-stops: list 35.45pt">2.2.4. <span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">配置</span> Engine </h3>
<p style="margin: 0cm 0cm 0pt">Engine <span style="font-family: 宋体">主要是配置</span> jvmRoute <span style="font-family: 宋体">属性，找到：</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="background: silver">&lt;Engine name="Catalina" defaultHost="localhost"&gt;</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">改为：</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="background: silver">&lt;Engine jvmRoute="XXXX" name="Catalina" defaultHost="localhost"&gt;</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">两个实例分别为：</span> tomcat6 <span style="font-family: 宋体">和</span> tomcat5. </p>
<h3 style="margin: 13pt 0cm 13pt 35.45pt; text-indent: -35.45pt; tab-stops: list 35.45pt">2.2.5. <span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">配置公用性</span> Context </h3>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">如果有</span> Context <span style="font-family: 宋体">是多个系统公用的，比如图片等的存放地，可以做个配置：</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">在</span> Host <span style="font-family: 宋体">中增加：</span> </p>
<p style="background: white; margin: 0cm 0cm 0pt; line-height: 150%"><span style="font-size: 10pt; color: #4b4b4b; line-height: 150%; font-family: Verdana">&lt;Context path="/image" docBase="D:"webRoot"image" debug="0" reloadable="false" crossContext="true"&gt; </span></p>
<p style="background: white; margin: 0cm 0cm 0pt; line-height: 150%"><span style="font-size: 10pt; color: #4b4b4b; line-height: 150%; font-family: Verdana">&lt;/Context&gt; </span></p>
<h3 style="margin: 13pt 0cm 13pt 35.45pt; text-indent: -35.45pt; tab-stops: list 35.45pt">2.2.6. <span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">屏蔽文件列表 </span></h3>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">打开</span> tomcat <span style="font-family: 宋体">目录下的</span> conf/web.xml <span style="font-family: 宋体">，</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">找到：</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="background: silver">&lt;servlet&gt;</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="background: silver">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;servlet-name&gt;default&lt;/servlet-name&gt;</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="background: silver">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;servlet-class&gt;org.apache.catalina.servlets.DefaultServlet&lt;/servlet-class&gt;</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="background: silver">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;init-param&gt;</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="background: silver">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-name&gt;debug&lt;/param-name&gt;</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="background: silver">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-value&gt;0&lt;/param-value&gt;</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="background: silver">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/init-param&gt;</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="background: silver">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;init-param&gt;</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="background: silver">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-name&gt;listings&lt;/param-name&gt;</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="background: silver">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-value&gt;<span style="color: #ff6600">true</span>&lt;/param-value&gt;</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="background: silver">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/init-param&gt;</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="background: silver">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;load-on-startup&gt;1&lt;/load-on-startup&gt;</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="background: silver">&nbsp;&nbsp;&nbsp; &lt;/servlet&gt;</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">将</span> listings <span style="font-family: 宋体">参数改为</span> false; </p>
<h2 style="margin: 13pt 0cm 13pt 1cm; text-indent: -1cm; tab-stops: list 1.0cm">2.3. <span style="font-family: 黑体">配置应用</span> (web.xml) </h2>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">对系统应用做些控制。</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">配置</span> session <span style="font-family: 宋体">过期时间，大多数网站用户都只是做些浏览性的操作，为了减轻服务器负载压力，我们将</span> session <span style="font-family: 宋体">超时时间从默认的</span> 30 <span style="font-family: 宋体">分钟变为</span> 5 <span style="font-family: 宋体">分钟。</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">在</span> web <span style="font-family: 宋体">应用程序的</span> web.xml <span style="font-family: 宋体">中</span> servlet-mapping <span style="font-family: 宋体">之后增加如下一段：</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="background: silver">&lt;session-config&gt;</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="background: silver">&nbsp;&nbsp;&nbsp; &lt;session-timeout&gt;5&lt;/session-timeout&gt;</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="background: silver">&lt;/session-config&gt;</span> </p>
<h1 style="margin: 17pt 0cm 16.5pt 21.25pt; text-indent: -21.25pt; tab-stops: list 21.25pt">3.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp; </span><span style="font-family: 宋体">安装</span> Apache </h1>
<h2 style="margin: 13pt 0cm 13pt 1cm; text-indent: -1cm; tab-stops: list 1.0cm">3.1. <span style="font-family: 黑体">下载、安装</span> Apache </h2>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">下载地址</span> <a href="http://httpd.apache.org/download.cgi">http://httpd.apache.org/download.cgi</a> </p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">下载后点击安装</span> msi <span style="font-family: 宋体">文件。</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">安装的时候没有什么特别需要注意的地方，按照默认就行了。是否安装为</span> service <span style="font-family: 宋体">看具体情况而定。</span> </p>
<h2 style="margin: 13pt 0cm 13pt 1cm; text-indent: -1cm; tab-stops: list 1.0cm">3.2. <span style="font-family: 黑体">下载、安装</span> Apache <span style="font-family: 黑体">、</span> tomcat <span style="font-family: 黑体">的</span> Connector </h2>
<p style="margin: 0cm 0cm 0pt"><a href="http://tomcat.apache.org/download-connectors.cgi">http://tomcat.apache.org/download-connectors.cgi</a> </p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">注意，很多网站上都介绍是</span> JK2 <span style="font-family: 宋体">，可能是觉得</span> JK2 <span style="font-family: 宋体">比</span> JK <span style="font-family: 宋体">要新吧，其实</span> JK2 <span style="font-family: 宋体">已经停止研发了，建议使用</span> jk1.2 <span style="font-family: 宋体">。</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">下载压缩包，之后将</span> module <span style="font-family: 宋体">目录中的</span> <span style="color: #4b4b4b">mod_jk-apache****.so</span> <span style="color: #4b4b4b; font-family: 宋体">文件放入</span> <span style="color: #4b4b4b">/module/</span> <span style="color: #4b4b4b; font-family: 宋体">目录下。</span> </p>
<h2 style="margin: 13pt 0cm 13pt 1cm; text-indent: -1cm; tab-stops: list 1.0cm">3.3. <span style="font-family: 黑体">配置</span> Apache <span style="font-family: 黑体">（</span> httpd.conf <span style="font-family: 黑体">）</span> </h2>
<h3 style="margin: 13pt 0cm 13pt 35.45pt; text-indent: -35.45pt; tab-stops: list 35.45pt">3.3.1. <span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">配置端口： </span></h3>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">找到</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="background: silver">Listen 80</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">改为</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="background: silver">Listen **</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">当然如果不需要改的话，就不用改了。正常情况无须更改。</span> </p>
<h3 style="margin: 13pt 0cm 13pt 35.45pt; text-indent: -35.45pt; tab-stops: list 35.45pt">3.3.2. <span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">配置</span> DocumentRoot </h3>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">找到</span> DocumentRoot <span style="font-family: 宋体">段，将其改为：</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="background: silver">DocumentRoot "E:/MyWebsite"</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">这里的</span> <span style="background: silver">"E:/MyWebsite"</span> <span style="font-family: 宋体">指的是你的</span> web <span style="font-family: 宋体">程序的根路径，视具体应用而定。</span> </p>
<h3 style="margin: 13pt 0cm 13pt 35.45pt; text-indent: -35.45pt; tab-stops: list 35.45pt">3.3.3. <span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">配置</span> serverName </h3>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">找到</span> serverName <span style="font-family: 宋体">这个段，将其配置为你的</span> ServerName </p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">如果没有配置为域名，配为</span> IP <span style="font-family: 宋体">也可以，此处还不是很清楚，多虚拟主机的情况的配置。</span> </p>
<h3 style="margin: 13pt 0cm 13pt 35.45pt; text-indent: -35.45pt; tab-stops: list 35.45pt">3.3.4. <span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">配置虚拟主机 </span></h3>
<p style="margin: 0cm 0cm 0pt"><span style="background: silver">&lt;VirtualHost *:80&gt;</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="background: silver">&nbsp;&nbsp;&nbsp; ServerAdmin flyffa@gmail.com</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="background: silver">&nbsp;&nbsp;&nbsp; DocumentRoot&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; E:/MyWebsite</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="background: silver">&nbsp;&nbsp;&nbsp; ServerName localhost</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="background: silver">&nbsp;&nbsp;&nbsp; DirectoryIndex index.html index.htm index.jsp</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="background: silver">&nbsp;&nbsp;&nbsp; ErrorLog logs/error_log</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="background: silver">&nbsp;&nbsp;&nbsp; CustomLog logs/access_log common</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="background: silver">&nbsp;&nbsp;&nbsp; ErrorDocument 404 /sys/logon.jsp</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="background: silver">&lt;/VirtualHost&gt;</span> </p>
<h2 style="margin: 13pt 0cm 13pt 1cm; text-indent: -1cm; tab-stops: list 1.0cm">3.4. <span style="font-family: 黑体">配置</span> JK <span style="font-family: 黑体">方式的负载均衡</span> </h2>
<h3 style="margin: 13pt 0cm 13pt 35.45pt; text-indent: -35.45pt; tab-stops: list 35.45pt">3.4.1. <span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">配置</span> module </h3>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">我们需要与</span> tomcat <span style="font-family: 宋体">做连接，所以要把</span> tomcat <span style="font-family: 宋体">的</span> connector <span style="font-family: 宋体">的模块配置进去。</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">在</span> LoadModule <span style="font-family: 宋体">部分加入：</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="background: silver">LoadModule jk_module modules/mod_jk-apache-2.0.55.so</span> <span style="font-family: 宋体">－加载模块</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">这个</span> so <span style="font-family: 宋体">是我下载的版本，个人可以根据自己下载的文件名加以配置</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="background: silver">JkWorkersFile conf/workers.properties</span> <span style="font-family: 宋体">－指定</span> connector <span style="font-family: 宋体">的配置文件名称</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="background: silver">JkLogFile logs/mod_jk.log</span> <span style="font-family: 宋体">－指定</span> connector <span style="font-family: 宋体">的日志文件名称</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="background: silver">JkLogLevel info</span> <span style="font-family: 宋体">－指定</span> connector <span style="font-family: 宋体">的日志等级</span> </p>
<h3 style="margin: 13pt 0cm 13pt 35.45pt; text-indent: -35.45pt; tab-stops: list 35.45pt">3.4.2. <span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">配置</span> worker <span style="font-family: 宋体">列表</span> (conf/workers.properties) </h3>
<p style="margin: 0cm 0cm 0pt"><strong><span style="font-family: 宋体">定义列表</span> </strong></p>
<p style="margin: 0cm 0cm 0pt"><span style="background: silver">worker.list=tomcat6,tomcat5,loadbalancer</span> </p>
<p style="margin: 0cm 0cm 0pt"><strong><span style="font-family: 宋体">定义一个名为</span> &#8220;loadbalancer&#8221; </strong><strong><span style="font-family: 宋体">的</span> worker </strong></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">其作为对多个</span> Tomcat <span style="font-family: 宋体">进程的负载平衡使用：</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="background: silver">worker.loadbalancer.type=lb </span></p>
<p style="margin: 0cm 0cm 0pt"><span style="background: silver">worker.loadbalancer.balanced_workers=tomcat5, tomcat6</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">（</span> <span style="font-family: 宋体">负载平衡类型的</span> worker <span style="font-family: 宋体">并不与</span> Tomcat worker <span style="font-family: 宋体">通讯，它负责管理这些</span> Tomcat worker <span style="font-family: 宋体">。</span> <span style="font-family: 宋体">）</span> </p>
<p style="margin: 0cm 0cm 0pt"><strong><span style="font-family: 宋体">定义多个</span> worker </strong><strong><span style="font-family: 宋体">列表</span> </strong></p>
<p style="margin: 0cm 0cm 0pt"><span style="background: silver"># Set properties for tomcat6 (ajp13)</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="background: silver">worker.tomcat6.type=ajp13</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="background: silver">worker.tomcat6.host=localhost</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="background: silver">worker.tomcat6.port=8019</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="background: silver">worker.tomcat6.lbfactor=50</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="background: silver">worker.tomcat6.cachesize=10</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="background: silver">worker.tomcat6.cache_timeout=600</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="background: silver">worker.tomcat6.socket_keepalive=1</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="background: silver">worker.tomcat6.reclycle_timeout=300</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="background: silver"># Set properties for tomcat5 (ajp13)</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="background: silver">worker.tomcat5.type=ajp13</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="background: silver">worker.tomcat5.host=localhost</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="background: silver">worker.tomcat5.port=8029</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="background: silver">worker.tomcat5.lbfactor=50</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="background: silver">worker.tomcat5.cachesize=10</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="background: silver">worker.tomcat5.cache_timeout=600</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="background: silver">worker.tomcat5.socket_keepalive=1</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="background: silver">worker.tomcat5.reclycle_timeout=300</span> </p>
<p style="background: white; margin: 0cm 0cm 0pt 5.45pt; line-height: 150%"><span style="color: #ff6600; font-family: 宋体">注意：</span> <strong><span style="color: red; line-height: 150%">lbfactor=</span> </strong><strong><span style="color: blue; line-height: 150%">50</span> </strong><span style="font-family: 宋体">（</span> <span style="font-family: 宋体">当此</span> Tomcat worker <span style="font-family: 宋体">被用于一个负载平衡</span> worker <span style="font-family: 宋体">使用时，此属性将被使用。它定义了此</span> worker <span style="font-family: 宋体">的负载平衡权值。</span> <span style="font-family: 宋体">）</span> </p>
<p style="background: white; margin: 0cm 0cm 0pt 5.45pt; line-height: 150%"><strong><span style="color: red; line-height: 150%">cachesize=</span> </strong><strong><span style="color: blue; line-height: 150%">10</span> </strong><span style="font-family: 宋体">（</span> <span style="font-family: 宋体">当在多线程的</span> web server <span style="font-family: 宋体">（例如</span> apache2.0 <span style="font-family: 宋体">、</span> IIS <span style="font-family: 宋体">、</span> Netscape <span style="font-family: 宋体">）中使用</span> JK <span style="font-family: 宋体">时，此属性是有效的。如果将</span> cachesize <span style="font-family: 宋体">的值设置为较高的值，这些支持多线程的</span> web server <span style="font-family: 宋体">将获得很好的处理能力。如果此属性不被设置，则连接</span> cache <span style="font-family: 宋体">特性将失效。</span> <span style="font-family: 宋体">）</span> </p>
<h3 style="margin: 13pt 0cm 13pt 35.45pt; text-indent: -35.45pt; tab-stops: list 35.45pt">3.4.3. <span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">配置</span> Apache <span style="font-family: 宋体">到</span> tomcat <span style="font-family: 宋体">的桥接</span> </h3>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">在</span> DocumnetRoot <span style="font-family: 宋体">片段下加入</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="background: silver">JkMount /*.jsp tomcat6</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="background: silver">JkMount /*.do tomcat6</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="background: silver">JkMount /*Servlet tomcat6</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">这里只是简单的将</span> apache <span style="font-family: 宋体">的请求转到其中的一个</span> tomcat <span style="font-family: 宋体">中，形成桥接，至于负载均衡的时候，就无须进行这步操作，直接启动负载均衡。启动负载均衡见下一节。</span> </p>
<h3 style="margin: 13pt 0cm 13pt 35.45pt; text-indent: -35.45pt; tab-stops: list 35.45pt">3.4.4. <span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">启动负载均衡 </span></h3>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">在</span> DocumnetRoot <span style="font-family: 宋体">片段下加入</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="background: silver">JkMount /*.jsp loadbalancer</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="background: silver">JkMount /*.do loadbalancer</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="background: silver">JkMount /*Servlet loadbalancer</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">－指定对所有的请求启动负载均衡，这里的</span> loadbalancer <span style="font-family: 宋体">是<span style="color: #ff6600">定义的</span></span> <span style="color: #ff6600">worker</span> <span style="color: #ff6600; font-family: 宋体">的名字</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="color: red; font-family: 宋体">这里我在配置的时候犯了两个错误：</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="color: #ff6600; font-family: 宋体">第一是没有配置</span> <span style="background: silver">JkWorkersFile conf/workers.properties</span> <span style="font-family: 宋体">，以为</span> Apache <span style="font-family: 宋体">会自动认识（其实</span> apache <span style="font-family: 宋体">是自动产生了一个叫做</span> ajp13 <span style="font-family: 宋体">的</span> worker <span style="font-family: 宋体">，指向本机的</span> 8009 <span style="font-family: 宋体">端口）。</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">第二是以为</span> <span style="background: silver">JkMount</span> <span style="font-family: 宋体">语句中出现</span> loadbalancer,ajp13 <span style="font-family: 宋体">之类的是系统设定的东西，其实都是在</span> workers.properties <span style="font-family: 宋体">文件中定义的，结果出现名字不匹配的情况。后来配置了</span> <span style="background: silver">JkLogFile logs/mod_jk.log</span> <span style="font-family: 宋体">之后看到错误日志才明白。</span> </p>
<h2 style="margin: 13pt 0cm 13pt 1cm; text-indent: -1cm; tab-stops: list 1.0cm">3.5. <span style="font-family: 黑体">配置</span> Proxy <span style="font-family: 黑体">方式的负载均衡</span> </h2>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">使用</span> Apache2.1 <span style="font-family: 宋体">以上的版本，就可以用</span> mod_proxy_ajp <span style="font-family: 宋体">来完成负载均衡的配置，不过到目前为止，没有看到如何让</span> Apache <span style="font-family: 宋体">负责静态部分，</span> tomcat <span style="font-family: 宋体">负责动态部分的配置方式，只能用</span> path <span style="font-family: 宋体">进行区分分发请求。如：在虚拟主机的配置中增加：</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="background: silver">ProxyPass / ajp://localhost:8019/</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="background: silver">ProxyPassReverse / ajp://localhost:8019/</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">而形如：</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="background: silver">ProxyPass /*.jsp ajp://localhost:8019/</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="background: silver">ProxyPassReverse /*.jsp ajp://localhost:8019/</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">这样的配置是不能通过的。</span> </p>
</div>
<img src ="http://www.blogjava.net/baoyaer/aggbug/153476.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2007-10-17 10:01 <a href="http://www.blogjava.net/baoyaer/articles/153476.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Tomcat内存分配</title><link>http://www.blogjava.net/baoyaer/articles/153154.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Tue, 16 Oct 2007 01:07:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/153154.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/153154.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/153154.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/153154.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/153154.html</trackback:ping><description><![CDATA[<div>&nbsp;&nbsp; Tomcat默认可以使用的内存为128MB，在较大型的应用项目中，这点内存是不够的，轻微时，会使系统性能急剧下降，严重时,将导致系统无法运行，影响系统的稳定性。当内存不够用时，常见的问题就是报tomcat内存益处错误，从儿导致客户端包500错误的，如下：解决方法主要是加大TOMCAT可利用内存，并在程序当中加大内存使用。因此根据应用的需求，有必要调整JVM使用内存的大小。现在将手工修改tomcat内存的方法及注意事项列出，希望能对新人有所帮助。<br />
tomcat提供了两种安装模式，即免安装（*.zip）和安装（*.exe）方式。针对不同的安装方式下修改tomcat内存大小的方法几注意问题（windows环境）：<br />
&nbsp;方式1：当选择安装方式时，可以在安装tomcat的过程进行设置tomcat初始化内存的大小。但是假如说在安装时没有选择，或者应用改变了，需要增加tomcat内存时怎么半呢？此时，我们就要手工修改tomcat的一些文件了：<br />
&nbsp;看了很多网上的资料，都是说修改&lt;CATALINA_HOME&gt;\bin\catalina.bat文件的内容，即在里面增加一行代码：<br />
set JAVA_OPTS=-Xms512m -Xmx512m //表示初始化最小可用内存和最大可用内存都是512MB（修改相应值即可）<br />
&nbsp;<br />
&nbsp;如在catalina.bat的<br />
&nbsp;&nbsp;&nbsp;&nbsp; rem ----- Execute The Requested Command<br />
&nbsp;&nbsp;&nbsp;&nbsp; echo Using CATALINA_BASE:&nbsp;&nbsp; %CATALINA_BASE%<br />
&nbsp;&nbsp;&nbsp;&nbsp; echo Using CATALINA_HOME:&nbsp;&nbsp; %CATALINA_HOME%<br />
&nbsp;&nbsp;&nbsp;&nbsp; echo Using CATALINA_TMPDIR: %CATALINA_TMPDIR%<br />
&nbsp;&nbsp;&nbsp;&nbsp; echo Using JAVA_HOME:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; %JAVA_HOME%<br />
这一栏改为<br />
&nbsp;&nbsp;&nbsp; rem ----- Execute The Requested Command<br />
&nbsp;&nbsp;&nbsp; set JAVA_OPTS=-Xms512m -Xmx512m<br />
&nbsp;&nbsp;&nbsp; echo Using CATALINA_BASE:&nbsp;&nbsp; %CATALINA_BASE%<br />
&nbsp;&nbsp;&nbsp; echo Using CATALINA_HOME:&nbsp;&nbsp; %CATALINA_HOME%<br />
&nbsp;&nbsp;&nbsp; echo Using CATALINA_TMPDIR: %CATALINA_TMPDIR%<br />
&nbsp;&nbsp;&nbsp; echo Using JAVA_HOME:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; %JAVA_HOME%<br />
就可以将JAVA虚拟机分配内存&nbsp; 508.0625MB的!<br />
但是很多人修改后，发现修改并没有起作用，即通过windows的服务启动tomcat时，实际的内存还是默认的，修改的设置并没有起作用；而通过&lt;CATALINA_HOME&gt;\bin\startup.bat 启动却是生效的。这是为什么呢？因为在安装过程中，JVM的初始化参数已经写在注册表中了，由于没有修改注册表中相关参数，所以以windows服务方式启动时，修改的并没有生效。而通过&lt;CATALINA_HOME&gt;\bin\startup.bat 启动直接是通过&lt;CATALINA_HOME&gt;\bin\catalina.bat文件中的配置的。你需要重新加载到系统服务中才生效，或者你手工在注册表中查找修改启动值，加载到服务中的时候参数已经配置好了，自己修改artup.bat不会改变注册表中的参数设置。<br />
&nbsp;<br />
解决方法：修改注册表中的参数，加入JVM初始化内存的参数：<br />
HKEY_LOCAL_MACHINE\SOFTWARE\Apache Software Foundation\Tomcat Service Manager\Tomcat5\Parameters\JavaOptions<br />
值为<br />
-Dcatalina.home="C:\ApacheGroup\Tomcat 5.0"<br />
-Djava.endorsed.dirs="C:\ApacheGroup\Tomcat 5.0\common\endorsed"<br />
-Xrs<br />
如加入 -Xms512m -Xmx800m<br />
&nbsp;<br />
方式2：针对免安装的用户，也可以通过将tomcat注册为windows的一个服务的方式来实现：&#8216;<br />
我们可以对service.bat文件做一些其他修改，使tomcat更加能满足我们各种不同需求时的要求<br />
1. 如果让tomcat编译jsp文件，就在PR_CLASSPATH中加入J2SDK的tools.jar<br />
修改前：<br />
set PR_CLASSPATH=%CATALINA_HOME%\bin\bootstrap.jar<br />
修改后：<br />
set PR_CLASSPATH=%JAVA_HOME%\lib\tools.jar;%CATALINA_HOME%\bin\bootstrap.jar<br />
2.要使用一个特定的JVM，就要修改jvm的参数；要使注册的windows服务的启动方式为自动，增加--Startup Automatic，这个是比较常用的；要用定制的server.xml配置文件并且传递多个参数给StartClass，要修改StartParams的值，各个值之间用分号分隔：<br />
修改前：<br />
"%EXECUTABLE%" //IS//%SERVICE_NAME% --Jvm auto<br />
--StartClass org.apache.catalina.startup.Bootstrap --StopClass org.apache.catalina.startup.Bootstrap<br />
--StartParams start --StopParams stop<br />
修改后：<br />
"%EXECUTABLE%" //IS//%SERVICE_NAME% --Jvm "%JAVA_HOME%\jre\bin\server\jvm.dll"<br />
--StartClass org.apache.catalina.startup.Bootstrap --StopClass org.apache.catalina.startup.Bootstrap<br />
--StartParams "-config;%CUSTOM_SERVERXML_FILE%;-nonaming;start" --StopParams stop<br />
--Startup Automatic<br />
3. 指定最大和最小的内存限制，要增加jvm的初始参数<br />
修改前：<br />
"%EXECUTABLE%" //US//%SERVICE_NAME% --JvmOptions<br />
"-Dcatalina.base=%CATALINA_BASE%;-Dcatalina.home=%CATALINA_HOME%;-Djava.endorsed.dirs=%CATALINA_HOME%\common\endorsed"<br />
--StartMode jvm --StopMode jvm<br />
修改后：<br />
"%EXECUTABLE%" //US//%SERVICE_NAME% --JvmOptions<br />
"-Xms128M;-Xmx256M;-Dcatalina.base=%CATALINA_BASE%;-Dcatalina.home=%CATALINA_HOME%;-Djava.endorsed.dirs=%CATALINA_HOME%\common\endorsed"<br />
--StartMode jvm --StopMode jvm<br />
4.有时注册windows服务成功后，但是启动服务时显示&#8220;发生服务特定错误: 0.&#8221;<br />
就是因为jvm没有指定，修改Jvm auto为Jvm "%JAVA_HOME%\jre\bin\server\jvm.dll"后重新注册windows服务就可以启动了。</div>
<img src ="http://www.blogjava.net/baoyaer/aggbug/153154.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2007-10-16 09:07 <a href="http://www.blogjava.net/baoyaer/articles/153154.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>读取容器配置参数---context-param和init-param区别 [zt]</title><link>http://www.blogjava.net/baoyaer/articles/152843.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Mon, 15 Oct 2007 01:02:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/152843.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/152843.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/152843.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/152843.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/152843.html</trackback:ping><description><![CDATA[web.xml里面可以定义两种参数：<br />
(1)application范围内的参数，存放在servletcontext中，在web.xml中配置如下：
<div style="border-right: windowtext 0.5pt solid; padding-right: 5.4pt; border-top: windowtext 0.5pt solid; padding-left: 5.4pt; background: #e6e6e6; padding-bottom: 4px; border-left: windowtext 0.5pt solid; width: 95%; word-break: break-all; padding-top: 4px; border-bottom: windowtext 0.5pt solid">
<div><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /><span> </span><span>&lt;</span><span>context-param</span><span>&gt;</span><span><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>param-name</span><span>&gt;</span><span>context/param</span><span>&lt;/</span><span>param-name</span><span>&gt;</span><span><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>param-value</span><span>&gt;</span><span>avalible during application</span><span>&lt;/</span><span>param-value</span><span>&gt;</span><span><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;</span><span>&lt;/</span><span>context-param</span><span>&gt;</span></div>
</div>
<p>(2)servlet范围内的参数，只能在servlet的init()方法中取得，在web.xml中配置如下：</p>
<div style="border-right: windowtext 0.5pt solid; padding-right: 5.4pt; border-top: windowtext 0.5pt solid; padding-left: 5.4pt; background: #e6e6e6; padding-bottom: 4px; border-left: windowtext 0.5pt solid; width: 95%; word-break: break-all; padding-top: 4px; border-bottom: windowtext 0.5pt solid">
<div><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /><span> </span><span>&lt;</span><span>servlet</span><span>&gt;</span><span><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>servlet-name</span><span>&gt;</span><span>MainServlet</span><span>&lt;/</span><span>servlet-name</span><span>&gt;</span><span><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>servlet-class</span><span>&gt;</span><span>com.wes.controller.MainServlet</span><span>&lt;/</span><span>servlet-class</span><span>&gt;</span><span><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>init-param</span><span>&gt;</span><span><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>param-name</span><span>&gt;</span><span>param1</span><span>&lt;/</span><span>param-name</span><span>&gt;</span><span><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>param-value</span><span>&gt;</span><span>avalible in servlet init()</span><span>&lt;/</span><span>param-value</span><span>&gt;</span><span><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;/</span><span>init-param</span><span>&gt;</span><span><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>load-on-startup</span><span>&gt;</span><span>0</span><span>&lt;/</span><span>load-on-startup</span><span>&gt;</span><span><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /> </span><span>&lt;/</span><span>servlet</span><span>&gt;</span></div>
</div>
<p>在servlet中可以通过代码分别取用：</p>
<div style="border-right: windowtext 0.5pt solid; padding-right: 5.4pt; border-top: windowtext 0.5pt solid; padding-left: 5.4pt; background: #e6e6e6; padding-bottom: 4px; border-left: windowtext 0.5pt solid; width: 95%; word-break: break-all; padding-top: 4px; border-bottom: windowtext 0.5pt solid">
<div><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /><span>package</span><span> com.wes.controller;<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span><span>import</span><span> javax.servlet.ServletException;<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span><span>import</span><span> javax.servlet.http.HttpServlet;<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span>public</span><span> </span><span>class</span><span> MainServlet </span><span>extends</span><span> HttpServlet </span><span>...</span><span><span>{<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" /><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span>public</span><span> MainServlet() </span><span>...</span><span><span>{<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>super</span><span>();<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp; }</span></span><span><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span>public</span><span> </span><span>void</span><span> init() </span><span>throws</span><span> ServletException </span><span>...</span><span><span>{<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(</span><span>"</span><span>下面的两个参数param1是在servlet中存放的</span><span>"</span><span>);<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(</span><span>this</span><span>.getInitParameter(</span><span>"</span><span>param1</span><span>"</span><span>));</span><span><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(</span><span>"</span><span>下面的参数是存放在servletcontext中的</span><span>"</span><span>);<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(getServletContext().getInitParameter(</span><span>"</span><span>context/param</span><span>"</span><span>));<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></span><span><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span></div>
</div>
<p>第一种参数在servlet里面可以通过getServletContext().getInitParameter("context/param")得到<br />
第二种参数只能在servlet的init()方法中通过this.getInitParameter("param1")取得</p>
<img src ="http://www.blogjava.net/baoyaer/aggbug/152843.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2007-10-15 09:02 <a href="http://www.blogjava.net/baoyaer/articles/152843.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转载]Tomcat类加载机制 </title><link>http://www.blogjava.net/baoyaer/articles/149426.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Sat, 29 Sep 2007 01:08:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/149426.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/149426.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/149426.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/149426.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/149426.html</trackback:ping><description><![CDATA[<div style="margin-top: 10px; margin-left: 15px; overflow: auto">
<table width="100%">
    <tbody>
        <tr>
            <td>
            <p>Tomcat Server在启动的时候将构造一个ClassLoader树，以保证模块的类库是私有的 <br />
            Tomcat Server的ClassLoader结构如下： <br />
            <div class="code_title">代码</div>
            <div class="code_div">
            <div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;Bootstrap&nbsp;&nbsp;&nbsp;<br />
            <img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
            <img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System&nbsp;&nbsp;&nbsp;&nbsp;<br />
            <img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;<br />
            <img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Common&nbsp;&nbsp;&nbsp;<br />
            <img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;/&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\&nbsp;&nbsp;&nbsp;<br />
            <img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />Catalina&nbsp;&nbsp;Shared&nbsp;&nbsp;&nbsp;<br />
            <img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/&nbsp;&nbsp;&nbsp;&nbsp;\&nbsp;&nbsp;&nbsp;<br />
            <img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WebApp1&nbsp;&nbsp;WebApp2&nbsp;&nbsp;&nbsp;<br />
            <img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
            </div>
            <script>render_code();</script><br />
            其中： <br />
            - Bootstrap - 载入JVM自带的类和$JAVA_HOME/jre/lib/ext/*.jar <br />
            - System - 载入$CLASSPATH/*.class <br />
            - Common - 载入$CATALINA_HOME/common/...，它们对TOMCAT和所有的WEB APP都可见 <br />
            - Catalina - 载入$CATALINA_HOME/server/...，它们仅对TOMCAT可见，对所有的WEB APP都不可见 <br />
            - Shared - 载入$CATALINA_HOME/shared/...，它们仅对所有WEB APP可见，对TOMCAT不可见（也不必见） <br />
            - WebApp - 载入ContextBase?/WEB-INF/...，它们仅对该WEB APP可见
            <p>&nbsp;</p>
            <p>每个运行中的线程都有一个成员contextClassLoader，用来在运行时动态地载入其它类，系统默认的contextClassLoader是systemClassLoader，所以一般而言java程序在执行时可以使用JVM自带的类、$JAVA_HOME/jre/lib/ext/中的类和$CLASSPATH/中的类，可以使用Thread.currentThread().setContextClassLoader(...);更改当前线程的contextClassLoader，来改变其载入类的行为</p>
            <p>ClassLoader被组织成树形，一般的工作原理是： <br />
            1) 线程需要用到某个类，于是contextClassLoader被请求来载入该类 <br />
            2) contextClassLoader请求它的父ClassLoader来完成该载入请求 <br />
            3) 如果父ClassLoader无法载入类，则contextClassLoader试图自己来载入 <br />
            注意：WebApp?ClassLoader的工作原理和上述有少许不同： <br />
            它先试图自己载入类（在ContextBase?/WEB-INF/...中载入类），如果无法载入，再请求父ClassLoader完成</p>
            <p>由此可得： <br />
            - 对于WEB APP线程，它的contextClassLoader是WebApp?ClassLoader <br />
            - 对于Tomcat Server线程，它的contextClassLoader是CatalinaClassLoader </p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<img src ="http://www.blogjava.net/baoyaer/aggbug/149426.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2007-09-29 09:08 <a href="http://www.blogjava.net/baoyaer/articles/149426.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ant 两则技巧</title><link>http://www.blogjava.net/baoyaer/articles/148186.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Wed, 26 Sep 2007 01:08:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/148186.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/148186.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/148186.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/148186.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/148186.html</trackback:ping><description><![CDATA[<p><font color="#990099">下面两则技巧以前没有用过，在某些场合它们还是很有用的，比如开发和正式的产品介质时可以通过它们自动设置不同的LOG级别，所以收录一下，呵呵。</font></p>
<p><font color="#990099">BTW: </font><a href="http://www.ibm.com/developerworks/cn/java/j-lo-ant-eclipse/"><font color="#0000ff">原文</font></a><font color="#990099">还介绍了一些其他内容，</font><font color="#990099">对于ANT初学者有较好的参考价值，建议看看。</font></p>
<p>&nbsp;</p>
<p><a name="N10183"><span class="atitle"><strong>利用 Ant 提供的 filter 任务替换属性值</strong></span></a></p>
<p>现在根据不同环境的需要，对某些配置文件的值做一些替换。在 Ant 中，提供了 filter 任务，使得替换值很方便。当然也可以使用下面介绍的正则表达式来替换属性值。filter 主要用来在同一行内容中的替换，而正则表达式一下子可以替换多行内容。filter 的使用例子：</p>
<pre class="displaycode">
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">filter&nbsp;</span><span style="color: #ff0000">token</span><span style="color: #0000ff">="&nbsp;log4j.logger"</span><span style="color: #ff0000">&nbsp;value</span><span style="color: #0000ff">="INFO"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">copy&nbsp;</span><span style="color: #ff0000">todir</span><span style="color: #0000ff">="${dest.dir}"</span><span style="color: #ff0000">&nbsp;filtering</span><span style="color: #0000ff">="true"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">fileset&nbsp;</span><span style="color: #ff0000">dir</span><span style="color: #0000ff">="${src.dir}"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">copy</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
</pre>
<p>这段脚本的意思就是在 src.dir 目录下的所有文件中，如果有预先定义好的"@log4j.logger@"占位符的话，在拷贝到 dest.dir 目录后，所有的占位符都被替换成了"INFO"。</p>
<p>你也可以将所有被替换的值放到某个属性文件中，filter 任务将属性文件中的每一个条目读出来并且设置成一个 Filter。如下所示：</p>
<pre class="displaycode">
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">filter&nbsp;</span><span style="color: #ff0000">filtersfile</span><span style="color: #0000ff">="deploy_env.properties"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">copy&nbsp;</span><span style="color: #ff0000">todir</span><span style="color: #0000ff">="${dest.dir}"</span><span style="color: #ff0000">&nbsp;filtering</span><span style="color: #0000ff">="true"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">fileset&nbsp;</span><span style="color: #ff0000">dir</span><span style="color: #0000ff">="${src.dir}"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">copy</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
</pre>
<p>上面的脚本表示所有在 deploy_env 中出现的条目将被作为一个 filter，在拷贝到 dest.dir 目录后，所有 src.dir 目录中存在的占位符将被替换成 deploy_env 中的值。具体的例子可以参见随本文附带的 deploy.xml， deploy_env.properties 和 Test.properties。 </p>
<p>其中 deploy.xml 是 ant 脚本，deploy_env.properties 中包含所有要替换的值，在 Test.properties 中是包含有占位符的资源文件。</p>
<p>&nbsp;</p>
<p><a name="N1019F"><span class="atitle"><strong>利用正则表达式替换属性值</strong></span></a></p>
<p>Ant 中支持多种正则表达式，在运行 Ant 的时候用哪种正则表达式可以通过设置 ant.regexp.regexpimpl 的值来切换，Ant 支持的的正则表达式有：</p>
<ul>
    <li>java.util.regex package of JDK 1.4
    <li>jakarta-regexp
    <li>installation dependencies </li>
</ul>
<p>正则表达式的例子：</p>
<pre class="displaycode">
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">&lt;</span><span style="color: #800000">replaceregexp&nbsp;</span><span style="color: #ff0000">byline</span><span style="color: #0000ff">="true"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">regexp&nbsp;</span><span style="color: #ff0000">pattern</span><span style="color: #0000ff">="正则表达式"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">substitution&nbsp;</span><span style="color: #ff0000">expression</span><span style="color: #0000ff">="将要替换的值"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">fileset&nbsp;</span><span style="color: #ff0000">dir</span><span style="color: #0000ff">="${unpack.war.dir}/WEB-INF"</span><span style="color: #ff0000">&nbsp;includes</span><span style="color: #0000ff">="web.xml"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">replaceregexp</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
</pre>
<p>byline 属性用来确认被替换的时候是一次替换一行还是多行；pattern 属性用来指明正则表达式；substitution expression 中是替换的值，替换的值都定义在相对应的配置文件中；fileset 属性中的 dir 用来指定被替换文件所在的目录，includes 用来指定要替换哪个文件。需要注意的是，如果在正则表达式或者替换的值中出现"&lt;"的话，需要用转义符"&lt;"。</p>
<p>在 Eclipse3.1 中已经内置了对正则表达式的支持；但是如果你在命令行中运行需要正则表达式支持的脚本的话，则需要自己将正则表达式的包下载下来加到 classpath 中。在随文章的 deploy.xml 中提供了一个简单的替换属性文件的值的例子。正则表达式的例子可以在本文所带的 deploy.xml 中找到。</p>
<img src ="http://www.blogjava.net/baoyaer/aggbug/148186.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2007-09-26 09:08 <a href="http://www.blogjava.net/baoyaer/articles/148186.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>高效使用dbunit </title><link>http://www.blogjava.net/baoyaer/articles/146337.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Wed, 19 Sep 2007 01:09:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/146337.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/146337.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/146337.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/146337.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/146337.html</trackback:ping><description><![CDATA[<h2>&nbsp;</h2>
<p><strong>dbunit:</strong> DbUnit is a JUnit extension (also usable with Ant) targeted for database-driven projects </p>
<p><a href="http://dbunit.sourceforge.net/" target="_blank">official site</a>, 好久没更新了, 最新版本2.1还是2004年5月的</p>
<p>1. use ant task<br />
</p>
<div style="border-right: windowtext 0.5pt solid; padding-right: 5.4pt; border-top: windowtext 0.5pt solid; padding-left: 5.4pt; background: #e6e6e6; padding-bottom: 4px; border-left: windowtext 0.5pt solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: windowtext 0.5pt solid">
<div><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">&lt;</span><span style="color: #800000">taskdef&nbsp;</span><span style="color: #ff0000">classpathref</span><span style="color: #0000ff">="project.classpath"</span><span style="color: #ff0000">&nbsp;classname</span><span style="color: #0000ff">="org.dbunit.ant.DbUnitTask"</span><span style="color: #ff0000">&nbsp;name</span><span style="color: #0000ff">="dbunit"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span></div>
</div>
<p>&nbsp;导出数据</p>
<div style="border-right: windowtext 0.5pt solid; padding-right: 5.4pt; border-top: windowtext 0.5pt solid; padding-left: 5.4pt; background: #e6e6e6; padding-bottom: 4px; border-left: windowtext 0.5pt solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: windowtext 0.5pt solid">
<div><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">&lt;</span><span style="color: #800000">target&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="export"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">dbunit&nbsp;</span><span style="color: #ff0000">password</span><span style="color: #0000ff">="${database.password}"</span><span style="color: #ff0000">&nbsp;userid</span><span style="color: #0000ff">="${database.userid}"</span><span style="color: #ff0000">&nbsp;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;url</span><span style="color: #0000ff">="${database.url}"</span><span style="color: #ff0000">&nbsp;driver</span><span style="color: #0000ff">="${database.driver}"</span><span style="color: #ff0000">&nbsp;supportbatchstatement</span><span style="color: #0000ff">="true"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">export&nbsp;</span><span style="color: #ff0000">format</span><span style="color: #0000ff">="xml"</span><span style="color: #ff0000">&nbsp;dest</span><span style="color: #0000ff">="data/export-data.xml"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">query&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="FOO"</span><span style="color: #ff0000">&nbsp;sql</span><span style="color: #0000ff">="SELECT&nbsp;COL1,&nbsp;COL2&nbsp;FROM&nbsp;FOO&nbsp;WHERE&nbsp;COL1=4"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">table&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="BAR"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000">&nbsp;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">export</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">dbunit</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">target</span><span style="color: #0000ff">&gt;</span></div>
</div>
<p>tip: 不指定query、table， 导出所有的table <br />
<br />
导入数据</p>
<div style="border-right: windowtext 0.5pt solid; padding-right: 5.4pt; border-top: windowtext 0.5pt solid; padding-left: 5.4pt; background: #e6e6e6; padding-bottom: 4px; border-left: windowtext 0.5pt solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: windowtext 0.5pt solid">
<div><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">&lt;</span><span style="color: #800000">target&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="clean_insert"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">dbunit&nbsp;</span><span style="color: #ff0000">password</span><span style="color: #0000ff">="${database.password}"</span><span style="color: #ff0000">&nbsp;userid</span><span style="color: #0000ff">="${database.userid}"</span><span style="color: #ff0000">&nbsp;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;url</span><span style="color: #0000ff">="${database.url}"</span><span style="color: #ff0000">&nbsp;driver</span><span style="color: #0000ff">="${database.driver}"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">operation&nbsp;</span><span style="color: #ff0000">format</span><span style="color: #0000ff">="xml"</span><span style="color: #ff0000">&nbsp;src</span><span style="color: #0000ff">="data/init-data.xml"</span><span style="color: #ff0000">&nbsp;type</span><span style="color: #0000ff">="CLEAN_INSERT"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">dbunit</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">target</span><span style="color: #0000ff">&gt;</span></div>
</div>
<p>tip: <br />
type: UPDATE, INSERT, DELETE, DELETE_ALL, REFRESH,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MSSQL_INSERT, MSSQL_REFRESH, MSSQL_CLEAN_INSERT.<br />
<br />
比较数据 </p>
<div style="border-right: windowtext 0.5pt solid; padding-right: 5.4pt; border-top: windowtext 0.5pt solid; padding-left: 5.4pt; background: #e6e6e6; padding-bottom: 4px; border-left: windowtext 0.5pt solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: windowtext 0.5pt solid">
<div><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">&lt;</span><span style="color: #800000">target&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="compare"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">dbunit&nbsp;</span><span style="color: #ff0000">password</span><span style="color: #0000ff">="${database.password}"</span><span style="color: #ff0000">&nbsp;userid</span><span style="color: #0000ff">="${database.userid}"</span><span style="color: #ff0000">&nbsp;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;url</span><span style="color: #0000ff">="${database.url}"</span><span style="color: #ff0000">&nbsp;driver</span><span style="color: #0000ff">="${database.driver}"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">compare&nbsp;</span><span style="color: #ff0000">format</span><span style="color: #0000ff">="xml"</span><span style="color: #ff0000">&nbsp;src</span><span style="color: #0000ff">="data/init-data.xml"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">dbunit</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">target</span><span style="color: #0000ff">&gt;</span></div>
</div>
<p>2. use code</p>
<p>导出数据 </p>
<div style="border-right: windowtext 0.5pt solid; padding-right: 5.4pt; border-top: windowtext 0.5pt solid; padding-left: 5.4pt; background: #e6e6e6; padding-bottom: 4px; border-left: windowtext 0.5pt solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: windowtext 0.5pt solid">
<div><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">IDatabaseConnection&nbsp;conn&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;DatabaseConnection(jdbcConnection,&nbsp;schema);&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;oracle指定schema</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000">IDataSet&nbsp;dataSet&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;conn.createDataSet();<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />XmlDataSet.write(dataSet,&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;FileOutputStream(</span><span style="color: #000000">"</span><span style="color: #000000">export-data.xml</span><span style="color: #000000">"</span><span style="color: #000000">));&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;xml&nbsp;file</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000">FlatXmlDataSet.write(dataSet,</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;FileOutputStream(</span><span style="color: #000000">"</span><span style="color: #000000">export-data.xml</span><span style="color: #000000">"</span><span style="color: #000000">));&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;flat&nbsp;xml&nbsp;file</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000">XlsDataSet.write(dataSet,</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;FileOutputStream(</span><span style="color: #000000">"</span><span style="color: #000000">export-data.xls</span><span style="color: #000000">"</span><span style="color: #000000">));&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;xls&nbsp;file</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000">FlatDtdDataSet.write(dataSet,</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;FileOutputStream(</span><span style="color: #000000">"</span><span style="color: #000000">export-data.dtd</span><span style="color: #000000">"</span><span style="color: #000000">));&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;dtd&nbsp;file</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000">CsvDataSetWriter.write(dataSet,&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;File(</span><span style="color: #000000">"</span><span style="color: #000000">export-data-csv</span><span style="color: #000000">"</span><span style="color: #000000">));&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;csv&nbsp;file</span></div>
</div>
<p>使用DatabaseSequenceFilter, 解决违反外键约束的问题 </p>
<div style="border-right: windowtext 0.5pt solid; padding-right: 5.4pt; border-top: windowtext 0.5pt solid; padding-left: 5.4pt; background: #e6e6e6; padding-bottom: 4px; border-left: windowtext 0.5pt solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: windowtext 0.5pt solid">
<div><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">IDatabaseConnection&nbsp;conn&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;DatabaseConnection(jdbcConnection);<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />ITableFilter&nbsp;filter&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;DatabaseSequenceFilter(conn);<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;ITableFilter&nbsp;filter&nbsp;=&nbsp;new&nbsp;DatabaseSequenceFilter(conn,&nbsp;tableNames);</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000">IDataSet&nbsp;dataset&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;FilteredDataSet(filter,&nbsp;conn.createDataSet());<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />XmlDataSet.write(dataset,&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;FileOutputStream(</span><span style="color: #000000">"</span><span style="color: #000000">export-data.xml</span><span style="color: #000000">"</span><span style="color: #000000">));</span></div>
</div>
<p>导入数据 </p>
<div style="border-right: windowtext 0.5pt solid; padding-right: 5.4pt; border-top: windowtext 0.5pt solid; padding-left: 5.4pt; background: #e6e6e6; padding-bottom: 4px; border-left: windowtext 0.5pt solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: windowtext 0.5pt solid">
<div><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">DatabaseOperation.REFRESH.execute(conn,&nbsp;dataSet);<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />DatabaseOperation.INSERT.execute(conn,&nbsp;dataSet);</span></div>
</div>
<p>删除数据 </p>
<div style="border-right: windowtext 0.5pt solid; padding-right: 5.4pt; border-top: windowtext 0.5pt solid; padding-left: 5.4pt; background: #e6e6e6; padding-bottom: 4px; border-left: windowtext 0.5pt solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: windowtext 0.5pt solid">
<div><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">DatabaseOperation.DELETE.execute(conn,&nbsp;dataSet);</span></div>
</div>
<p>比较数据 </p>
<div style="border-right: windowtext 0.5pt solid; padding-right: 5.4pt; border-top: windowtext 0.5pt solid; padding-left: 5.4pt; background: #e6e6e6; padding-bottom: 4px; border-left: windowtext 0.5pt solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: windowtext 0.5pt solid">
<div><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">IDatabaseConnection&nbsp;conn&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;DatabaseConnection(jdbcConnection);<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />Compare&nbsp;compare&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Compare();<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />compare.setFormat(</span><span style="color: #000000">"</span><span style="color: #000000">xml</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />compare.setSrc(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;File(</span><span style="color: #000000">"</span><span style="color: #000000">export-data.xml</span><span style="color: #000000">"</span><span style="color: #000000">));<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />compare.execute(conn);</span></div>
</div>
<p>tip: 使用assert进行比较, 作用不大 <br />
code: Assertion.assertEquals(expectedTable, actualTable);</p>
<p>3. QueryDataSet: use sql</p>
<div style="border-right: windowtext 0.5pt solid; padding-right: 5.4pt; border-top: windowtext 0.5pt solid; padding-left: 5.4pt; background: #e6e6e6; padding-bottom: 4px; border-left: windowtext 0.5pt solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: windowtext 0.5pt solid">
<div><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">QueryDataSet&nbsp;queryDataSet&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;QueryDataSet(conn);<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />queryDataSet.addTable(</span><span style="color: #000000">"</span><span style="color: #000000">orders</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;ordersQuerySQL);</span></div>
</div>
<p class="postfoot">posted on 2005-08-20 03:17 <a href="http://www.blogjava.net/waterye/">water ye</a> 阅读(956) <a href="http://www.blogjava.net/waterye/archive/2005/08/20/10568.html#Post">评论(0)</a> &nbsp;<a href="http://www.blogjava.net/waterye/admin/EditPosts.aspx?postid=10568">编辑</a> &nbsp;<a href="http://www.blogjava.net/waterye/AddToFavorite.aspx?id=10568">收藏</a> 所属分类: <a href="http://www.blogjava.net/waterye/category/2879.html">Other</a> 、<a href="http://www.blogjava.net/waterye/category/3269.html">Java Basic</a> </p>
<img src ="http://www.blogjava.net/baoyaer/aggbug/146337.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2007-09-19 09:09 <a href="http://www.blogjava.net/baoyaer/articles/146337.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>dbUnti 实战</title><link>http://www.blogjava.net/baoyaer/articles/146113.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Tue, 18 Sep 2007 03:49:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/146113.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/146113.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/146113.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/146113.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/146113.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 目录结构： C:\SCRIPT│&nbsp;&nbsp;adintrs_oracle.sql&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs...&nbsp;&nbsp;<a href='http://www.blogjava.net/baoyaer/articles/146113.html'>阅读全文</a><img src ="http://www.blogjava.net/baoyaer/aggbug/146113.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2007-09-18 11:49 <a href="http://www.blogjava.net/baoyaer/articles/146113.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Ant 花哨技巧</title><link>http://www.blogjava.net/baoyaer/articles/146062.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Tue, 18 Sep 2007 01:45:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/146062.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/146062.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/146062.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/146062.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/146062.html</trackback:ping><description><![CDATA[<strong>一，为减小 build.xml 文件的大小，使用XML实体</strong>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">把属性的设置都放一个</span>XML<span style="font-family: 宋体">文件中</span></p>
<p style="margin: 0cm 0cm 0pt">props.xml<span style="font-family: 宋体">文件</span></p>
<p style="background: #f3f3f3; margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: blue; font-family: 新宋体">&lt;</span><span style="font-size: 10pt; color: maroon; font-family: 新宋体">property</span><span style="font-size: 10pt; color: red; font-family: 新宋体">name</span><span style="font-size: 10pt; color: blue; font-family: 新宋体">="build.dir"</span><span style="font-size: 10pt; color: red; font-family: 新宋体">value</span><span style="font-size: 10pt; color: blue; font-family: 新宋体">="build"</span><span style="font-size: 10pt; color: blue; font-family: 新宋体">/&gt;</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">然后在</span> build.xml<span style="font-family: 宋体">文件中加入如下</span></p>
<p style="background: #f3f3f3; margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: blue; font-family: Arial">&lt;!</span><span style="font-size: 10pt; color: maroon; font-family: Arial">DOCTYPE </span><span style="font-size: 10pt; color: red; font-family: Arial">project </span><span style="font-size: 10pt; color: blue; font-family: Arial">[</span><span style="font-size: 10pt; color: fuchsia; font-family: Arial">&lt;!ENTITY properties SYSTEM "file:props.xml"&gt;</span><span style="font-size: 10pt; color: blue; font-family: Arial">]&gt;</span></p>
<p style="margin: 0cm 0cm 0pt"><span Roman?? New ?Times FONT-FAMILY:><strong>二，将多个目录的源文件编译到一个地方</strong></span></p>
<p style="background: #f3f3f3; margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 12pt; color: blue; font-family: 新宋体">&lt;</span><span style="font-size: 12pt; color: maroon; font-family: 新宋体">javac</span><span style="font-size: 12pt; color: red; font-family: 新宋体">destdir</span><span style="font-size: 12pt; color: blue; font-family: 新宋体">="build/classes"&gt;</span></p>
<p style="background: #f3f3f3; margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 12pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: blue">&lt;</span><span style="color: maroon">src</span><span style="color: red">path</span><span style="color: blue">="src1"/&gt;</span></span></p>
<p style="background: #f3f3f3; margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 12pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: blue">&lt;</span><span style="color: maroon">src</span><span style="color: red">path</span><span style="color: blue">="src2"/&gt;</span></span></p>
<p style="background: #f3f3f3; margin: 0cm 0cm 0pt"><span style="font-size: 12pt; color: blue; font-family: 新宋体">&lt;/</span><span style="font-size: 12pt; color: maroon; font-family: 新宋体">javac</span><span style="font-size: 12pt; color: blue; font-family: 新宋体">&gt;</span></p>
<p style="margin: 0cm 0cm 0pt"><span Roman?? New ?Times FONT-FAMILY:><strong>三，保存构建时的信息</strong></span></p>
<p style="background: #f3f3f3; margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: blue; font-family: 新宋体">&lt;</span><span style="font-size: 10pt; color: maroon; font-family: 新宋体">project</span><span style="font-size: 10pt; color: red; font-family: 新宋体">default</span><span style="font-size: 10pt; color: blue; font-family: 新宋体">="init"&gt;</span></p>
<p style="background: #f3f3f3; margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: blue">&lt;</span><span style="color: maroon">target</span><span style="color: red">name</span><span style="color: blue">="init"&gt;&lt;/</span><span style="color: maroon">target</span><span style="color: blue">&gt;</span></span></p>
<p style="background: #f3f3f3; margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: blue">&lt;</span><span style="color: maroon">property</span><span style="color: red">environment</span><span style="color: blue">="env"</span><span style="color: blue">/&gt;</span></span></p>
<p style="background: #f3f3f3; margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: blue">&lt;</span><span style="color: maroon">property</span><span style="color: red">name</span><span style="color: blue">="env.COMPUTERNAME"</span><span style="color: red">value</span><span style="color: blue">="${env.HOSTNAME}"</span><span style="color: blue">/&gt;</span></span></p>
<p style="background: #f3f3f3; margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: blue">&lt;</span><span style="color: maroon">propertyfile</span><span style="color: red">comment</span><span style="color: blue">="Build Information"</span><span style="color: red">file</span><span style="color: blue">="./buildinfo.properties"&gt;</span></span></p>
<p style="background: #f3f3f3; margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">&lt;</span><span style="color: maroon">entry</span><span style="color: red">key</span><span style="color: blue">="build.host"</span><span style="color: red">value</span><span style="color: blue">="${env.COMPUTERNAME}"</span><span style="color: blue">/&gt;</span></span></p>
<p style="background: #f3f3f3; margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">&lt;</span><span style="color: maroon">entry</span><span style="color: red">key</span><span style="color: blue">="build.user.name"</span><span style="color: red">value</span><span style="color: blue">="${user.name}"</span><span style="color: blue">/&gt;</span></span></p>
<p style="background: #f3f3f3; margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">&lt;</span><span style="color: maroon">entry</span><span style="color: red">key</span><span style="color: blue">="build.os.name"</span><span style="color: red">value</span><span style="color: blue">="${os.name}"</span><span style="color: blue">/&gt;</span></span></p>
<p style="background: #f3f3f3; margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: blue">&lt;/</span><span style="color: maroon">propertyfile</span><span style="color: blue">&gt;</span></span></p>
<p style="background: #f3f3f3; margin: 0cm 0cm 0pt"><span style="font-size: 10pt; color: blue; font-family: 新宋体">&lt;/</span><span style="font-size: 10pt; color: maroon; font-family: 新宋体">project</span><span style="font-size: 10pt; color: blue; font-family: 新宋体">&gt;</span></p>
<p style="margin: 0cm 0cm 0pt"><span Roman?? New ?Times FONT-FAMILY:><strong>四，去除属性文件的注释</strong></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">属性文件：</span></p>
<p style="background: #f3f3f3; margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: green; font-family: 新宋体"># </span><span style="font-size: 10pt; color: green; font-family: 新宋体">这里是注释，会给过滤掉</span></p>
<p style="background: #f3f3f3; margin: 0cm 0cm 0pt"><span style="font-size: 12pt; font-family: 新宋体">build.dir <span style="color: red">=</span> <span style="color: #3366ff">build</span></span></p>
<p style="margin: 0cm 0cm 0pt">build<span style="font-family: 宋体">文件：</span></p>
<p style="background: #f3f3f3; margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: blue; font-family: 新宋体">&lt;</span><span style="font-size: 10pt; color: maroon; font-family: 新宋体">copy</span><span style="font-size: 10pt; color: red; font-family: 新宋体">file</span><span style="font-size: 10pt; color: blue; font-family: 新宋体">="props.properties"</span><span style="font-size: 10pt; color: red; font-family: 新宋体">todir</span><span style="font-size: 10pt; color: blue; font-family: 新宋体">="sample"&gt;</span></p>
<p style="background: #f3f3f3; margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: blue">&lt;</span><span style="color: maroon">filterchain</span><span style="color: blue">&gt;</span></span></p>
<p style="background: #f3f3f3; margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue">&lt;</span><span style="color: maroon">striplinecomments</span><span style="color: blue">&gt;</span></span></p>
<p style="background: #f3f3f3; margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">&lt;</span><span style="color: maroon">comment</span><span style="color: red">value</span><span style="color: blue">="#"</span><span style="color: blue">/&gt;</span></span></p>
<p style="background: #f3f3f3; margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">&lt;/</span><span style="color: maroon">striplinecomments</span><span style="color: blue">&gt;</span></span></p>
<p style="background: #f3f3f3; margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: blue">&lt;/</span><span style="color: maroon">filterchain</span><span style="color: blue">&gt;</span></span></p>
<p style="background: #f3f3f3; margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: blue; font-family: 新宋体">&lt;/</span><span style="font-size: 10pt; color: maroon; font-family: 新宋体">copy</span><span style="font-size: 10pt; color: blue; font-family: 新宋体">&gt;</span></p>
<p style="margin: 0cm 0cm 0pt"><span Roman?? New ?Times FONT-FAMILY:><strong>五，两个花俏的功能</strong></span></p>
<p style="margin: 0cm 0cm 0pt">1.<span style="font-family: 宋体">声音提示</span></p>
<p style="background: #f3f3f3; margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: blue; font-family: 新宋体">&lt;</span><span style="font-size: 10pt; color: maroon; font-family: 新宋体">project</span><span style="font-size: 10pt; color: red; font-family: 新宋体">name</span><span style="font-size: 10pt; color: blue; font-family: 新宋体">="Sound"</span><span style="font-size: 10pt; color: red; font-family: 新宋体">default</span><span style="font-size: 10pt; color: blue; font-family: 新宋体">="all"&gt;</span></p>
<p style="background: #f3f3f3; margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: blue">&lt;</span><span style="color: maroon">property</span><span style="color: red">file</span><span style="color: blue">="build.properties"</span><span style="color: blue">/&gt;</span></span></p>
<p style="background: #f3f3f3; margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: blue">&lt;</span><span style="color: maroon">target</span><span style="color: red">name</span><span style="color: blue">="init"&gt;</span></span></p>
<p style="background: #f3f3f3; margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">&lt;</span><span style="color: maroon">sound</span><span style="color: blue">&gt;</span></span></p>
<p style="background: #f3f3f3; margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">&lt;</span><span style="color: maroon">success</span><span style="color: red">source</span><span style="color: blue">="${sound.dir}/success.wav"</span><span style="color: red">duration</span><span style="color: blue">="500"</span><span style="color: blue">/&gt;</span></span></p>
<p style="background: #f3f3f3; margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">&lt;</span><span style="color: maroon">fail</span><span style="color: red">source</span><span style="color: blue">="${sound.dir}/fail.wav"</span><span style="color: red">loops</span><span style="color: blue">="2"</span><span style="color: blue">/&gt;</span></span></p>
<p style="background: #f3f3f3; margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">&lt;/</span><span style="color: maroon">sound</span><span style="color: blue">&gt;</span></span></p>
<p style="background: #f3f3f3; margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: blue">&lt;/</span><span style="color: maroon">target</span><span style="color: blue">&gt;</span></span></p>
<p style="background: #f3f3f3; margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: blue">&lt;</span><span style="color: maroon">target</span><span style="color: red">name</span><span style="color: blue">="fail"</span><span style="color: red">depends</span><span style="color: blue">="init"&gt;</span></span></p>
<p style="background: #f3f3f3; margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">&lt;</span><span style="color: maroon">fail</span><span style="color: blue">/&gt;</span></span></p>
<p style="background: #f3f3f3; margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: blue">&lt;/</span><span style="color: maroon">target</span><span style="color: blue">&gt;</span></span></p>
<p style="background: #f3f3f3; margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: blue">&lt;</span><span style="color: maroon">target</span><span style="color: red">name</span><span style="color: blue">="success"</span><span style="color: red">depends</span><span style="color: blue">="init"</span><span style="color: blue">/&gt;</span></span></p>
<p style="background: #f3f3f3; margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: blue">&lt;</span><span style="color: maroon">target</span><span style="color: red">name</span><span style="color: blue">="all"</span><span style="color: red">depends</span><span style="color: blue">="success"</span><span style="color: blue">/&gt;</span></span></p>
<p style="background: #f3f3f3; margin: 0cm 0cm 0pt"><span style="font-size: 10pt; color: blue; font-family: 新宋体">&lt;/</span><span style="font-size: 10pt; color: maroon; font-family: 新宋体">project</span><span style="font-size: 10pt; color: blue; font-family: 新宋体">&gt;</span></p>
<p style="margin: 0cm 0cm 0pt">2.<span style="font-family: 宋体">进度条提示</span></p>
<p style="background: #f3f3f3; margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; color: blue; font-family: 新宋体">&lt;</span><span style="font-size: 10pt; color: maroon; font-family: 新宋体">project</span><span style="font-size: 10pt; color: red; font-family: 新宋体">name</span><span style="font-size: 10pt; color: blue; font-family: 新宋体">="splash"</span><span style="font-size: 10pt; color: red; font-family: 新宋体">default</span><span style="font-size: 10pt; color: blue; font-family: 新宋体">="init"&gt;</span></p>
<p style="background: #f3f3f3; margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: blue">&lt;</span><span style="color: maroon">target</span><span style="color: red">name</span><span style="color: blue">="init"&gt;</span></span></p>
<p style="background: #f3f3f3; margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">&lt;</span><span style="color: maroon">splash</span><span style="color: red">imageurl</span><span style="color: blue">="http://java.chinaitlab.com/UploadFiles_8734/200610/20061021103415601.gif"</span><span style="color: red">showduration</span><span style="color: blue">="5000"</span><span style="color: blue">/&gt;</span></span></p>
<p style="background: #f3f3f3; margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">&lt;</span><span style="color: maroon">sleep</span><span style="color: red">seconds</span><span style="color: blue">="1"</span><span style="color: blue">/&gt;</span></span></p>
<p style="background: #f3f3f3; margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">&lt;</span><span style="color: maroon">sleep</span><span style="color: red">seconds</span><span style="color: blue">="1"</span><span style="color: blue">/&gt;</span></span></p>
<p style="background: #f3f3f3; margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">&lt;</span><span style="color: maroon">sleep</span><span style="color: red">seconds</span><span style="color: blue">="1"</span><span style="color: blue">/&gt;</span></span></p>
<p style="background: #f3f3f3; margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">&lt;</span><span style="color: maroon">sleep</span><span style="color: red">seconds</span><span style="color: blue">="1"</span><span style="color: blue">/&gt;</span></span></p>
<p style="background: #f3f3f3; margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">&lt;</span><span style="color: maroon">sleep</span><span style="color: red">seconds</span><span style="color: blue">="1"</span><span style="color: blue">/&gt;</span></span></p>
<p style="background: #f3f3f3; margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">&lt;</span><span style="color: maroon">sleep</span><span style="color: red">seconds</span><span style="color: blue">="1"</span><span style="color: blue">/&gt;</span></span></p>
<p style="background: #f3f3f3; margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 10pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; <span style="color: blue">&lt;/</span><span style="color: maroon">target</span><span style="color: blue">&gt;</span></span></p>
<p style="background: #f3f3f3; margin: 0cm 0cm 0pt"><span style="font-size: 10pt; color: blue; font-family: 新宋体">&lt;/</span><span style="font-size: 10pt; color: maroon; font-family: 新宋体">project</span><span style="font-size: 10pt; color: blue; font-family: 新宋体">&gt;</span></p>
<img src ="http://www.blogjava.net/baoyaer/aggbug/146062.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2007-09-18 09:45 <a href="http://www.blogjava.net/baoyaer/articles/146062.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>创建本地SVN Repository用于文件版本管理 </title><link>http://www.blogjava.net/baoyaer/articles/141273.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Thu, 30 Aug 2007 03:39:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/141273.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/141273.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/141273.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/141273.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/141273.html</trackback:ping><description><![CDATA[作为一个现代的开发人员，你已经习惯了使用版本管理来管理自己的代码和文档。当我们在家里的机器上想对自己的东西做版本管理的时候你需要自己配置一个版本管理服务器，如CVS等。但是很遗憾的是，CVSNT的配置很是麻烦，而且CVS的功能实在是落伍，SVN服务器的配置也实在麻烦，VSS？老古董一边去！网络上申请一个免费的项目空间，如sf.net之类的：那你的文件就都公开了。
<p>　　今天我无意中发现原来创建一个个人用的SVN Repository是那么的方便。TortoiseSvn这个小乌龟你一定很熟悉，它本身就有一个创建本地Repository的功能，我以前没有注意到过，不知道你用过没有。我用的版本是 1.4.4，在它的帮助的Chapter4里就提到了这个功能。简单来说操作步骤如下</p>
<p>　　第一步，创建一个空白目录，如F:/SVNRepositorys/sample/sampleRepository</p>
<p>　　第二步，右键点击该目录，在右键菜单中选择TortoiseSVN-&gt;Create repository here...。如下图所示<br>
<div align=center src_cetemp="/images/blogjava_net/justfly/step1.PNG"><img height=168 alt="" src="http://www.blogjava.net/images/blogjava_net/justfly/step1.PNG" width=188 border=0></div>
<br>　　第三步，在弹出窗口中选择repository的类型，FSFS是一种新的格式是一种新的类型，速度快，支持网络共享和windows98；BDB类型比较成熟，已经用了很长时间了，比较稳定。选择你想要的，点击OK按钮就可以了。
<p>&nbsp;</p>
<p>
<div align=center src_cetemp="/images/blogjava_net/justfly/step2.PNG"><img height=184 alt="" src="http://www.blogjava.net/images/blogjava_net/justfly/step2.PNG" width=297 border=0></div>
<br>　　到此为止我们的工作就完成了，你已经有一个本地的repository可以用来做版本管理了。如果有兴趣的话你可以打开你刚才创建的目录看看里面的内容。我对里面的内容格式并不很清楚，这里就不说了。下面我们可以用Repository Browser看看我们新创建的repository，如下图所示：输入地址<a href="file:///F:/SVNRepositorys/sample/sampleRepository">file:///F:/SVNRepositorys/sample/sampleRepository</a>你就可以看到新创建的repository了。注意上面的蓝色部分，这里使用的协议是file协议。
<p>&nbsp;</p>
<p>
<div align=center src_cetemp="/images/blogjava_net/justfly/step3.PNG"><img height=482 alt="" src="http://www.blogjava.net/images/blogjava_net/justfly/step3.PNG" width=631 border=0></div>
<p>&nbsp;</p>
<p>　　我原先为自己一些文件的版本管理做过很多的麻烦事，比如搭建CVSNT啊，学习SVN Server的配置啊。但是没有想到可以这么简单的就可以达到自己的目的了。这件事情给了我一个启发：熟练掌握你手里已有的工具，你会发现你其实已经拥有很多。<br></p>
<img src ="http://www.blogjava.net/baoyaer/aggbug/141273.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2007-08-30 11:39 <a href="http://www.blogjava.net/baoyaer/articles/141273.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> Ant入门教程 [z]</title><link>http://www.blogjava.net/baoyaer/articles/138525.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Wed, 22 Aug 2007 02:13:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/138525.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/138525.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/138525.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/138525.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/138525.html</trackback:ping><description><![CDATA[<span class=PreAndNext id=viewpost.ascx_PreviousAndNextEntriesUp>&nbsp;</span><br>
<script>function StorePage(){d=document;t=d.selection?(d.selection.type!='None'?d.selection.createRange().text:''):(d.getSelection?d.getSelection():'');void(keyit=window.open('http://www.365key.com/storeit.aspx?t='+escape(d.title)+'&u='+escape(d.location.href)+'&c='+escape(t),'keyit','scrollbars=no,width=475,height=575,left=75,top=20,status=no,resizable=yes'));keyit.focus();}</script>
<div class=post>
<div class=postTitle>&nbsp;</div>
<div class=postText>&nbsp;
<div style="TEXT-INDENT: 21pt">本节内容包含了Ant的历史简要介绍，Ant的功能以及Ant框架的介绍，并对下载安装使用Ant进行了示例介绍，同时通过一个Java程序讲解了Ant的基本使用方法。</div>
<div style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt"><strong>1.<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></strong><strong>Ant</strong><strong>简介：这里引用</strong><strong>Ant</strong><strong>帮助文档中对</strong><strong>Ant</strong><strong>的介绍：</strong></div>
<div style="MARGIN-TOP: 0cm; MARGIN-BOTTOM: 0pt; LINE-HEIGHT: 12pt"><em><span style="FONT-SIZE: 10.5pt; COLOR: black">Apache Ant</span></em><em><span style="FONT-SIZE: 10.5pt; COLOR: black">是一个基于</span></em><em><span style="FONT-SIZE: 10.5pt; COLOR: black">Java</span></em><em><span style="FONT-SIZE: 10.5pt; COLOR: black">的构建工具。从理论上讲</span></em><em><span style="FONT-SIZE: 10.5pt; COLOR: black">，</span></em><em><span style="FONT-SIZE: 10.5pt; COLOR: black">也是一种类似于</span></em><em><span style="FONT-SIZE: 10.5pt; COLOR: black">Make</span></em><em><span style="FONT-SIZE: 10.5pt; COLOR: black">的工具</span></em><em><span style="FONT-SIZE: 10.5pt; COLOR: black">，</span></em><em><span style="FONT-SIZE: 10.5pt; COLOR: black">只是去除了</span></em><em><span style="FONT-SIZE: 10.5pt; COLOR: black">Make</span></em><em><span style="FONT-SIZE: 10.5pt; COLOR: black">工具的缺点。</span></em></div>
<div style="MARGIN-TOP: 0cm; MARGIN-BOTTOM: 0pt; LINE-HEIGHT: 12pt"><em><span style="FONT-SIZE: 10.5pt; COLOR: black">既然已经有了</span></em><em><span style="FONT-SIZE: 10.5pt; COLOR: black; FONT-STYLE: normal">make</span></em><em><span style="FONT-SIZE: 10.5pt; COLOR: black">, </span></em><em><span style="FONT-SIZE: 10.5pt; COLOR: black; FONT-STYLE: normal">gnumake</span></em><em><span style="FONT-SIZE: 10.5pt; COLOR: black">, </span></em><em><span style="FONT-SIZE: 10.5pt; COLOR: black; FONT-STYLE: normal">nmake</span></em><em><span style="FONT-SIZE: 10.5pt; COLOR: black">, </span></em><em><span style="FONT-SIZE: 10.5pt; COLOR: black; FONT-STYLE: normal">jam</span></em><em><span style="FONT-SIZE: 10.5pt; COLOR: black">以及其他的构件工具，为什么还要</span></em><em><span style="FONT-SIZE: 10.5pt; COLOR: black">Ant</span></em><em><span style="FONT-SIZE: 10.5pt; COLOR: black">呢？因为</span></em><em><span style="FONT-SIZE: 10.5pt; COLOR: black">Ant</span></em><em><span style="FONT-SIZE: 10.5pt; COLOR: black">的早期开发者发现所有以上这些工具都或多或少的有一些局限性，使得在跨平台开发软件成为困难。类似于</span></em><em><span style="FONT-SIZE: 10.5pt; COLOR: black">Make</span></em><em><span style="FONT-SIZE: 10.5pt; COLOR: black">的工具都是传统的基于</span></em><em><span style="FONT-SIZE: 10.5pt; COLOR: black">Shell</span></em><em><span style="FONT-SIZE: 10.5pt; COLOR: black">的</span></em><em><span style="FONT-SIZE: 10.5pt; COLOR: black">--</span></em><em><span style="FONT-SIZE: 10.5pt; COLOR: black">首先进行依赖性检查，然后执行命令。这意味着你可以轻易的通过使用或者编写程序来扩展这些工具，以满足不同的平台。当然，这也意味着你将局限于特定的平台，至少可以说局限于特定类型的平台，例如：</span></em><em><span style="FONT-SIZE: 10.5pt; COLOR: black">Unix</span></em><em><span style="FONT-SIZE: 10.5pt; COLOR: black">平台。</span></em></div>
<div style="MARGIN-TOP: 0cm; MARGIN-BOTTOM: 0pt; LINE-HEIGHT: 12pt"><em><span style="FONT-SIZE: 10.5pt; COLOR: black">同时，</span></em><em><span style="FONT-SIZE: 10.5pt; COLOR: black">Make</span></em><em><span style="FONT-SIZE: 10.5pt; COLOR: black">文件也有一些先天的缺陷。好多人都会遇到恐怖的</span></em><em><span style="FONT-SIZE: 10.5pt; COLOR: black">tab</span></em><em><span style="FONT-SIZE: 10.5pt; COLOR: black">问题。</span></em><em><span style="FONT-SIZE: 10.5pt; COLOR: black">Ant</span></em><em><span style="FONT-SIZE: 10.5pt; COLOR: black">的最初开发者多次说&#8220;我的命令不能执行因为我在</span></em><em><span style="FONT-SIZE: 10.5pt; COLOR: black">tab</span></em><em><span style="FONT-SIZE: 10.5pt; COLOR: black">前面加了一个空格！&#8221;。一些工具如</span></em><em><span style="FONT-SIZE: 10.5pt; COLOR: black">Jam</span></em><em><span style="FONT-SIZE: 10.5pt; COLOR: black">一定程序上解决了这个问题，但仍有其它的格式问题。</span></em></div>
<div style="MARGIN-TOP: 0cm; MARGIN-BOTTOM: 0pt; LINE-HEIGHT: 12pt"><em><span style="FONT-SIZE: 10.5pt; COLOR: black">Ant</span></em><em><span style="FONT-SIZE: 10.5pt; COLOR: black">与从基于命令的那些扩展开来的那些工具不同，</span></em><em><span style="FONT-SIZE: 10.5pt; COLOR: black">Ant</span></em><em><span style="FONT-SIZE: 10.5pt; COLOR: black">是由</span></em><em><span style="FONT-SIZE: 10.5pt; COLOR: black">java</span></em><em><span style="FONT-SIZE: 10.5pt; COLOR: black">类扩展的。不用编写</span></em><em><span style="FONT-SIZE: 10.5pt; COLOR: black">shell</span></em><em><span style="FONT-SIZE: 10.5pt; COLOR: black">命令，而是配置基于</span></em><em><span style="FONT-SIZE: 10.5pt; COLOR: black">XML</span></em><em><span style="FONT-SIZE: 10.5pt; COLOR: black">的文件，形成多个任务的目标配置树。每一个任务都是通过一个实现了一个规定接口的</span></em><em><span style="FONT-SIZE: 10.5pt; COLOR: black">java</span></em><em><span style="FONT-SIZE: 10.5pt; COLOR: black">类来运行的。</span></em></div>
<div style="MARGIN-TOP: 0cm; MARGIN-BOTTOM: 0pt; LINE-HEIGHT: 12pt"><em><span style="FONT-SIZE: 10.5pt">ant</span></em><em><span style="FONT-SIZE: 10.5pt">缺少了一些直接执行</span></em><em><span style="FONT-SIZE: 10.5pt">shell</span></em><em><span style="FONT-SIZE: 10.5pt">命令的能力，如</span></em><em><span style="FONT-SIZE: 10.5pt">find . -name foo -exec rm {}</span></em><em><span style="FONT-SIZE: 10.5pt">，但它给用户提供了跨平台的能力，可以在任何地方工作。实际上，</span></em><em><span style="FONT-SIZE: 10.5pt">Ant</span></em><em><span style="FONT-SIZE: 10.5pt">也提供了命令</span></em><em><span style="FONT-SIZE: 10.5pt">execute</span></em><em><span style="FONT-SIZE: 10.5pt">用来执行</span></em><em><span style="FONT-SIZE: 10.5pt">shell</span></em><em><span style="FONT-SIZE: 10.5pt">命令</span></em><em><span style="FONT-SIZE: 10.5pt">,</span></em><em><span style="FONT-SIZE: 10.5pt">这就是它的任务，它允许执行基于操作系统的命令。</span></em></div>
<div style="MARGIN-TOP: 0cm; MARGIN-BOTTOM: 0pt; MARGIN-LEFT: 0cm"><span style="FONT-SIZE: 10.5pt">简单的说，</span><span style="FONT-SIZE: 10.5pt">Ant</span><span style="FONT-SIZE: 10.5pt">是一个基于</span><span style="FONT-SIZE: 10.5pt">Java</span><span style="FONT-SIZE: 10.5pt">，并且主要用于</span><span style="FONT-SIZE: 10.5pt">Java</span><span style="FONT-SIZE: 10.5pt">工程的构建工具。</span><span style="FONT-SIZE: 10.5pt">Ant</span><span style="FONT-SIZE: 10.5pt">本意是</span><span style="FONT-SIZE: 10.5pt">Another Neat Tool,</span><span style="FONT-SIZE: 10.5pt">也就是另一种整洁的工具，取首字符就是</span><span style="FONT-SIZE: 10.5pt">Ant</span><span style="FONT-SIZE: 10.5pt">。</span></div>
<div style="MARGIN-TOP: 0cm; MARGIN-BOTTOM: 0pt; MARGIN-LEFT: 0cm"><span style="FONT-SIZE: 10.5pt">构建工具就是为了减少重复工作而产生的。</span></div>
<div style="MARGIN-TOP: 0cm; MARGIN-BOTTOM: 0pt; MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt"><strong><span style="FONT-SIZE: 10.5pt">2.<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></strong><strong><span style="FONT-SIZE: 10.5pt">Ant</span></strong><strong><span style="FONT-SIZE: 10.5pt">的一些核心概念：</span></strong></div>
<div style="MARGIN-TOP: 0cm; MARGIN-BOTTOM: 0pt; MARGIN-LEFT: 21pt"><span style="FONT-SIZE: 10.5pt">XML:</span><span style="FONT-SIZE: 10.5pt">构建文件是以</span><span style="FONT-SIZE: 10.5pt">XML</span><span style="FONT-SIZE: 10.5pt">文件来描述的，采用</span><span style="FONT-SIZE: 10.5pt">XML</span><span style="FONT-SIZE: 10.5pt">格式有很多好处。这里就不一一列举。</span></div>
<div style="MARGIN-TOP: 0cm; MARGIN-BOTTOM: 0pt; MARGIN-LEFT: 21pt"><span style="FONT-SIZE: 10.5pt">陈述式语法：构建文件短小精悍，且易于理解。</span></div>
<div style="MARGIN-TOP: 0cm; MARGIN-BOTTOM: 0pt; MARGIN-LEFT: 21pt"><span style="FONT-SIZE: 10.5pt">每个构建文件包含一个工程</span><span style="FONT-SIZE: 10.5pt">(project)</span><span style="FONT-SIZE: 10.5pt">。</span></div>
<div style="MARGIN-TOP: 0cm; MARGIN-BOTTOM: 0pt; MARGIN-LEFT: 21pt"><span style="FONT-SIZE: 10.5pt">每个工程包含若干个目标</span><span style="FONT-SIZE: 10.5pt">(target)</span><span style="FONT-SIZE: 10.5pt">。</span></div>
<div style="MARGIN-TOP: 0cm; MARGIN-BOTTOM: 0pt; MARGIN-LEFT: 21pt"><span style="FONT-SIZE: 10.5pt">目标可以依赖于其他的目标</span><span style="FONT-SIZE: 10.5pt">(depends)</span><span style="FONT-SIZE: 10.5pt">。</span></div>
<div style="MARGIN-TOP: 0cm; MARGIN-BOTTOM: 0pt; MARGIN-LEFT: 21pt"><span style="FONT-SIZE: 10.5pt">目标包含任务</span><span style="FONT-SIZE: 10.5pt">(task)</span><span style="FONT-SIZE: 10.5pt">。</span></div>
<div style="MARGIN-TOP: 0cm; MARGIN-BOTTOM: 0pt; MARGIN-LEFT: 21pt"><span style="FONT-SIZE: 10.5pt">易于使用</span><span style="FONT-SIZE: 10.5pt">Java</span><span style="FONT-SIZE: 10.5pt">语言增加新的任务</span><span style="FONT-SIZE: 10.5pt">---</span><span style="FONT-SIZE: 10.5pt">易于扩展（自定义）。</span></div>
<div style="MARGIN-TOP: 0cm; MARGIN-BOTTOM: 0pt; MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt"><strong><span style="FONT-SIZE: 10.5pt">3.<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></strong><strong><span style="FONT-SIZE: 10.5pt">Ant</span></strong><strong><span style="FONT-SIZE: 10.5pt">结构：</span></strong></div>
<div style="MARGIN-TOP: 0cm; MARGIN-BOTTOM: 0pt; MARGIN-LEFT: 21pt"><span style="FONT-SIZE: 10.5pt">Ant</span><span style="FONT-SIZE: 10.5pt">的结构如下图所示：</span></div>
<div style="MARGIN-TOP: 0cm; TEXT-JUSTIFY: inter-ideograph; MARGIN-BOTTOM: 0pt; MARGIN-LEFT: 0cm"><span style="FONT-SIZE: 10.5pt"><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/sunjavaduke/1dfd5fb0860e49caa4ac48253544cb79.png"></span></div>
<div style="MARGIN-TOP: 0cm; TEXT-JUSTIFY: inter-ideograph; MARGIN-BOTTOM: 0pt; MARGIN-LEFT: 0cm"><span style="FONT-SIZE: 10.5pt">构建文件的概念视图：工程包含一个目标的集合。在每个目标里是任务的声明，它们是对</span><span style="FONT-SIZE: 10.5pt">Ant</span><span style="FONT-SIZE: 10.5pt">用于构建该目标的行为说明。目标生成一个依赖关系图表来声明该目标的依赖关系。当执行一个目标时，必须先执行它们依赖的目标。</span></div>
<div style="MARGIN-TOP: 0cm; TEXT-JUSTIFY: inter-ideograph; MARGIN-BOTTOM: 0pt; MARGIN-LEFT: 0cm">&nbsp;</div>
<div style="MARGIN-TOP: 0cm; TEXT-JUSTIFY: inter-ideograph; MARGIN-BOTTOM: 0pt; MARGIN-LEFT: 0cm"><strong><span style="FONT-SIZE: 10.5pt">例子：一个典型的构建文件：</span></strong></div>
<div>&lt;?xml version="1.0" ?&gt;</div>
<div>&lt;project name="OurProject" default="deploy"&gt;</div>
<div style="TEXT-INDENT: 21pt">&lt;target name="init"&gt;</div>
<div style="TEXT-INDENT: 21pt">&lt;mkdir dir="build/classes" /&gt;</div>
<div style="TEXT-INDENT: 21pt">&lt;mkdir dir="dist" /&gt;</div>
<div style="TEXT-INDENT: 21pt">&lt;/target&gt;</div>
<div style="TEXT-INDENT: 21pt">&lt;target name="compile" depends="init" &gt;</div>
<div style="TEXT-INDENT: 21pt">&lt;javac srcdir="src" destdir="build/classes"/&gt;</div>
<div style="TEXT-INDENT: 21pt">&lt;/target&gt;</div>
<div style="TEXT-INDENT: 21pt">&lt;target name="doc" depends="init" &gt;</div>
<div style="TEXT-INDENT: 21pt">&lt;javadoc destdir="build/classes" sourcepath="src"</div>
<div style="TEXT-INDENT: 21pt">packagenames="org.*" /&gt;</div>
<div style="TEXT-INDENT: 21pt">&lt;/target&gt;</div>
<div style="TEXT-INDENT: 21pt">&lt;target name="deploy" depends="compile,doc" &gt;</div>
<div style="TEXT-INDENT: 21pt">&lt;jar destfile="dist/project.jar" basedir="build/classes"/&gt;</div>
<div style="TEXT-INDENT: 21pt">&lt;ftp server="<span style="COLOR: red">${server.name}"</span></div>
<div style="TEXT-INDENT: 21pt">userid="<span style="COLOR: red">${ftp.username}"</span></div>
<div style="TEXT-INDENT: 21pt">password="<span style="COLOR: red">${ftp.password}"&gt;</span></div>
<div style="TEXT-INDENT: 21pt">&lt;fileset dir="dist"/&gt;</div>
<div style="TEXT-INDENT: 21pt">&lt;/ftp&gt;</div>
<div style="TEXT-INDENT: 21pt">&lt;/target&gt;</div>
<div>&lt;/project&gt;</div>
<div>&nbsp;</div>
<div><strong>该构建过程如下：</strong></div>
<div>系统初始化<span>&#224;</span>编译<span>&#224;</span>生成JAVADOC<span>&#224;</span>打包<span>&#224;</span>上传到FTP，其中后两步结合到一起叫部署。</div>
<div>&nbsp;</div>
<div>执行时输出如下：</div>
<div>&gt; ant -propertyfile ftp.properties</div>
<div>Buildfile: build.xml</div>
<div>init:</div>
<div>[mkdir] Created dir: /home/ant/Projects/OurProject/build/classes</div>
<div>[mkdir] Created dir: /home/ant/Projects/OurProject/dist</div>
<div>compile:</div>
<div>[javac] Compiling 1 source file to /home/ant/Projects/OurProject/build/</div>
<div>classes</div>
<div>doc:</div>
<div>[javadoc] Generating Javadoc</div>
<div>[javadoc] Javadoc execution</div>
<div>[javadoc] Loading source files for package org.example.antbook.lesson1...</div>
<div>[javadoc] Constructing Javadoc information...</div>
<div>[javadoc] Building tree for all the packages and classes...</div>
<div>[javadoc] Building index for all the packages and classes...</div>
<div>[javadoc] Building index for all classes...</div>
<div>deploy:</div>
<div>[jar] Building jar: /home/ant/Projects/OurProject/dist/project.jar</div>
<div>[ftp] sending files</div>
<div>[ftp] 1 files sent</div>
<div>BUILD SUCCESSFUL</div>
<div>Total time: 5 seconds.</div>
<div>在执行时使用命令行参数以传入一个属性文件，属性文件中包含连接FTP服务器使用的服务器名，用户名，用户密码来给<span style="COLOR: red">特性使用。</span></div>
<div>这个例子很好的展示了Ant的一些基本要素：目标依赖、特性的使用、编译、文档生成、JAR打包（tar,Zip,WAR,EAR等），最后是部署。</div>
<div>&nbsp;</div>
<div>Ant的简单任务(&lt;mkdir&gt;)都是由Java类库来实现相应的功能。而一些复杂的任务&lt;ftp&gt;、&lt;junit&gt;还需要第三方库的支持。</div>
<div>&nbsp;</div>
<div>Ant的一个强大之处：它总能工作。只要正确的指定构建文件，Ant就能计算出目标的依赖性，并且按照正确的顺序调用目标。目标通过任务按序执行，而任务自身处理其文件依赖性以及实际的操作来完成工作。因为每个任务通常都是在高层陈述，所以一两行XML语句经常就已经足够描述任务的内容。</div>
<div>&nbsp;</div>
<div style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt"><strong>4.<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></strong><strong>下载并安装</strong><strong>Ant</strong></div>
<div>使用Ant前提条件，系统中已经安装JDK以及Ant。在文档编写之时，Ant的最新版本是Ant 1.7,但是为了稳定性，本文档使用版本为Ant 1.6.5.</div>
<div>首先下载Ant，到apache软件网站<a href="http://www.apache.org/">http://www.apache.org</a>。</div>
<div>其次，解压缩文件，放到指定的系统目录中，例如C:\Ant。</div>
<div>再次，将其添加到path，以便从命令行使用。(一些IDE，例如Eclipse可以不需要设置path,而通过IDE相关设置将Ant添加到path中。)</div>
<div>再次，设置一些环境变量指向JDK以及ANT。</div>
<div>最后，添加需要的可选库。</div>
<div>&nbsp;</div>
<div>在Windows安装过程（以笔者的安装过程为例）</div>
<div>下载apache-ant-1.6.5-bin.zip到本地硬盘，解压缩之后将文件夹命名为Ant,放在C:\Ant中。这个目录就是Ant主目录。</div>
<div>应该将主目录中的bin目录添加到path属性中，这样就可以在命令行中调用ant命令，ANT_HOME是批处理文件所在目录的上级目录。最好明确设定。</div>
<div><span style="COLOR: black">现在许多工具已经集成了特定版本的</span><span style="COLOR: black">Ant</span><span style="COLOR: black">，一些操作系统甚至默认的已经安装了</span><span style="COLOR: black">Ant</span><span style="COLOR: black">。所以，你的系统中可能已经安装了</span><span style="COLOR: black">Ant</span><span style="COLOR: black">。</span></div>
<div>首先可以通过运行以下命令：<br><strong>ant -version</strong><br>和<br>ant -diagnostics <br>来确定。我们推荐您不设置CLASSPATH来运行Ant命令。如果任何版本的Ant可以从CLASSPATH加载 ，这时就会由于加载了不兼容的类而产生许多错误。</div>
<div>&nbsp;</div>
<div>一些其他问题请参阅Ant的FAQ设置。</div>
<div>正常情况下，执行ant &#8211;version即可显示Ant版本，则说明安装配制成功：</div>
<div><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/sunjavaduke/ea29812585e24474a75be50e7407e4be.png"></div>
<div>&nbsp;</div>
<div style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt"><strong>5.<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></strong><strong>运行第一个构建文件：</strong></div>
<div style="MARGIN-LEFT: 21pt">首先创建一个Java工程，名为AntProject，工程中源文件和目标文件是分开的，分别为文件夹src和bin,然后创建一个Java类文件，类名为</div>
<div style="MARGIN-LEFT: 21pt">com.neusoft.test.AntTest，只是为了测试，所以类的内容很简单：</div>
<div style="MARGIN-LEFT: 21pt">package com.neusoft.test;</div>
<div style="MARGIN-LEFT: 21pt">/**</div>
<div style="MARGIN-LEFT: 21pt">&nbsp;*This is just a test class.</div>
<div style="MARGIN-LEFT: 21pt">&nbsp;*/</div>
<div style="MARGIN-LEFT: 21pt">public class AntTest{</div>
<div style="MARGIN-LEFT: 21pt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static void main(String[] args){</span></div>
<div style="MARGIN-LEFT: 21pt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int i=0;i&lt;args.length;i++){</span></div>
<div style="MARGIN-LEFT: 21pt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(args[i]);</span></div>
<div style="MARGIN-LEFT: 21pt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></div>
<div style="MARGIN-LEFT: 21pt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></div>
<div style="MARGIN-LEFT: 21pt">}</div>
<div style="MARGIN-LEFT: 21pt">&nbsp;</div>
<div style="MARGIN-LEFT: 21pt"><strong>然后我们在工程的路径下面建立一个构建文件</strong><strong>build.xml</strong><strong>，内容如下：</strong></div>
<div>&lt;?xml version="1.0" ?&gt;</div>
<div>&lt;project name="structured" default="archive" &gt;</div>
<div style="TEXT-INDENT: 21pt">&lt;target name="init"&gt;</div>
<div style="TEXT-INDENT: 21pt">&lt;mkdir dir="build/classes" /&gt;</div>
<div style="TEXT-INDENT: 21pt">&lt;mkdir dir="dist" /&gt;</div>
<div style="TEXT-INDENT: 21pt">&lt;/target&gt;</div>
<div style="TEXT-INDENT: 21pt">&lt;target name="compile" depends="init" &gt;</div>
<div style="TEXT-INDENT: 21pt">&lt;javac srcdir="src"</div>
<div style="TEXT-INDENT: 21pt">destdir="build/classes"</div>
<div style="TEXT-INDENT: 21pt">/&gt;</div>
<div style="TEXT-INDENT: 21pt">&lt;/target&gt;</div>
<div style="TEXT-INDENT: 21pt">&lt;target name="archive" depends="compile" &gt;</div>
<div style="TEXT-INDENT: 21pt">&lt;jar destfile="dist/project.jar"</div>
<div style="TEXT-INDENT: 21pt">basedir="build/classes" /&gt;</div>
<div style="TEXT-INDENT: 21pt">&lt;/target&gt;</div>
<div style="TEXT-INDENT: 21pt">&lt;target name="clean" depends="init"&gt;</div>
<div style="TEXT-INDENT: 21pt">&lt;delete dir="build" /&gt;</div>
<div style="TEXT-INDENT: 21pt">&lt;delete dir="dist" /&gt;</div>
<div style="TEXT-INDENT: 21pt">&lt;/target&gt;</div>
<div>&lt;/project&gt;</div>
<div>构建文件说明如下图：</div>
<div style="TEXT-INDENT: 21pt"><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/sunjavaduke/d13b06a92da34475a024ee7923683186.png"></div>
<div>关于XML的知识，请参考其他书籍，这里不做介绍。</div>
<div>以上创建完成后，目录结构如下图：</div>
<div><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/sunjavaduke/18957dabfc4747ea9fa861b1101371af.png"></div>
<div>&nbsp;</div>
<div>Ant构建文件总是有一个&lt;project&gt;元素做为根元素，它有两个属性，name和default，&lt;target&gt;元素是&lt;project&gt;元素的子元素，可以有多个，它有两个属性，name和depends，&lt;target&gt;元素包含的元素就是一些任务元素。</div>
<div>&lt;target&gt;可以由命令行进行显示的调用，也可以在内部使用如可以直接调用ant init、ant compile等。如果不写参数，则默认的build文件是build.xml，默认的目标是&lt;project&gt;的default属性定义的目标。目标的名称是唯一的，可以是任意字符串。</div>
<div>&nbsp;</div>
<div>下面我们先运行一下这个Ant构建，再讲解其他的内容，进入工程目录，执行</div>
<div>ant</div>
<div>这里就相当于执行默认的目标，也就是&lt;project name="structured" default="archive" &gt;中的archive目标。</div>
<div><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/sunjavaduke/bf58caa3631043c9934e37a8c6842cd3.png"></div>
<div>&nbsp;</div>
<div>这里说明了首先初始化创建两个目录，然后编译了一个JAVA文件，然后进行了打包的操作。</div>
<div>&nbsp;</div>
<div><strong>这里讲解一下如果构建失败了怎么办？</strong></div>
<div>首先有可能是XML语法书写不正确(将&lt;target&gt;写成&lt;targe&gt;)，或者在任务执行过程中出现了错误(.java文件中包含编译错误)，或者任务名称书写错误(将&lt;javac&gt;写成&lt;javacc&gt;)等等，这些都不是Ant的错误，不需要填写Bug Report。写XML时一定要细心，一些IDE已经有验证功能，可以很好的防止书写的错误。</div>
<div>&nbsp;</div>
<div><strong>出现错误时，可以使用</strong></div>
<div>ant &#8211;verbose</div>
<div>或者</div>
<div>ant &#8211;debug来获取更加详细的构建信息，以解决问题。</div>
<div>下图是使用ant &#8211;verbose时的输出，使用ant &#8211;debug将获取比这更详细的信息，这里就不举例了。</div>
<div><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/sunjavaduke/457f2ee754f04d1380a08a6bc45e55b9.png"></div>
<div>&nbsp;</div>
<div>本例中直接使用了软件工程中的构建结构，使用src作为源文件目录，build/class作为中间生成文件，以dist作为可发布文件。在最后把一些可执行文件可以放在bin目录中。此时目录结构如下图所示：</div>
<div><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/sunjavaduke/3112c28771af45a3be22d7e26e77836d.png"></div>
<div>&nbsp;</div>
<div>我们需要一种办法来确定某些任务先执行，而有些任务后执行，比如必须先编译，才能执行程序或者打包。我们在声明目标的时候，就在其依赖属性中列出其依赖关系：</div>
<div>&lt;target name="compile" depends="init" &gt;</div>
<div>&lt;target name="archive" depends="compile" &gt;</div>
<div>&lt;target name="clean" depends="init"&gt;</div>
<div>如果一个目标依赖与多个其他目标，需要将它们都写到依赖属性中，例如：</div>
<div>depents=&#8221;compile,test&#8221;。在我们的构建中，archive依赖于init和compile，但是我们不需要去写，因为compile已经依赖于init了。即：Ant的依赖关系是传递的，但不是自反的。</div>
<div><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/sunjavaduke/ca47e0d3fd364097922f0f809a976277.png"></div>
<div>如果在执行过程中两个目标共享同一个目标，则先导目标只被执行一次。</div>
<div>可以通过指定目标来运行构建：</div>
<div>例如执行完ant后，可以执行ant clean来清理构建：</div>
<div><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/sunjavaduke/19f835f2ad08455fa56fb807fa63c69e.png"></div>
<div>&nbsp;</div>
<div>ant等价于ant archive</div>
<div>ant init</div>
<div>ant clean</div>
<div>ant compile</div>
<div>ant archive</div>
<div><span style="COLOR: red">ant clean archive</span></div>
<div>&nbsp;</div>
<div><strong>当构建完成一次以后，再次执行构建会发生什么呢？</strong></div>
<div><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/sunjavaduke/904f2e88b87947d09c5195ed45dbb523.png"></div>
<div>&nbsp;</div>
<div>第二次执行构建时只花了2s，相比第一次的4s。并且没有任何一个目标表示做了任何工作。</div>
<div>原因如下：所有的任务都检查了它们的依赖关系：</div>
<div>&lt;mkdir&gt;没有创建目录因为已经存在</div>
<div>&lt;javac&gt;比较了源文件和类文件的时间戳</div>
<div>&lt;jar&gt;比较了要被加入文件与已经存在文件的时间</div>
<div>只有更新的时候才进行任务执行。</div>
<div>&nbsp;</div>
<div><strong>Ant</strong><strong>如何处理命令行上的多个目标？</strong></div>
<div>执行ant compile archive会怎么样？</div>
<div>先实验一下：</div>
<div><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/sunjavaduke/b563e0adc32748f1a08f9ba0f2fb4667.png"></div>
<div>&nbsp;</div>
<div>Ant依次执行每个目标和其依赖目标，即Ant的执行顺序是init compile init compile archive，虽然这样看起来增加了额外的工作，但是通过上面的执行过程就会发现，由于其依赖性检查的阻止，第二次的init和compile并未真正的执行，执行时间与直接执行archive的时间是一样的。</div>
<div>&nbsp;</div>
<div><strong>运行程序：</strong></div>
<div>普通执行该类的方法是：</div>
<div>java &#8211;cp build/class com.neusoft.test.AntTest args1 args2</div>
<div>而我们使用Ant的任务来执行它仅仅需要增加一个任务，好处在于：</div>
<div style="TEXT-INDENT: 21pt"><span style="COLOR: red">让用于执行的目标依赖与编译的目标，确保运行最新版本</span></div>
<div style="TEXT-INDENT: 21pt">易于传递复杂参数</div>
<div style="TEXT-INDENT: 21pt">设置classpath更方便</div>
<div style="TEXT-INDENT: 21pt">在Ant自身的JVM中运行，载入更快</div>
<div style="TEXT-INDENT: 21pt">程序返回值非9，可以终止构建</div>
<div>增加一个新的目标：</div>
<div>&lt;target name="execute" depends="compile"&gt;</div>
<div style="TEXT-INDENT: 10.5pt">&lt;java classname="com.neusoft.test.AntTest"</div>
<div style="TEXT-INDENT: 10.5pt">classpath="build/classes"&gt;</div>
<div style="TEXT-INDENT: 10.5pt">&lt;arg value="a"/&gt;</div>
<div style="TEXT-INDENT: 10.5pt">&lt;arg value="b"/&gt;</div>
<div style="TEXT-INDENT: 10.5pt"><span style="COLOR: red">&lt;arg file="."/&gt;</span></div>
<div style="TEXT-INDENT: 10.5pt">&lt;/java&gt;</div>
<div>&lt;/target&gt;</div>
<div>&nbsp;</div>
<div>最后一个参数是file=&#8221;.&#8221;，表示传入的参数是一个目录，为文件绝对路径。</div>
<div>运行该目标，输出如下：</div>
<div><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/sunjavaduke/8c8d4063542a498a9ef5d88fd5867661.png"></div>
<div>&nbsp;</div>
<div>Ant命令行选项：</div>
<div><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/sunjavaduke/a1affbf572d04d559f61b9df8722fd57.png"></div>
<div>&nbsp;</div>
<div>请参阅相关手册进行查询相关选项的功能。</div>
<div>&nbsp;</div>
<div><strong>当有多个构建文件时，可以指定构建文件：</strong></div>
<div>ant &#8211;buildfile build.xml compile</div>
<div>来表示执行build.xml这个构建文件中的compile目标。</div>
<div>&nbsp;</div>
<div>控制提供的信息量：</div>
<div>ant &#8211;quiet:安静模式，不给出任何输出。</div>
<div><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/sunjavaduke/e93c45b2b38f465783cc7dc668e69b4f.png"></div>
<div>&nbsp;</div>
<div>ant &#8211;emacs:简单模式，不显示任务名称。</div>
<div><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/sunjavaduke/96fc30525694483ea06e5d2f3764bcae.png"></div>
<div>&nbsp;</div>
<div>ant &#8211;projecthelp:获取项目信息。</div>
<div><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/sunjavaduke/52050191b8974e1e955de48d68730446.png"></div>
<div>&nbsp;</div>
<div><strong>最终的构建文件，添加了</strong><strong>description</strong><strong>属性。</strong></div>
<div>&lt;?xml version="1.0" ?&gt;</div>
<div>&lt;project name="secondbuild" <strong>default="execute" </strong>&gt;</div>
<div style="TEXT-INDENT: 10.5pt"><strong>&lt;description&gt;Compiles and runs a simple program&lt;/description&gt;</strong></div>
<div style="TEXT-INDENT: 10.5pt">&lt;target name="init"&gt;</div>
<div style="TEXT-INDENT: 10.5pt">&lt;mkdir dir="build/classes" /&gt;</div>
<div style="TEXT-INDENT: 21pt">&lt;mkdir dir="dist" /&gt;</div>
<div style="TEXT-INDENT: 10.5pt">&lt;/target&gt;</div>
<div style="TEXT-INDENT: 10.5pt">&lt;target name="compile" depends="init"</div>
<div style="TEXT-INDENT: 10.5pt"><strong>description="Compiles the source code"</strong>&gt;</div>
<div style="TEXT-INDENT: 10.5pt">&lt;javac srcdir="src" destdir="build/classes"/&gt;</div>
<div style="TEXT-INDENT: 10.5pt">&lt;/target&gt;</div>
<div style="TEXT-INDENT: 10.5pt">&lt;target name="archive" depends="compile"</div>
<div style="TEXT-INDENT: 10.5pt"><strong>description="Creates the JAR file"</strong>&gt;</div>
<div style="TEXT-INDENT: 10.5pt">&lt;jar destfile="dist/project.jar" basedir="build/classes"/&gt;</div>
<div style="TEXT-INDENT: 10.5pt">&lt;/target&gt;</div>
<div>&lt;target name="clean" depends="init"</div>
<div style="TEXT-INDENT: 10.5pt"><strong>description="Removes the temporary directories used"</strong>&gt;</div>
<div style="TEXT-INDENT: 10.5pt">&lt;delete dir="build" /&gt;</div>
<div style="TEXT-INDENT: 21pt">&lt;delete dir="dist" /&gt;</div>
<div style="TEXT-INDENT: 10.5pt">&lt;/target&gt;</div>
<div style="TEXT-INDENT: 10.5pt">&lt;target name="execute" depends="compile"</div>
<div><strong>description="Runs the program"</strong>&gt;</div>
<div style="TEXT-INDENT: 10.5pt"><strong>&lt;echo level="warning" message="running" /&gt;</strong></div>
<div style="TEXT-INDENT: 10.5pt">&lt;java classname="org.example.antbook.lesson1.Main"</div>
<div style="TEXT-INDENT: 21pt">classpath="build/classes"&gt;</div>
<div style="TEXT-INDENT: 10.5pt">&lt;arg value="a"/&gt;</div>
<div style="TEXT-INDENT: 21pt">&lt;arg value="b"/&gt;</div>
<div>&lt;arg file="."/&gt;</div>
<div>&lt;/java&gt;</div>
<div style="TEXT-INDENT: 10.5pt">&lt;/target&gt;</div>
<div>&lt;/project&gt;</div>
&nbsp;<br><br>
<p id=TBPingURL>Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1523819</p>
<br></div>
</div>
<img src ="http://www.blogjava.net/baoyaer/aggbug/138525.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2007-08-22 10:13 <a href="http://www.blogjava.net/baoyaer/articles/138525.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【ZT】性能测试指标的基本概念 </title><link>http://www.blogjava.net/baoyaer/articles/135887.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Fri, 10 Aug 2007 09:08:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/135887.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/135887.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/135887.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/135887.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/135887.html</trackback:ping><description><![CDATA[<table cellSpacing=2 cellPadding=0 width="100%" border=0 select="Articles.Article">
    <tbody>
        <tr>
            <td height=25></td>
        </tr>
        <tr>
            <td>
            <table id=tblDetail_2703 style="TABLE-LAYOUT: fixed; WORD-BREAK: break-all; WORD-WRAP: break-word" cellSpacing=0 cellPadding=0 width="95%" align=center border=0>
                <tbody>
                    <tr>
                        <td>
                        <table class=bottomline cellSpacing=0 cellPadding=0 width="100%" border=0>
                            <tbody>
                                <tr>
                                    <td align=right height=25><span>2007-08-06 17:33:53</span>&nbsp;发表, 已被浏览了( <span class=article_view_count>27</span> )次&nbsp;┆ <span id=quote_2703 style="DISPLAY: inline"><a title=推荐到内网最新文章栏目 onclick="quoteDoc('【ZT】性能测试指标的基本概念','2703','刘平君','https://intranet.trs.com.cn/intranet2007/blog/u/estherrie/d2703.html')" href="javascript:"><u><font color=#0000ff>推荐到内网</font></u></a>┆ </span><span><a href="https://intranet.trs.com.cn/intranet2007/blog/u_estherrie/showdoc.jsp?docid=2703#CommentingEnd"><u><font color=#0000ff>查看评论</font></u></a></span>&nbsp;&nbsp; </td>
                                </tr>
                            </tbody>
                        </table>
                        </td>
                    </tr>
                    <tr>
                        <td class=docbody align=left>
                        <p>普及一下性能测试的一些基本知识，自己也借此学习了解一下。</p>
                        <p><font face=宋体 size=1><strong>吞吐量/处理能力</strong><br>处理能力又叫吞吐量，指的是单位时间内处理的客户端请求数量。通常情况下，吞吐量用请求数/秒 Or 页面数/秒来衡量。从业务角度看，吞吐量也可以用访问人数/天Or页面访问量/天来衡量。</font><br><font face=宋体><font size=1></font></font><br><font face=宋体><font size=1><strong>负载</strong></font></font><br><font face=宋体><font size=1>负载分为客户端负载和服务器端负载客户端负载的通俗解释就是有多少个用户在同时使用软件服务器端负载的通俗解释就是有多少个请求同时到达了服务器端，要求服务器进行处理。例如，某个网站当前有10000个人在线访问，从他们的客户端层面看过去，这个负载就是客户端负载，为10000。若某个网站当前有10000个人在线访问，某一时刻，从他们的客户端同时发出了1000个页面的请求到服务器，从服务器端层面看过去，这个负载就是服务器端负载，为1000。</font></font><br><font face=宋体><font size=1></font></font><br><font face=宋体><font size=1><strong>响应时间</strong></font></font><br><font face=宋体><font size=1>响应时间是可以判断一个被测应用系统是否存在性能瓶颈的最直观的要素。例如，在执行完性能测试后，发现某个交易的&#8220;平均响应时间&#8221;为8秒，超过了预先确定下来的性能指标&#8220;该交易的性能指标为平均响应时间要小于等于3秒&#8221;。此时，就可以认为被测应用系统存在性能瓶颈了，要利用一定的手段去探查被测应用系统中哪个地方引起了系统的处理效率低以及低的原因了。响应时间一般包括最大响应时间和平均响应时间，响应时间包括网络上的传输时间，WEB服务器上处理时间、APP服务器上的处理时间、DB服务器上的处理时间，响应时间不包括浏览器上的内容显示时间。</font></font><br><font face=宋体><font size=1></font></font><br><font face=宋体><font size=1><strong>同时在线用户</strong></font></font><br><font face=宋体><font size=1>对于一个网站来讲，当一个用户登录到该网站的首页后，开始在该网站上进行各种操作，包括浏览网页、检索内容、提交表单等，这个过程中的用户称为在线用户。若同一时间点或同一个时间段内，有很多这样的用户在访问该网站，这些用户统称为该网站的同时在线用户。同时在线用户的另一层理解是，将应用系统整体看作是一个黑盒子，从用户的客户端层面看向系统，总共有多少个人在使用它。当进行性能测试时，如果你使用的是同时在线用户，则可以称之为同时在线负载。</font></font><br><font face=宋体><font size=1></font></font><br><font face=宋体><font size=1><strong>超级并发用户</strong></font></font><br><font face=宋体><font size=1>对于一个网站来讲,可能存在WEB服务器、应用服务器、数据库服务器三个层次，而用户所使用的浏览器是在最外面的客户端层面。如果某个时间点或时间段内，共有1000个用户同时在线，他们进行着各种各样的操作，而某个时间点上可能存在10个左右的用户同时进行了一个或多个操作，导致WEB服务器同时接收到了10个左右的交易请求，我们称这个10个左右的用户为超级并发用户。当进行性能测试时，如果你使用的是超级并发用户，则可以称之为超级并发负载。</font></font><br><font face=宋体><font size=1></font></font><br><font face=宋体><font size=1><strong>性能测试脚本</strong></font></font><br><font face=宋体><font size=1>脚本是用负载模拟工具开发出来的。脚本是一些代码的组合体，它用代码来实现用户对应用系统的操作。例如,你在一个网站上访问首页、输入用户名和密码后点击登录按钮进行登录，这是用户对应用系统的两步操作内容，在脚本中则包含了实现这两个操作步骤的代码。如果你要模拟10000个用户的负载，这10000个用户中50%进行首页的访问、20%进行注册、20%进行查询、10%进行某个页面的浏览，则你需要制作5个脚本，分别是首页访问脚本、注册脚本、查询脚本、页面浏览脚本。</font></font><br><font face=宋体><font size=1></font></font><br><strong><font face=宋体><font size=1>事务 </font></font><br></strong><font face=宋体><font size=1>事务是脚本的一个特性，每个事务都包含开始事务和结束事务。事务用来衡量脚本中一行代码或多行代码的执行所耗费的时间。你可以将开始事务放置在脚本中某行代码的前面，将结束事务放置在该行代码的后面，在该脚本的虚拟用户运行时，这个事务将衡量该行代码的执行花费了多长时间。</font></font><br><font face=宋体><font size=1></font></font><br><font face=宋体><font size=1><strong>交易</strong></font></font><br><font face=宋体><font size=1>交易分为业务层面和技术层面两种定义。业务层面交易是指完成一次完整的业务操作，例如进行一次取款、查询操作。技术层面的交易是指进行一次应用程序至应用程序、或者应用程序至数据库的系统操作。一般的一笔业务交易由多笔技术交易组成，根据业务交易的复杂度和系统应用架构的不同，其比例大致为1：2-1：10。</font></font><br><font face=宋体><font size=1></font></font><br><font face=宋体><font size=1><strong>TPS与HPS</strong></font></font><br><font face=宋体><font size=1>TPS (Transactions Per Second)是估算应用系统性能的重要依据。其意义是应用系统每秒钟处理完成的交易数量，尤其是交易类系统。一般的，评价系统性能均以每秒钟完成的技术交易的数量来衡量。系统整体处理能力取决于处理能力最低模块的TPS值。依据经验，应用系统的处理能力一般要求在10-100左右。不同应用系统的TPS有着十分大的差别，一般需要通过性能测试进行准确估算。当系统没有达到性能瓶颈时，TPS随着负载的增加呈近似线性增长，当接近性能瓶颈时出现拐点；如果系统健壮性较好，在到达性能瓶颈后，TPS基本保持水平，不会再随着负载的增加而有显著增长；而如果系统存在比较严重的性能问题，当到达性能瓶颈后，TPS会出现明显的下降趋势。HPS：(Hits per Second)每秒点击次数，是指在一秒钟的时间内用户对Web页面的链接、提交按钮等点击总和它一般和TPS成正比关系，是B/S系统中非常重要的性能指标之一。</font></font><br><font face=宋体><font size=1>TPS可以有多种衡量单位，在进行性能测试的业务模型分析时使用，例如：<br>（1）在税务系统中，可以用&#8220;系统每个月要处理10万用户的业务操作&#8221;，这里的TPS用企业数/月来衡量；（2）在税务系统中，也可以用&#8220;系统在第七天的8个小时内要处理4万用户的业务操作&#8221;，这里的TPS用企业数/天来衡量；（3）在税务系统中，也可以用&#8220;系统在第七天的10点到11点之间要处理1.2万用户的3种缴税交易操作，即3.6万次缴税交易操作&#8221;，这里的TPS用交易数/小时来衡量；（4）在税务系统中，也可以用&#8220;系统在第七天的10点到11点之间要处理1.2万用户的3种缴税交易操作，即3.6万次缴税交易操作，每次缴税交易要从客户端向服务器发送平均10次HTTP请求，即36万次HTTP请求操作&#8221;，这里的TPS用请求数/小时来衡量。<br>HPS是用来衡量很多用户使用客户端进行操作，向服务器发送请求的效率。我们认为HPS表现的是最终用户的整体行为，是衡量在线负载程度的一个指标。而TPS表现的是服务器端的程序行为，是衡量服务器处理能力高低的一个主要指标。<br>例如：HPS＝&#8220;点击次数/秒&#8221;；TPS＝&#8220;处理事务数/秒&#8221;，HPS与TPS没有绝对的关系。</font></font><br><font face=宋体><font size=1></font></font><br><font face=宋体><font size=1><strong>性能测试实现的准确性</strong></font></font><br><font face=宋体><font size=1>在进行了正确的性能测试分析后，获得了正确的性能测试需求，从而使用性能测试工具开发相应的性能测试脚本、开发相应的性能测试场景、在性能测试脚本中利用性能测试数据、在性能测试脚本中设置相应的思考时间、在性能测试场景中设置运行的参数等，以期能利用自动化的性能测试工具模拟现实中大量用户同时访问被测系统的情形。即，如果性能测试工具操作不当，将会导致无法准确的实现&#8220;模拟实际情况&#8221;的目标。例如，某些性能测试工程师在使用性能测试工具时不懂得利用&#8220;检查点&#8221;这个功能，从而无法发现在性能测试执行过程中大量虚拟用户甚至没有登陆到系统中的严重问题，仍然认为性能测试执行效果良好，被测系统性能没有问题。</font></font><br><font face=宋体><font size=1></font></font><br><font face=宋体><font size=1><strong>Web服务器和APP服务器</strong></font></font><br><font face=宋体><font size=1>通俗的讲，Web服务器传送(serves)页面使浏览器可以浏览，然而应用程序服务器提供的是客户端应用程序可以调用(call)的方法(methods)。确切一点，你可以说：Web服务器专门处理HTTP请求(request)，但是应用程序服务器是通过很多协议来为应用程序提供(serves)商业逻辑(business logic)。Web服务器(Web Server)Web服务器可以解析(handles)HTTP协议。当Web服务器接收到一个HTTP请求(request)，会返回一个HTTP响应(response)，例如送回一个HTML页面。为了处理一个请求(request)，Web服务器可以响应(response)一个静态页面或图片，进行页面跳转(redirect)，或者把动态响应(dynamic response)的产生委托(delegate)给一些其它的程序例如CGI脚本，JSP(JavaServer Pages)脚本，servlets，ASP(Active Server Pages)脚本，服务器端(server-side)JavaScript，或者一些其它的服务器端(server-side)技术。无论它们(译者注：脚本)的目的如何，这些服务器端(server-side)的程序通常产生一个HTML的响应(response)来让浏览器可以浏览。要知道，Web服务器的代理模型(delegation model)非常简单。当一个请求(request)被送到Web服务器里来时，它只单纯的把请求(request)传递给可以很好的处理请求(request)的程序(译者注：服务器端脚本)。Web服务器仅仅提供一个可以执行服务器端(server-side)程序和返回(程序所产生的)响应(response)的环境，而不会超出职能范围。服务器端(server-side)程序通常具有事务处理(transaction processing)，数据库连接(database connectivity)和消息(messaging)等功能。虽然Web服务器不支持事务处理或数据库连接池，但它可以配置(employ)各种策略(strategies)来实现容错性(fault tolerance)和可扩展性(scalability)，例如负载平衡(load balancing)，缓冲(caching)。集群特征(clustering—features)经常被误认为仅仅是应用程序服务器专有的特征。 </font></font><br><font face=宋体><font size=1>应用程序服务器(The Application Server)根据我们的定义，作为应用程序服务器，它通过各种协议，可以包括HTTP，把商业逻辑暴露给(expose)客户端应用程序。Web服务器主要是处理向浏览器发送HTML以供浏览，而应用程序服务器提供访问商业逻辑的途径以供客户端应用程序使用。应用程序使用此商业逻辑就象你调用对象的一个方法(或过程语言中的一个函数)一样。应用程序服务器的客户端(包含有图形用户界面(GUI)的)可能会运行在一台PC、一个Web服务器或者甚至是其它的应用程序服务器上。在应用程序服务器与其客户端之间来回穿梭(traveling)的信息不仅仅局限于简单的显示标记。相反，这种信息就是程序逻辑(program logic)。 正是由于这种逻辑取得了(takes)数据和方法调用(calls)的形式而不是静态HTML，所以客户端才可以随心所欲的使用这种被暴露的商业逻辑。在大多数情形下，应用程序服务器是通过组件(component)的应用程序接口(API)把商业逻辑暴露(expose)(给客户端应用程序)的，例如基于J2EE(Java 2 Platform, Enterprise Edition)应用程序服务器的EJB(Enterprise JavaBean)组件模型。此外，应用程序服务器可以管理自己的资源，例如看大门的工作(gate-keeping duties)包括安全(security)，事务处理(transaction processing)，资源池(resource pooling)， 和消息(messaging)。就象Web服务器一样，应用程序服务器配置了多种可扩展(scalability)和容错(fault tolerance)技术。 例如，设想一个在线商店(网站)提供实时定价(real-time pricing)和有效性(availability)信息。这个站点(site)很可能会提供一个表单(form)让你来选择产品。当你提交查询(query)后，网站会进行查找(lookup)并把结果内嵌在HTML页面中返回。网站可以有很多种方式来实现这种功能。我要介绍一个不使用应用程序服务器的情景和一个使用应用程序服务器的情景。观察一下这两中情景的不同会有助于你了解应用程序服务器的功能。</font></font><br><font face=宋体><font size=1>情景1：不带应用程序服务器的Web服务器在此种情景下，一个Web服务器独立提供在线商店的功能。Web服务器获得你的请求(request)，然后发送给服务器端(server-side)可以处理请求(request)的程序。此程序从数据库或文本文件(flat file，译者注：flat file是指没有特殊格式的非二进制的文件，如properties和XML文件等)中查找定价信息。一旦找到，服务器端(server-side)程序把结果信息表示成(formulate)HTML形式，最后Web服务器把会它发送到你的Web浏览器。简而言之，Web服务器只是简单的通过响应(response)HTML页面来处理HTTP请求(request)。 </font></font><br><font face=宋体><font size=1>情景2：带应用程序服务器的Web服务器情景2和情景1相同的是Web服务器还是把响应(response)的产生委托(delegates)给脚本(译者注：服务器端(server-side)程序)。然而，你可以把查找定价的商业逻辑(business logic)放到应用程序服务器上。由于这种变化，此脚本只是简单的调用应用程序服务器的查找服务(lookup service)，而不是已经知道如何查找数据然后表示为(formulate)一个响应(response)。 这时当该脚本程序产生HTML响应(response)时就可以使用该服务的返回结果了。在此情景中，应用程序服务器提供(serves)了用于查询产品的定价信息的商业逻辑。(服务器的)这种功能(functionality)没有指出有关显示和客户端如何使用此信息的细节，相反客户端和应用程序服务器只是来回传送数据。当有客户端调用应用程序服务器的查找服务(lookup service)时，此服务只是简单的查找并返回结果给客户端。通过从响应产生(response-generating)HTML的代码中分离出来，在应用程序之中该定价(查找)逻辑的可重用性更强了。其他的客户端，例如收款机，也可以调用同样的服务(service)来作为一个店员给客户结帐。相反，在情景1中的定价查找服务是不可重用的因为信息内嵌在HTML页中了。总而言之，在情景2的模型中，在Web服务器通过回应HTML页面来处理HTTP请求(request)，而应用程序服务器则是通过处理定价和有效性(availability)请求(request)来提供应用程序逻辑的。 </font></font><br><font face=宋体><font size=1>警告(Caveats) 现在，XML Web Services已经使应用程序服务器和Web服务器的界线混淆了。通过传送一个XML有效载荷(payload)给服务器，Web服务器现在可以处理数据和响应(response)的能力与以前的应用程序服务器同样多了。另外，现在大多数应用程序服务器也包含了Web服务器，这就意味着可以把Web服务器当作是应用程序服务器的一个子集(subset)。虽然应用程序服务器包含了Web服务器的功能，但是开发者很少把应用程序服务器部署(deploy)成这种功能(capacity)(译者注：这种功能是指既有应用程序服务器的功能又有Web服务器的功能)。相反，如果需要，他们通常会把Web服务器独立配置，和应用程序服务器一前一后。这种功能的分离有助于提高性能(简单的Web请求(request)就不会影响应用程序服务器了)，分开配置(专门的Web服务器，集群(clustering)等等)，而且给最佳产品的选取留有余地。</font></font><br><br><font face=宋体><font size=1><strong>性能瓶颈</strong></font></font><br><font face=宋体><font size=1>性能瓶颈实际上就是一个软件的性能缺陷，最通俗的理解&#8220;性能瓶颈&#8221;。</font></font><br><font face=宋体><font size=1>（1）硬件上的性能瓶颈主要指的是CPU、RAM方面的问题。例如，在进行软件需求分析、概要设计时，确定了在数据库服务器上需要6个CPU、12G内存，但是在测试时，发现CPU的持续利用率超过95%，这时可以认为在硬件上出现了性能瓶颈。</font></font><br><font face=宋体><font size=1>（2）应用软件上的性能瓶颈一般指的是应用服务器、WEB服务器等应用软件，还包括数据库系统。例如，在WEBLogic平台上配置了JDBC连接池的参数，最大连接数为50，最小连接数为5，增加量为10。在测试时发现，当负载增加时，现有的连接数不足，系统会动态生成10个新的连接数，这样导致了交易处理的响应时间大大的增加。这时可以认为在应用软件上出现了性能瓶颈。</font></font><br><font face=宋体><font size=1>（3）应用程序上的性能瓶颈，一般指的是开发人员新开发出来的应用程序。例如，用Java或者C开发出来的部署在应用服务器上用于用户交易请求处理的应用程序。例如，某个开发员开发了一个缴费处理程序，在测试时发现，这个缴费处理程序在处理用户发过来的并发缴费请求时，只能串行处理，无法并行处理，导致缴费交易的处理响应时间非常长，这时可以认为在应用程序上出现了性能瓶颈。</font></font><br><font face=宋体><font size=1>（4）操作系统上的性能瓶颈，一般指的是Windows、Unix、Linux这些操作系统。例如，在windows系统中，虚拟内存设置的不合理，都指定为C驱提供虚拟内存，在测试时发现当出现物理内存不足时，虚拟内存的交换效果非常不理想，导致交易的响应时间大大增加。这时可以认为在操作系统上出现了性能瓶颈。</font></font><br><font face=宋体><font size=1>（5）网络设备上的性能瓶颈，一般指的是防火墙、动态负载均衡器、交换机等设备。例如，在动态负载均衡器上设置了动态分发负载的机制，当发现某个应用服务器上的硬件资源已经到达极限时，动态负载均衡器将后续的交易请求发送到其它负载较轻的应用服务器上。在测试时发现，动态负载均衡机制没有起到相应的作用，这时可以认为在网络设备上出现了性能瓶颈。</font></font></p>
                        </td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<img src ="http://www.blogjava.net/baoyaer/aggbug/135887.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2007-08-10 17:08 <a href="http://www.blogjava.net/baoyaer/articles/135887.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>OpenSTA－－解决JAVA服务器性能问题</title><link>http://www.blogjava.net/baoyaer/articles/128261.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Thu, 05 Jul 2007 02:13:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/128261.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/128261.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/128261.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/128261.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/128261.html</trackback:ping><description><![CDATA[<div class=postText>
<center><strong><span style="FONT-SIZE: 20px"></span></strong>&nbsp;</center><br><br><br><br><strong><span style="FONT-SIZE: 16px">摘要</span></strong><br><br>改善JAVA服务器的性能需要模拟负载下的服务器。创建一个模拟环境、搜集数据并且分析结果可能是对许多开发人员的挑战。这篇文章中的示例介绍了JAVA服务器性能分析的概念和工具。作者使用这个示例来研究超额请求次数下内存使用和同步竟争的影响。<br>作者Ivan Small<br><br>项目团队已经很熟悉如何组织一些具体的任务并完成他们。简单的性能问题很容易由一个开发人员分离并解决。然而大的性能问题，通常在系统处于高负载情况下发生，就不是这么简单能处理的了。这些问题需要一个独立的测试环境、一个模拟的负载，并且需要仔细地分析和跟踪。<br><br>在这篇文章中，我使用比较通用的工具和设备创建了一个测试环境。我会专注于两个性能问题，内存和同步，他们很难用简单的分析得到。通过一个具体的例子，我希望比较容易地解决复杂的性能问题而且可以提供处理问题过程中的细节。<br><br><strong><span style="FONT-SIZE: 16px">改善服务器的性能</span></strong><br><br>服务器的性能改善是依赖于数据的。没有可靠的数据基础而更改应用或环境会导致更差的结果。分析器提供有用的JAVA服务器应用信息，但由于从单用户负载下的数据与多用户负载下得到的数据是完全不同的，这导致分析器的数据并不精确。在开发阶段使用分析器来优化应用的性能是一个好的方式，但在高负载下的应用分析可以取到更好的效果。<br><br><br>在负载下分析服务器应用的性能需要一些基本的元素：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1、可控的进行应用负载测试的环境。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2、可控的人造负载使得应用满负荷运行。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3、来自监视器、应用和负载测试工具自身的数据搜集。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4、性能改变的跟踪。<br><br>不要低估最后一个需求（性能跟踪）的重要性因为如果不能跟踪性能你就不能实际的管理项目。性能上10-20%的改善对单用户环境来说并没有什么不同，但对支持人员来说就不一样了。20%的改善是非常大的，而且通过跟踪性能的改善，你可以提供重要的反馈和持续跟踪。<br>虽然性能跟踪很重要，但有时为了使后续的测试更加精确而不得不抛弃先前的测试结果。在性能测试中，改善负载测试的精确性可能需要修改模拟环境，而这些变化是必须的，通过变化前后的负载测试你可以观察到其中的转变。<br><br><br><strong>可控的环境</strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>可控的环境最少也需要两台独立的机器和第三台控制的机器。其中一台用来生成负载，另一台作为控制机与前一台建立测试应用并接受反馈，第三台机器运行应用。此外，负载和应用机器间的网络应该与局域网分开。控制机接受运行应用机器的反馈如操作系统、硬件使用率、应用（特别是VM）的状态。<br><br><strong>负载模拟</strong><br>最精确的模拟通常用实际的用户数据和WEB服务器端的访问日志。如果你还没有实际布署或者缺少实际的用户数据，你可以通过构造类似的场景或询问销售和产品管理团队或做一些有依据的猜想。协调负载测试和实际用户体验是一个持续的过程。<br><br>在模拟中一些用户场景是必须的。如在一个通用地址薄应用中，你应该区分更新和查询操作。在我的测试应用中GrinderServlet类只有一个场景。单用户连接10次访问这个servlet（在每一次访问间有一段暂停）。虽然这个应用很小，我认为这可以重复一些常见的东西。用户通常不会连接给服务器请求而没有间断。如果没有间断，我们可能不能得到更精确的实际用户上限。<br><br>串行10个请求的另一个原因是实际应用中不会只有一个HTTP请求。单一而又分离的请求可以影响环境中的许多因素。对Tomcat来说，会为每一个请求创建一个会话，并且HTTP协议允许不同的请求重用连接。我会修改一下负载测试来避免混洧。<br><br>GrinderServlet类不会执行任何排序操作，但这个需求在大部分应用中都很普通。在这些应用中，你需要创建模拟的数据集并且用他们来构造相关用例的负载测试。<br><br>例如，如果用例涉及到用户登录一个WEB应用，从可能的用户列表中选取随机的用户会只使用一个用户更精确。否则，你可能不经意地使用了系统缓存或其他的优化或一些微妙的东西，而这会使得结果不正确。<br><br><strong>负载测试软件</strong><br>负载测试软件可以构造测试场景并且对服务进行负载测试。我会在下面的示例中使用OpenSTA测试软件。这软件简单易学，结果也很容易导出，并且支持参数化脚本，还可以监视信息的变化，他的主要缺点是基于Windows，但在这儿不是个问题。当然还有很多可选项如Apache的JMeter和Mercury 的LoadRunner。<br><br><strong><span style="FONT-SIZE: 16px">The GrinderServlet</span></strong><br><br>列表1中显示了GrinderServlet类，列表2中显示了Grinder类<br>Listing 1<br><br>
<pre class=overflow title="pre code">package pub.capart;<br><br>import java.io.*;<br>import java.util.*;<br>import javax.servlet.*;<br>import javax.servlet.http.*;<br><br>public class GrindServlet extends HttpServlet {<br>&nbsp;&nbsp; protected void doGet(HttpServletRequest req, HttpServletResponse res)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throws ServletException, IOException {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Grinderv1 grinder = Grinderv1.getGrinder();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;long t1 = System.currentTimeMillis();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;grinder.grindCPU(13);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;long t2 = System.currentTimeMillis();<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PrintWriter pw = res.getWriter();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pw.print("&lt;html&gt;\n&lt; body&gt; \n");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pw.print("Grind Time = "+(t2-t1));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pw.print("&lt; body&gt; \n&lt; /html&gt; \n");<br>&nbsp;&nbsp; }<br>}</pre>
<br><br>Listing 2<br><br>
<pre class=overflow title="pre code">package pub.capart;<br><br>/**<br>* This is a simple class designed to simulate an application consuming<br>* CPU, memory, and contending for a synchronization lock.<br>*/<br>public class Grinderv1 {<br>&nbsp;&nbsp; private static Grinderv1 singleton = new Grinderv1();<br>&nbsp;&nbsp; private static final String randstr =<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"this is just a random string that I'm going to add up many many times";<br><br>&nbsp;&nbsp; public static Grinderv1 getGrinder() {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return singleton;<br>&nbsp;&nbsp; }<br>&nbsp;&nbsp; public synchronized void grindCPU(int level) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StringBuffer sb = new StringBuffer();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String s = randstr;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for (int i=0;i&lt;level;++i) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sb.append(s);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; s = getReverse(sb.toString());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp; }<br>&nbsp;&nbsp; public String getReverse(String s) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StringBuffer sb = new StringBuffer(s);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb = sb.reverse();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return sb.toString();<br>&nbsp;&nbsp; }<br>} </pre>
<br><br>类很简单，但他们会产生两个很常见的问题。咋一看瓶颈可能由grindCPU()方法的同步修饰符引起，但实际上内存消耗才是真正的问题所在。如图1，我的第一个负载测试显示了常见的负载变化。在这里负载变化很重要因为你正在模拟一个高的负载。这种热身的方式也更精确因为避免了JSP编译引起的问题。我通常习惯于在进行负载测试前先进行单用户模拟。<br><br><img onmouseover=javascript:ImgShowTip(this); style="DISPLAY: inline" onclick=javascript:ImgClick(this); alt=image src="http://www.matrix.org.cn/resource/upload/article/2005_11_28_005405_hkXWmqzPxW.gif" onload=javascript:ImgLoad(this); border=0><br>Figure 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><br>我在这篇文章中会使用相同的容量小结图。在执行负载测试时还有更多的可用信息，但这里只用了有用的部分。最上面的面板包含每秒完成的请求数和请求时间信息。第二个面板包含活动用户数和失败率，我将超时、不正确的服务器应答和长于5秒的请求认为是失败的。第三个面板包含JVM内存统计和CPU使用率。CPU值是所有处理器的用户时间的平均值，这里所有的测试机器都是双CPU的。内存统计图包含垃圾回收表和每秒垃圾回收数。<br><br>图1中两个最明显的数据是50%的CPU使用率和大量内存使用和释放。从列表2中可以看出这个原因。同步修饰符导致所有进程串行处理，就好像只用了一个CPU，而算法导致大量内存消耗在局部变量上。<br><br>通过CPU是个受限的资源，如果在这个测试中我可以完全利用到两个CPU的话就可以提高一倍的性能。垃圾回收器运行得如此频繁以致于不能忽略。在测试中每秒释放的内存达到100M，很显然这是个限制因素。失败数这么大明显这个应用是不可用的。<br><br><strong><span style="FONT-SIZE: 16px">监视</span></strong><br><br>在生成合理的用户负载后，监视工具需要收集进程的运行状况。在我的测试环境中可以收集到各种有用的信息：<br><br>1、&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;所有计算机、网络设备<br>2、&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;等等的使用率<br>3、&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JVM的统计数据。<br>4、&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;个别JAVA方法所花费的时间。<br>5、&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;数据库性能信息，6、&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;包括SQL查询的统计。<br>7、&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;其他应用相关的信息<br><br>当然这些监视也会影响负载测试，但如果影响比较小也可以忽略。基本上如果我们想获取所有上面的信息，肯定会影响测试的性能。但如果不是一次获取所有信息还是有可能保证负载测试的有效性。仅对特定的方法设置定时器，仅获取低负载的硬件信息和低频率地获取样例数据。当然不加载监视器来做测试是最好的，然后和加载监视器的测试来做比较。虽然有时候侵入式监视是个好主意，但就不可能有监视结果了。<br><br><br>获取所有监视数据到一个中央控制器来做分析是最好的，但使用动态运行时工具也可以提供有用的信息。例如，命令行工具如PS、TOP、VMSTAT可以提供UNIX机器的信息；性能监视器工具可以提供 WINDOWS机器的信息；而TeamQuest, BMC Patrol, SGI's Performance Co-Pilot, and ISM's PerfMan这样的工具会在所有的测试环境中的机器安装代理并且将需要的信息传回中央控制机，这样就可以提供文本或可视化的信息。在本文中，我使用开源的Performance Co-Pilot作为测试统计的工具。我发现他对测试环境的影响最小，并且以相对直接的方式来提供数据。<br><br>JAVA 分析器提供很多信息，但通常对负载测试来说影响太大而没有太多的用处。工具甚至可以让你在负载服务器上做一些分析，但这也很容易便测试无效。在这些测试中，我激活了详细的垃圾收集器来收集内存信息。我也使用jconsole 和jstack工具（包含在J2SE 1.5中）来检查高负载下的VM。我没有保留这些测试用例中负载测试的结果因为我认为这些数据不是很正确。<br><br><br><strong><span style="FONT-SIZE: 16px">同步瓶颈</span></strong><br><br>在诊断服务器问题时线程的信息是非常有用的，特别是对同步之类的问题。jstack工具可以连接到运行的进程并且保存每一个线程的堆栈信息。在UNIX系统可以用信号量3来保存线程的堆栈信息，在WINDOWS系统的控制台中可以用Ctrl-Break。在第一项测试中，jstack指出许多线程在 grindCPU()方法中被阻塞。<br><br>你可以已经注意到列表2中grindCPU()方法的同步修饰符实际上并不必须。我在后一项测试中删除了他，如图2显示<br><br><img onmouseover=javascript:ImgShowTip(this); style="DISPLAY: inline" onclick=javascript:ImgClick(this); alt=image src="http://www.matrix.org.cn/resource/upload/forum/2005_11_28_010158_GPFngDKFpE.gif" onload=javascript:ImgLoad(this); border=0><br>Figure 2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><br>在图2中，你会注意到性能下降了。虽然我使用了更多的CPU，但吞吐量和失败数都更差了。虽然垃圾回收周期变了，但每秒依然需要回收100M。显然我们还没有找到主要的瓶颈。<br>非竟争的同步相对于简单的函数调用还是很费时的。竟争性的同步就更费时了，因为除了内存需要同步外，VM还需要维护等待的线程。在这种状况下，这些代价实际上要小于内存瓶颈。实际上，通过消除了同步瓶颈，VM内存系统承担了更多的压力最后导致更差的吞吐量，即使我使用了更多的CPU。显然最好的方式是从最大的瓶颈开始，但有时这也不是很容易确定的。当然，确保VM的内存处理足够正常也是一个好的开始方向。<br><br><strong><span style="FONT-SIZE: 16px">内存瓶颈</span></strong><br><br>现在我会首先也定位内存问题。列表3是GrinderServlet的重构版本，使用了StringBuffer实例。图3显示了测试结果。<br><br>Listing 3<br><br>
<pre class=overflow title="pre code">package pub.capart;<br><br>/**<br>* This is a simple class designed to simulate an application consuming<br>* CPU, memory, and contending for a synchronization lock.<br>*/<br>public class Grinderv2 {<br>&nbsp;&nbsp; private static Grinderv2 singleton = new Grinderv2();<br>&nbsp;&nbsp; private static final String randstr =<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"this is just a random string that I'm going to add up many many times";<br>&nbsp;&nbsp; private StringBuffer sbuf = new StringBuffer();<br>&nbsp;&nbsp; private StringBuffer sbufrev = new StringBuffer();<br><br>&nbsp;&nbsp; public static Grinderv2 getGrinder() {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return singleton;<br>&nbsp;&nbsp; }<br>&nbsp;&nbsp; public synchronized void grindCPU(int level) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sbufrev.setLength(0);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sbufrev.append(randstr);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sbuf.setLength(0);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for (int i=0;i&lt;level;++i) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sbuf.append(sbufrev);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; reverse();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return sbuf.toString();<br>&nbsp;&nbsp; }<br><br>&nbsp;&nbsp; public String getReverse(String s) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StringBuffer sb = new StringBuffer(s);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb = sb.reverse();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return sb.toString();<br>&nbsp;&nbsp; }<br>} </pre>
<br><br><img onmouseover=javascript:ImgShowTip(this); style="DISPLAY: inline" onclick=javascript:ImgClick(this); alt=image src="http://www.matrix.org.cn/resource/upload/forum/2005_11_28_010201_jbopuIqgrs.gif" onload=javascript:ImgLoad(this); border=0><br>Figure 3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><br>通常重用StringBuffer并不是一个好主意，但这里我只是为了重现一些常见的问题，而不量提供解决方案。内存数据已经从图上消失了因为测试中没有垃圾回收器运行。吞吐量戏剧性的增加而CPU使用率又回到了50%。列表3不只是优化了内存，但我认为主要了改善了过度的内存消耗。<br><br><strong><span style="FONT-SIZE: 16px">检视同步瓶颈</span></strong><br><br>列表4另一个GrinderServlet类的重构版本，实现了一个小的资源池。图4显示了测试结果。<br>Listing 4<br><br>
<pre class=overflow title="pre code">package pub.capart;<br><br>/**<br><br>* This is just a dummy class designed to simulate a process consuming<br>* CPU, memory, and contending for a synchronization lock.<br>*/<br>public class Grinderv3 {<br>&nbsp;&nbsp; private static Grinderv3 grinders[];<br>&nbsp;&nbsp; private static int grinderRoundRobin = 0;<br>&nbsp;&nbsp; private static final String randstr =<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"this is just a random string that I'm going to add up many many times";<br>&nbsp;&nbsp; private StringBuffer sbuf = new StringBuffer();<br>&nbsp;&nbsp; private StringBuffer sbufrev = new StringBuffer();<br><br>&nbsp;&nbsp; static {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;grinders = new Grinderv3[10];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for (int i=0;i&lt;grinders.length;++i) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; grinders[i] = new Grinderv3();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp; }<br>&nbsp;&nbsp; public synchronized static Grinderv3 getGrinder() {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Grinderv3 g = grinders[grinderRoundRobin];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;grinderRoundRobin = (grinderRoundRobin +1) % grinders.length;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return g;<br>&nbsp;&nbsp; }<br>&nbsp;&nbsp; public synchronized void grindCPU(int level) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sbufrev.setLength(0);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sbufrev.append(randstr);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sbuf.setLength(0);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for (int i=0;i&lt;level;++i) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sbuf.append(sbufrev);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; reverse();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return sbuf.toString();<br>&nbsp;&nbsp; }<br>&nbsp;&nbsp; public String getReverse(String s) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StringBuffer sb = new StringBuffer(s);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb = sb.reverse();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return sb.toString();<br>&nbsp;&nbsp; }<br>} <br>&nbsp;&nbsp;</pre>
<br><br><img onmouseover=javascript:ImgShowTip(this); style="DISPLAY: inline" onclick=javascript:ImgClick(this); alt=image src="http://www.matrix.org.cn/resource/upload/forum/2005_11_28_010205_AXvuDOJRmC.gif" onload=javascript:ImgLoad(this); border=0><br>Figure 4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><br><br>吞吐量有一定的增加，而且使用更少的CPU资源。竟争和非竟争性同步都是费时的，但通常最大的同步消耗是减少了系统的可伸缩性。我的负载测试不再满足系统的需求了，因此我增加了虚拟的用户数，如图5 所示。<br><br><img onmouseover=javascript:ImgShowTip(this); style="DISPLAY: inline" onclick=javascript:ImgClick(this); alt=image src="http://www.matrix.org.cn/resource/upload/forum/2005_11_28_010210_qLXdOtznMe.gif" onload=javascript:ImgLoad(this); border=0><br>Figure 5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><br><br>在图5 中吞吐量在负载达到饱和时下降了一些然后在负载减少时又提高了。此外注意到测试使得CPU使用率达到100%，这意味着测试超过了系统的最佳吞吐量。负载测试的一个产出是性能计划，当应用的负载超过他的容量时会产生更低的吞吐量。<br><br><br><strong><span style="FONT-SIZE: 16px">水平可伸缩性</span></strong><br><br>水平伸缩允许更大的性能，但并不一定是费用相关的。运行在多个服务器上的应用通常比较运行在单个VM上的应用复杂。但水平伸缩支持在性能上的最大增加。<br><br>图6是我的最后一项测试的结果。我已经在三台基本一致的机器上使用了负载平衡，只是在内存和CPU速度上稍有不同。总的吞吐量要高于三倍的单机结果，而且CPU从来没有完全利用。在图6中我只显示了一台机器上的CPU结果，其他的是一样的。<br><br><img onmouseover=javascript:ImgShowTip(this); style="DISPLAY: inline" onclick=javascript:ImgClick(this); alt=image src="http://www.matrix.org.cn/resource/upload/forum/2005_11_28_010213_ePCGcrCiWt.gif" onload=javascript:ImgLoad(this); border=0><br>Figure 6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><br><br><strong><span style="FONT-SIZE: 16px">小结</span></strong><br><br>我曾经花了9个月来布署一个复杂的JAVA应用，但却没有时间来做性能计划。但差劲的性能使得用户合约几乎中止。开发人员使用分析器花了很长时间找到几个小问题但没有解决根本的瓶颈，而且被后续的问题完全迷惑了。最后通过负载测试找到解决方法，但你可以想到其中的处境。<br><br>又一次我碰得更难的问题，应用只能达到所预期性能的1/100。但通过前期检测到的问题和认识到负载测试的必要性，这个问题很快被解决了。负载测试相对于整个软件开发的花费并不多，但其所归避的风险就高多了。<br><br><strong>关于作者</strong><br>Ivan Small拥有14年的软件开发经验。他在LBNL从开发Supernovae Cosmology Project开始他的职业生涯。这个项目是导致反重力和无限扩展宇宙理论被发现的两个项目之一。他从此工作于数据挖掘和企业级JAVA应用。现在他是 nnovative Interfaces公司的首席软件工程师。<br><br><strong>资源</strong><br>&#183;javaworld.com:<a href="http://www.javaworld.com/" target=_new><u><font color=#0000ff>javaworld.com</font></u></a><br>&#183;Matrix-Java开发者社区:<a href="http://www.matrix.org.cn/" target=_new><u><font color=#0000ff>http://www.matrix.org.cn/</font></u></a><br>&#183;JAVA性能调优第二版:http://www.amazon.com/exec/obidos/ASIN/0596003773/javaworld <br>&#183;并发编程技术：JAVA并发编程第二版:http://www.amazon.com/exec/obidos/ASIN/0201310090/javaworld <br>&#183;JAVA网站分析：JAVA网站的性能分析:http://www.amazon.com/exec/obidos/ASIN/0201844540/javaworld <br>&#183;JAVA性能：高性能JAVA平台计算:http://www.amazon.com/exec/obidos/ASIN/0130161640/javaworld <br>&#183;JAVA2性能和术语指南:http://www.amazon.com/exec/obidos/ASIN/0130142603/javaworld <br>&#183;BEA WebLogic服务器性能调优，包含有用的一般信息：BEA WebLogic服务器上J2EE应用性能测试:http://www.amazon.com/exec/obidos/ASIN/1904284000/javaworld <br>&#183;JAVA性能调优:http://www.javaperformancetuning.com <br>&#183;过度的JAVA同步:&#8220;轻量级线程&#8221;:http://www-106.ibm.com/developerworks/java/library/j-threads1.html <br>&#183;负载和性能测试工具：http://www.softwareqatest.com/qatweb1.html#LOAD </div>
<img src ="http://www.blogjava.net/baoyaer/aggbug/128261.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2007-07-05 10:13 <a href="http://www.blogjava.net/baoyaer/articles/128261.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>XSL 学习</title><link>http://www.blogjava.net/baoyaer/articles/124287.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Thu, 14 Jun 2007 05:32:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/124287.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/124287.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/124287.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/124287.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/124287.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 本节将举例学习如何用XSL将XML转换成HTML。这个举例的细节将在下一节中解释。 XSLT命令[xml格式转换]1.循环 &lt;xsl:for-each...&gt;&lt;xsl:for-each select="BookList/Item"&gt;&lt;tr&gt;&lt;th align="left"&gt; &lt;xsl:value-of select=".//title" /...&nbsp;&nbsp;<a href='http://www.blogjava.net/baoyaer/articles/124287.html'>阅读全文</a><img src ="http://www.blogjava.net/baoyaer/aggbug/124287.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2007-06-14 13:32 <a href="http://www.blogjava.net/baoyaer/articles/124287.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Tomcat服务器配置参考</title><link>http://www.blogjava.net/baoyaer/articles/122866.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Fri, 08 Jun 2007 07:49:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/122866.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/122866.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/122866.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/122866.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/122866.html</trackback:ping><description><![CDATA[<table cellSpacing=4 width="100%" border=0>
    <tbody>
        <tr>
            <td vAlign=top align=left true>
            <h1>&nbsp;</h1>
            <h2>DefaultContext组件</h2>
            </td>
            <td vAlign=top align=right true><img height=1 hspace=0 src="http://www.cnjsp.org/document/images/void.gif" width=1 border=0></td>
        </tr>
    </tbody>
</table>
<table cellSpacing=0 cellPadding=2 border=0>
    <tbody>
        <tr>
            <td bgColor=#525d76><font face=arial,helvetica.sanserif color=#ffffff><a name=Introduction><strong>Introduction</strong></a></font></td>
        </tr>
        <tr>
            <td vAlign=top>
            <blockquote>
            <p>DefaultContext元素代表Context元素的配置设置的一个子集，可以嵌套在Engine或者Host元素中，表示自动创建的Context的缺省配置属性。</p>
            <p>在什么情况下，Catalina会自动创建Context？有关这方面的更多信息，参考应用自动发布和用户web应用。</p>
            </blockquote></td>
        </tr>
    </tbody>
</table>
<table cellSpacing=0 cellPadding=2 border=0>
    <tbody>
        <tr>
            <td bgColor=#525d76><font face=arial,helvetica.sanserif color=#ffffff><a name=Attributes><strong>属性</strong></a></font></td>
        </tr>
        <tr>
            <td>
            <blockquote>
            <table cellSpacing=0 cellPadding=2 border=0>
                <tbody>
                    <tr>
                        <td bgColor=#828da6><font face=arial,helvetica.sanserif color=#ffffff><a name="Common Attributes"><strong>公共属性</strong></a></font></td>
                    </tr>
                    <tr>
                        <td>
                        <blockquote>
                        <p>所有DefaultContext的实现支持如下属性：</p>
                        <table cellPadding=5 border=1>
                            <tbody>
                                <tr>
                                    <th width="15%" bgColor=#023264><font color=#ffffff>属性</font></th>
                                    <th width="85%" bgColor=#023264><font color=#ffffff>描述</font></th>
                                </tr>
                                <tr>
                                    <td vAlign=center align=left><code>cookies</code></td>
                                    <td vAlign=center align=left>
                                    <p>如果想利用cookies来传递session identifier（需要客户端支持cookies），设为ture。否则为false，这种情况下只能依靠URL Rewriting传递session identifier。</p>
                                    <p>&#160;</p>
                                    </td>
                                </tr>
                                <tr>
                                    <td vAlign=center align=left><code>crossContext</code></td>
                                    <td vAlign=center align=left>
                                    <p>如果想在应用内调用ServletContext.getContext()来返回在该虚拟主机上运行的其他web application的request dispatcher,设为true。在安全性很重要的环境中，设为false，使得getContext()总是返回null。缺省值为false。<br></p>
                                    </td>
                                </tr>
                                <tr>
                                    <td vAlign=center align=left><code>reloadable</code></td>
                                    <td vAlign=top align=left>
                                    <p>如果希望Catalina监视/WEB-INF/classes/和/WEB-INF/lib下面的类是否发生变化，在发生变化的时候自动重载web application，设为true。这个特征在开发阶段很有用，但也大大增加了服务器的开销。因此，在发布以后，不推荐使用。但是，你可以使用Manager应用在必要的时候触发应用的重载。</p>
                                    </td>
                                </tr>
                                <tr>
                                    <td vAlign=center align=left><code>wrapperClass</code></td>
                                    <td vAlign=center align=left>
                                    <p>org.apache.catalina.Wrapper实现类的名称，用于该Context管理的servlets。如果没有指定，使用标准的缺省值。<br></p>
                                    </td>
                                </tr>
                            </tbody>
                        </table>
                        </blockquote></td>
                    </tr>
                </tbody>
            </table>
            <table cellSpacing=0 cellPadding=2 border=0>
                <tbody>
                    <tr>
                        <td bgColor=#828da6><font face=arial,helvetica.sanserif color=#ffffff><a name="Standard Implementation"><strong>标准实现</strong></a></font></td>
                    </tr>
                    <tr>
                        <td>
                        <blockquote>
                        <p>&#160;</p>
                        <p>&#160;</p>
                        <p>&#160;</p>
                        <p>DefaultContext的标准实现是org.apache.catalina.core.DefaultContext，它还支持如下的附加属性：</p>
                        <table cellPadding=5 border=1>
                            <tbody>
                                <tr>
                                    <th width="15%" bgColor=#023264><font color=#ffffff>属性</font></th>
                                    <th width="85%" bgColor=#023264><font color=#ffffff>描述</font></th>
                                </tr>
                                <tr>
                                    <td vAlign=center align=left><code>swallowOutput</code></td>
                                    <td vAlign=center align=left>
                                    <p>如果该值为true，System.out和System.err的输出被重定向到web应用的logger。如果没有指定，缺省值为false<br></p>
                                    </td>
                                </tr>
                                <tr>
                                    <td vAlign=center align=left><code>useNaming</code></td>
                                    <td vAlign=center align=left>
                                    <p>如果希望Catalina为该web应用使能一个JNDI InitialContext对象，设为true。该InitialialContext符合J2EE平台的约定，缺省值为true。<br></p>
                                    </td>
                                </tr>
                            </tbody>
                        </table>
                        </blockquote></td>
                    </tr>
                </tbody>
            </table>
            </blockquote></td>
        </tr>
    </tbody>
</table>
<table cellSpacing=0 cellPadding=2 border=0>
    <tbody>
        <tr>
            <td bgColor=#525d76><font face=arial,helvetica.sanserif color=#ffffff><a name="Nested Components"><strong>嵌套组件</strong></a></font></td>
        </tr>
        <tr>
            <td>
            <blockquote></blockquote></td>
        </tr>
    </tbody>
</table>
<table cellSpacing=0 cellPadding=2 border=0>
    <tbody>
        <tr>
            <td bgColor=#525d76><font face=arial,helvetica.sanserif color=#ffffff><a name="Special Features"><strong>专有特征</strong></a></font></td>
        </tr>
        <tr>
            <td>
            <blockquote>
            <table cellSpacing=0 cellPadding=2 border=0>
                <tbody>
                    <tr>
                        <td bgColor=#828da6><font face=arial,helvetica.sanserif color=#ffffff><a name="Context Parameters"><strong>Contxt参数（Context Parameters</strong></a>）</font></td>
                    </tr>
                    <tr>
                        <td>
                        <blockquote>
                        <p>可以在Context中元素中嵌套&lt;Parameter&gt;元素，配置带有名称的值，这些值作为servletcontext初始化参数，对整个web应用可见。比如，你可以像这样创建初始化参数:</p>
                        <p>&#160;</p>
                        <div align=left>
                        <table cellSpacing=4 cellPadding=0 border=0>
                            <tbody>
                                <tr>
                                    <td width=1 bgColor=#023264 height=1><img height=1 hspace=0 src="http://www.cnjsp.org/document/images/void.gif" width=1 border=0></td>
                                    <td bgColor=#023264 height=1><img height=1 hspace=0 src="http://www.cnjsp.org/document/images/void.gif" width=1 border=0></td>
                                    <td width=1 bgColor=#023264 height=1><img height=1 hspace=0 src="http://www.cnjsp.org/document/images/void.gif" width=1 border=0></td>
                                </tr>
                                <tr>
                                    <td width=1 bgColor=#023264><img height=1 hspace=0 src="http://www.cnjsp.org/document/images/void.gif" width=1 border=0></td>
                                    <td bgColor=#ffffff height=1>
                                    <pre>&lt;DefaultContext ...&gt;
                                    ...
                                    &lt;Parameter name="companyName" value="My Company, Incorporated"
                                    override="false"/&gt;
                                    ...
                                    &lt;/DefaultContext&gt;
                                    </pre>
                                    </td>
                                    <td width=1 bgColor=#023264><img height=1 hspace=0 src="http://www.cnjsp.org/document/images/void.gif" width=1 border=0></td>
                                </tr>
                                <tr>
                                    <td width=1 bgColor=#023264 height=1><img height=1 hspace=0 src="http://www.cnjsp.org/document/images/void.gif" width=1 border=0></td>
                                    <td bgColor=#023264 height=1><img height=1 hspace=0 src="http://www.cnjsp.org/document/images/void.gif" width=1 border=0></td>
                                    <td width=1 bgColor=#023264 height=1><img height=1 hspace=0 src="http://www.cnjsp.org/document/images/void.gif" width=1 border=0></td>
                                </tr>
                            </tbody>
                        </table>
                        这与在/WEB-INF/web.xml中包含如下元素相等：
                        <p>&#160;</p>
                        </div>
                        <div align=left>
                        <table cellSpacing=4 cellPadding=0 border=0>
                            <tbody>
                                <tr>
                                    <td width=1 bgColor=#023264 height=1><img height=1 hspace=0 src="http://www.cnjsp.org/document/images/void.gif" width=1 border=0></td>
                                    <td bgColor=#023264 height=1><img height=1 hspace=0 src="http://www.cnjsp.org/document/images/void.gif" width=1 border=0></td>
                                    <td width=1 bgColor=#023264 height=1><img height=1 hspace=0 src="http://www.cnjsp.org/document/images/void.gif" width=1 border=0></td>
                                </tr>
                                <tr>
                                    <td width=1 bgColor=#023264><img height=1 hspace=0 src="http://www.cnjsp.org/document/images/void.gif" width=1 border=0></td>
                                    <td bgColor=#ffffff height=1>
                                    <pre>&lt;context-param&gt;
                                    &lt;param-name&gt;companyName&lt;/param-name&gt;
                                    &lt;param-value&gt;My Company, Incorporated&lt;/param-value&gt;
                                    &lt;/context-param&gt;
                                    </pre>
                                    </td>
                                    <td width=1 bgColor=#023264><img height=1 hspace=0 src="http://www.cnjsp.org/document/images/void.gif" width=1 border=0></td>
                                </tr>
                                <tr>
                                    <td width=1 bgColor=#023264 height=1><img height=1 hspace=0 src="http://www.cnjsp.org/document/images/void.gif" width=1 border=0></td>
                                    <td bgColor=#023264 height=1><img height=1 hspace=0 src="http://www.cnjsp.org/document/images/void.gif" width=1 border=0></td>
                                    <td width=1 bgColor=#023264 height=1><img height=1 hspace=0 src="http://www.cnjsp.org/document/images/void.gif" width=1 border=0></td>
                                </tr>
                            </tbody>
                        </table>
                        区别是，前者不需要修改deployment descriptor来定制这个值。
                        <p>&lt;Parameter&gt;元素的有效属性值如下：</p>
                        <p>&#160;</p>
                        </div>
                        <table cellPadding=5 border=1>
                            <tbody>
                                <tr>
                                    <th width="15%" bgColor=#023264><font color=#ffffff>属性</font></th>
                                    <th width="85%" bgColor=#023264><font color=#ffffff>描述</font></th>
                                </tr>
                                <tr>
                                    <td vAlign=center align=left><code>description</code></td>
                                    <td vAlign=center align=left>
                                    <p>关于该context初始化参数的文字描述（可选）<br></p>
                                    </td>
                                </tr>
                                <tr>
                                    <td vAlign=center align=left><strong><code>name</code></strong></td>
                                    <td vAlign=center align=left>
                                    <p>要创建的context初始化参数的名称<br></p>
                                    </td>
                                </tr>
                                <tr>
                                    <td vAlign=center align=left><code>override</code></td>
                                    <td vAlign=center align=left>
                                    <p>如果不希望/WEB-INF/web.xml中具有相同参数名称的&lt;context-param&gt;覆盖这里指定的值，设为false。缺省值为true。<br></p>
                                    </td>
                                </tr>
                                <tr>
                                    <td vAlign=center align=left><strong><code>value</code></strong></td>
                                    <td vAlign=center align=left>
                                    <p>调用ServletContext.getInitParameter()时，返回给应用的参数值。<br></p>
                                    </td>
                                </tr>
                            </tbody>
                        </table>
                        </blockquote></td>
                    </tr>
                </tbody>
            </table>
            <table cellSpacing=0 cellPadding=2 border=0>
                <tbody>
                    <tr>
                        <td bgColor=#828da6><font face=arial,helvetica.sanserif color=#ffffff><a name="Environment Entries"><strong>环境条目</strong></a></font></td>
                    </tr>
                    <tr>
                        <td>
                        <blockquote>
                        <p>可以在Context中嵌套&lt;Environment&gt;元素，配置命名的值，这些值作为环境条目资源(Environment Entry Resource），对整个web应用可见。比如，可以按照如下方法创建一个环境条目：</p>
                        <p>&#160;</p>
                        <div align=left>
                        <table cellSpacing=4 cellPadding=0 border=0>
                            <tbody>
                                <tr>
                                    <td width=1 bgColor=#023264 height=1><img height=1 hspace=0 src="http://www.cnjsp.org/document/images/void.gif" width=1 border=0></td>
                                    <td bgColor=#023264 height=1><img height=1 hspace=0 src="http://www.cnjsp.org/document/images/void.gif" width=1 border=0></td>
                                    <td width=1 bgColor=#023264 height=1><img height=1 hspace=0 src="http://www.cnjsp.org/document/images/void.gif" width=1 border=0></td>
                                </tr>
                                <tr>
                                    <td width=1 bgColor=#023264><img height=1 hspace=0 src="http://www.cnjsp.org/document/images/void.gif" width=1 border=0></td>
                                    <td bgColor=#ffffff height=1>
                                    <pre>&lt;DefaultContext ...&gt;
                                    ...
                                    &lt;Environment name="maxExemptions" value="10"
                                    type="java.lang.Integer" override="false"/&gt;
                                    ...
                                    &lt;/DefaultContext&gt;
                                    </pre>
                                    </td>
                                    <td width=1 bgColor=#023264><img height=1 hspace=0 src="http://www.cnjsp.org/document/images/void.gif" width=1 border=0></td>
                                </tr>
                                <tr>
                                    <td width=1 bgColor=#023264 height=1><img height=1 hspace=0 src="http://www.cnjsp.org/document/images/void.gif" width=1 border=0></td>
                                    <td bgColor=#023264 height=1><img height=1 hspace=0 src="http://www.cnjsp.org/document/images/void.gif" width=1 border=0></td>
                                    <td width=1 bgColor=#023264 height=1><img height=1 hspace=0 src="http://www.cnjsp.org/document/images/void.gif" width=1 border=0></td>
                                </tr>
                            </tbody>
                        </table>
                        这与在/WEB-INF/web.xml中包含如下元素是等价的：
                        <p>&#160;</p>
                        </div>
                        <div align=left>
                        <table cellSpacing=4 cellPadding=0 border=0>
                            <tbody>
                                <tr>
                                    <td width=1 bgColor=#023264 height=1><img height=1 hspace=0 src="http://www.cnjsp.org/document/images/void.gif" width=1 border=0></td>
                                    <td bgColor=#023264 height=1><img height=1 hspace=0 src="http://www.cnjsp.org/document/images/void.gif" width=1 border=0></td>
                                    <td width=1 bgColor=#023264 height=1><img height=1 hspace=0 src="http://www.cnjsp.org/document/images/void.gif" width=1 border=0></td>
                                </tr>
                                <tr>
                                    <td width=1 bgColor=#023264><img height=1 hspace=0 src="http://www.cnjsp.org/document/images/void.gif" width=1 border=0></td>
                                    <td bgColor=#ffffff height=1>
                                    <pre>&lt;env-entry&gt;
                                    &lt;env-entry-name&gt;maxExemptions&lt;/param-name&gt;
                                    &lt;env-entry-value&gt;10&lt;/env-entry-value&gt;
                                    &lt;env-entry-type&gt;java.lang.Integer&lt;/env-entry-type&gt;
                                    &lt;/env-entry&gt;
                                    </pre>
                                    </td>
                                    <td width=1 bgColor=#023264><img height=1 hspace=0 src="http://www.cnjsp.org/document/images/void.gif" width=1 border=0></td>
                                </tr>
                                <tr>
                                    <td width=1 bgColor=#023264 height=1><img height=1 hspace=0 src="http://www.cnjsp.org/document/images/void.gif" width=1 border=0></td>
                                    <td bgColor=#023264 height=1><img height=1 hspace=0 src="http://www.cnjsp.org/document/images/void.gif" width=1 border=0></td>
                                    <td width=1 bgColor=#023264 height=1><img height=1 hspace=0 src="http://www.cnjsp.org/document/images/void.gif" width=1 border=0></td>
                                </tr>
                            </tbody>
                        </table>
                        </div>
                        <p>but does <em>not</em> require modification of the deployment descriptor to customize 区别是，前者不需要修改deployment descriptor来定制这个值。</p>
                        <p>&lt;Environment&gt;元素的有效属性所如下：<br></p>
                        <table cellPadding=5 border=1>
                            <tbody>
                                <tr>
                                    <th width="15%" bgColor=#023264><font color=#ffffff>属性</font></th>
                                    <th width="85%" bgColor=#023264><font color=#ffffff>描述</font></th>
                                </tr>
                                <tr>
                                    <td vAlign=center align=left><code>description</code></td>
                                    <td vAlign=center align=left>
                                    <p>环境条目的文字描述（可选）<br></p>
                                    </td>
                                </tr>
                                <tr>
                                    <td vAlign=center align=left><strong><code>name</code></strong></td>
                                    <td vAlign=center align=left>
                                    <p>环境条目的名称，相对于java:comp/env context。<br></p>
                                    </td>
                                </tr>
                                <tr>
                                    <td vAlign=center align=left><code>override</code></td>
                                    <td vAlign=center align=left>
                                    <p>如果不希望/WEB-INF/web.xml中具有相同名称的&lt;env-entry&gt;覆盖这里指定的值，设为false。缺省值为true。<br></p>
                                    </td>
                                </tr>
                                <tr>
                                    <td vAlign=center align=left><strong><code>type</code></strong></td>
                                    <td vAlign=center align=left>
                                    <p>环境条目的Java类名的全称.在/WEB-INF/web.xml中，&lt;env-entry-type&gt;必须是如下的值：java.lang.Boolean, java.lang.Byte, java.lang.Character, java.lang.Double, java.lang.Float, java.lang.Integer, java.lang.Long, java.lang.Short, or java.lang.String.<br></p>
                                    </td>
                                </tr>
                                <tr>
                                    <td vAlign=center align=left><strong><code>value</code></strong></td>
                                    <td vAlign=center align=left>
                                    <p>通过JNDI context请求时，返回给应用的参数值。这个值必须转换成type属性定义的Java类型</p>
                                    <p>&#160;</p>
                                    </td>
                                </tr>
                            </tbody>
                        </table>
                        </blockquote></td>
                    </tr>
                </tbody>
            </table>
            <table cellSpacing=0 cellPadding=2 border=0>
                <tbody>
                    <tr>
                        <td bgColor=#828da6><font face=arial,helvetica.sanserif color=#ffffff><a name="Lifecycle Listeners"><strong>生命期Listeners（Lifecycle Listeners</strong></a>）</font></td>
                    </tr>
                    <tr>
                        <td>
                        <blockquote>
                        <p>如果一个Java对象需要知道Context什么时候启动，什么时候停止，可以在这个对象中嵌套一个Listener元素。该Listener元素必须实现了org.apache.catalina.LifecycleListener接口，在发生对应的生命期事件的时候，通知该Listener。可以按照如下的格式配置这样的Listener：</p>
                        <div align=left>
                        <table cellSpacing=4 cellPadding=0 border=0>
                            <tbody>
                                <tr>
                                    <td width=1 bgColor=#023264 height=1><img height=1 hspace=0 src="http://www.cnjsp.org/document/images/void.gif" width=1 border=0></td>
                                    <td bgColor=#023264 height=1><img height=1 hspace=0 src="http://www.cnjsp.org/document/images/void.gif" width=1 border=0></td>
                                    <td width=1 bgColor=#023264 height=1><img height=1 hspace=0 src="http://www.cnjsp.org/document/images/void.gif" width=1 border=0></td>
                                </tr>
                                <tr>
                                    <td width=1 bgColor=#023264><img height=1 hspace=0 src="http://www.cnjsp.org/document/images/void.gif" width=1 border=0></td>
                                    <td bgColor=#ffffff height=1>
                                    <pre>&lt;DefaultContext  ...&gt;
                                    ...
                                    &lt;Listener className="com.mycompany.mypackage.MyListener" ... &gt;
                                    ...
                                    &lt;/DefaultContext&gt;
                                    </pre>
                                    </td>
                                    <td width=1 bgColor=#023264><img height=1 hspace=0 src="http://www.cnjsp.org/document/images/void.gif" width=1 border=0></td>
                                </tr>
                                <tr>
                                    <td width=1 bgColor=#023264 height=1><img height=1 hspace=0 src="http://www.cnjsp.org/document/images/void.gif" width=1 border=0></td>
                                    <td bgColor=#023264 height=1><img height=1 hspace=0 src="http://www.cnjsp.org/document/images/void.gif" width=1 border=0></td>
                                    <td width=1 bgColor=#023264 height=1><img height=1 hspace=0 src="http://www.cnjsp.org/document/images/void.gif" width=1 border=0></td>
                                </tr>
                            </tbody>
                        </table>
                        </div>
                        <p>注意，一个listener可以具有任意多的附加属性。属性名与JavaBean的属性名相对应，使用标准的属性命名方法。<br></p>
                        </blockquote></td>
                    </tr>
                </tbody>
            </table>
            <table cellSpacing=0 cellPadding=2 border=0>
                <tbody>
                    <tr>
                        <td bgColor=#828da6><font face=arial,helvetica.sanserif color=#ffffff><a name="Resource Definitions">资源定义（<strong>Resource Definitions</strong></a>）</font></td>
                    </tr>
                    <tr>
                        <td>
                        <blockquote>
                        <p>可以在/WEB-INF/web.xml中定义资源的特性。使用JNDI查找&lt;resource-ref&gt;和&lt;resource-env-ref&gt;元素时，这些特性被返回。对同一资源名称，还必须定义资源参数（见下面&#8220;资源参数&#8221;小节），这些参数用来配置对象工厂（object factory）以及对象工厂的属性。</p>
                        <p>比如，你可以按照如下方式创建资源定义：</p>
                        <p>&#160;</p>
                        <div align=left>
                        <table cellSpacing=4 cellPadding=0 border=0>
                            <tbody>
                                <tr>
                                    <td width=1 bgColor=#023264 height=1><img height=1 hspace=0 src="http://www.cnjsp.org/document/images/void.gif" width=1 border=0></td>
                                    <td bgColor=#023264 height=1><img height=1 hspace=0 src="http://www.cnjsp.org/document/images/void.gif" width=1 border=0></td>
                                    <td width=1 bgColor=#023264 height=1><img height=1 hspace=0 src="http://www.cnjsp.org/document/images/void.gif" width=1 border=0></td>
                                </tr>
                                <tr>
                                    <td width=1 bgColor=#023264><img height=1 hspace=0 src="http://www.cnjsp.org/document/images/void.gif" width=1 border=0></td>
                                    <td bgColor=#ffffff height=1>
                                    <pre>&lt;DefaultContext ...&gt;
                                    ...
                                    &lt;Resource name="jdbc/EmployeeDB" auth="Container"
                                    type="javax.sql.DataSource"
                                    description="Employees Database for HR Applications"/&gt;
                                    ...
                                    &lt;/DefaultContext&gt;
                                    </pre>
                                    </td>
                                    <td width=1 bgColor=#023264><img height=1 hspace=0 src="http://www.cnjsp.org/document/images/void.gif" width=1 border=0></td>
                                </tr>
                                <tr>
                                    <td width=1 bgColor=#023264 height=1><img height=1 hspace=0 src="http://www.cnjsp.org/document/images/void.gif" width=1 border=0></td>
                                    <td bgColor=#023264 height=1><img height=1 hspace=0 src="http://www.cnjsp.org/document/images/void.gif" width=1 border=0></td>
                                    <td width=1 bgColor=#023264 height=1><img height=1 hspace=0 src="http://www.cnjsp.org/document/images/void.gif" width=1 border=0></td>
                                </tr>
                            </tbody>
                        </table>
                        这等价于在/WEB-INF/web.xml中包含如下元素：
                        <p>&#160;</p>
                        </div>
                        <div align=left>
                        <table cellSpacing=4 cellPadding=0 border=0>
                            <tbody>
                                <tr>
                                    <td width=1 bgColor=#023264 height=1><img height=1 hspace=0 src="http://www.cnjsp.org/document/images/void.gif" width=1 border=0></td>
                                    <td bgColor=#023264 height=1><img height=1 hspace=0 src="http://www.cnjsp.org/document/images/void.gif" width=1 border=0></td>
                                    <td width=1 bgColor=#023264 height=1><img height=1 hspace=0 src="http://www.cnjsp.org/document/images/void.gif" width=1 border=0></td>
                                </tr>
                                <tr>
                                    <td width=1 bgColor=#023264><img height=1 hspace=0 src="http://www.cnjsp.org/document/images/void.gif" width=1 border=0></td>
                                    <td bgColor=#ffffff height=1>
                                    <pre>&lt;resource-ref&gt;
                                    &lt;description&gt;Employees Database for HR Applications&lt;/description&gt;
                                    &lt;res-ref-name&gt;jdbc/EmployeeDB&lt;/res-ref-name&gt;
                                    &lt;res-ref-type&gt;javax.sql.DataSource&lt;/res-ref-type&gt;
                                    &lt;res-auth&gt;Container&lt;/res-auth&gt;
                                    &lt;/resource-ref&gt;
                                    </pre>
                                    </td>
                                    <td width=1 bgColor=#023264><img height=1 hspace=0 src="http://www.cnjsp.org/document/images/void.gif" width=1 border=0></td>
                                </tr>
                                <tr>
                                    <td width=1 bgColor=#023264 height=1><img height=1 hspace=0 src="http://www.cnjsp.org/document/images/void.gif" width=1 border=0></td>
                                    <td bgColor=#023264 height=1><img height=1 hspace=0 src="http://www.cnjsp.org/document/images/void.gif" width=1 border=0></td>
                                    <td width=1 bgColor=#023264 height=1><img height=1 hspace=0 src="http://www.cnjsp.org/document/images/void.gif" width=1 border=0></td>
                                </tr>
                            </tbody>
                        </table>
                        区别是，前者不需要修改deployment descriptor来定制这个值。
                        <p>&lt;Resource&gt;元素的有效属性如下：<br></p>
                        </div>
                        <table cellPadding=5 border=1>
                            <tbody>
                                <tr>
                                    <th width="15%" bgColor=#023264><font color=#ffffff>属性</font></th>
                                    <th width="85%" bgColor=#023264><font color=#ffffff>描述</font></th>
                                </tr>
                                <tr>
                                    <td vAlign=center align=left><code>auth</code></td>
                                    <td vAlign=center align=left>
                                    <p>指定是web应用代码本身sign on到对应的resource mananger，还是由container代表web应用sign on到resource manager。该属性的值必须是Application或者Container。如果在web application deployment descriptor中使用&lt;resource-ref&gt;，这个属性是必需的，如果使用&lt;resource-env-ref&gt;，这个属性是可选的。<br></p>
                                    </td>
                                </tr>
                                <tr>
                                    <td vAlign=center align=left><code>description</code></td>
                                    <td vAlign=center align=left>
                                    <p>资源的文字描述（可选）<br></p>
                                    </td>
                                </tr>
                                <tr>
                                    <td vAlign=center align=left><strong><code>name</code></strong></td>
                                    <td vAlign=center align=left>
                                    <p>资源的名称，相对于java:comp/env context<br></p>
                                    </td>
                                </tr>
                                <tr>
                                    <td vAlign=center align=left><code>scope</code></td>
                                    <td vAlign=center align=left>
                                    <p>指定通过这个resource manager得到的连接是否共享。该属性的值必须是Shareable或者Unshareable。缺省情况下，假定连接是共享的。 </p>
                                    </td>
                                </tr>
                                <tr>
                                    <td vAlign=center align=left><strong><code>type</code></strong></td>
                                    <td vAlign=center align=left>
                                    <p>当web应用查找该资源的时候，返回的Java类名的全称。<br></p>
                                    </td>
                                </tr>
                            </tbody>
                        </table>
                        </blockquote></td>
                    </tr>
                </tbody>
            </table>
            <table cellSpacing=0 cellPadding=2 border=0>
                <tbody>
                    <tr>
                        <td bgColor=#828da6><font face=arial,helvetica.sanserif color=#ffffff><a name="Resource Parameters"><strong>资源参数（Resource Parameters</strong></a>）</font></td>
                    </tr>
                    <tr>
                        <td>
                        <blockquote>
                        <p>资源参数用来配置资源管理器（resource manager，或对象工厂,object factory）。在做JNDI查找时，资源管理器返回查找的对象。在资源可以被访问之前，对&lt;Context&gt;或&lt;DefaultContext&gt;元素的每个&lt;Resource&gt;元素，或者/WEB-INF/web.xml中定义的每个&lt;resource-ref&gt;或&lt;resource-env-ref&gt;元素，都必须定义资源参数。</p>
                        <p>资源参数是用名称定义的，使用的资源管理器（或者object factory）不同，参数名称的集合也不一样。这些参数名和工厂类的JavaBeans属性相对应。JNDI实现通过调用对应的JavaBeans属性设置函数来配置特定的工厂类，然后通过lookup()调用使得该实例可见。</p>
                        <p>一个JDBC数据源的资源参数可以按照如下方式定义：</p>
                        <p>&#160;</p>
                        <div align=left>
                        <table cellSpacing=4 cellPadding=0 border=0>
                            <tbody>
                                <tr>
                                    <td width=1 bgColor=#023264 height=1><img height=1 hspace=0 src="http://www.cnjsp.org/document/images/void.gif" width=1 border=0></td>
                                    <td bgColor=#023264 height=1><img height=1 hspace=0 src="http://www.cnjsp.org/document/images/void.gif" width=1 border=0></td>
                                    <td width=1 bgColor=#023264 height=1><img height=1 hspace=0 src="http://www.cnjsp.org/document/images/void.gif" width=1 border=0></td>
                                </tr>
                                <tr>
                                    <td width=1 bgColor=#023264><img height=1 hspace=0 src="http://www.cnjsp.org/document/images/void.gif" width=1 border=0></td>
                                    <td bgColor=#ffffff height=1>
                                    <pre>&lt;DefaultContext ...&gt;
                                    ...
                                    &lt;ResourceParams name="jdbc/EmployeeDB"&gt;
                                    &lt;parameter&gt;
                                    &lt;name&gt;driverClassName&lt;/name&gt;
                                    &lt;value&gt;org.hsql.jdbcDriver&lt;/value&gt;
                                    &lt;/parameter&gt;
                                    &lt;parameter&gt;
                                    &lt;name&gt;driverName&lt;/name&gt;
                                    &lt;/value&gt;jdbc:HypersonicSQL:database&lt;/value&gt;
                                    &lt;/parameter&gt;
                                    &lt;parameter&gt;
                                    &lt;name&gt;user&lt;/name&gt;
                                    &lt;value&gt;dbusername&lt;/value&gt;
                                    &lt;/parameter&gt;
                                    &lt;parameter&gt;
                                    &lt;name&gt;password&lt;/name&gt;
                                    &lt;value&gt;dbpassword&lt;/value&gt;
                                    &lt;/parameter&gt;
                                    &lt;/ResourceParams&gt;
                                    ...
                                    &lt;/DefaultContext&gt;
                                    </pre>
                                    </td>
                                    <td width=1 bgColor=#023264><img height=1 hspace=0 src="http://www.cnjsp.org/document/images/void.gif" width=1 border=0></td>
                                </tr>
                                <tr>
                                    <td width=1 bgColor=#023264 height=1><img height=1 hspace=0 src="http://www.cnjsp.org/document/images/void.gif" width=1 border=0></td>
                                    <td bgColor=#023264 height=1><img height=1 hspace=0 src="http://www.cnjsp.org/document/images/void.gif" width=1 border=0></td>
                                    <td width=1 bgColor=#023264 height=1><img height=1 hspace=0 src="http://www.cnjsp.org/document/images/void.gif" width=1 border=0></td>
                                </tr>
                            </tbody>
                        </table>
                        如果你需要为某个特定的资源类型指定工厂内的Java类名，在&lt;ResourceParams&gt;元素中嵌套一个叫做factory的&lt;parameter&gt;条目。
                        <p>&lt;Resourceparams&gt;元素的有效属性如下：<br></p>
                        </div>
                        <table cellPadding=5 border=1>
                            <tbody>
                                <tr>
                                    <th width="15%" bgColor=#023264><font color=#ffffff>属性</font></th>
                                    <th width="85%" bgColor=#023264><font color=#ffffff>描述</font></th>
                                </tr>
                                <tr>
                                    <td vAlign=center align=left><strong><code>name</code></strong></td>
                                    <td vAlign=center align=left>
                                    <p>配置的资源名称，相对于java:comp/env context。这个名称必须与$CATALINA_HOME/conf/server.xml中某个&lt;Resource&gt;元素定义的资源名称匹配，或者在/WEB-INF/web.xml中通过&lt;resource-ref&gt;或者&lt;resource-env-ref&gt;元素应用。<br></p>
                                    </td>
                                </tr>
                            </tbody>
                        </table>
                        </blockquote></td>
                    </tr>
                </tbody>
            </table>
            <table cellSpacing=0 cellPadding=2 border=0>
                <tbody>
                    <tr>
                        <td bgColor=#828da6><font face=arial,helvetica.sanserif color=#ffffff><a name="Resource Links"><strong>资源连接（Resource Links</strong></a>）</font></td>
                    </tr>
                    <tr>
                        <td>
                        <blockquote>
                        <p>资源连接用于创建到全局JNDI资源的连接。在连接名称上进行JNDI查询会返回被连接的global 资源。 <br>比如，你可以按照如下方法创建一个资源连接：<br></p>
                        <div align=left>
                        <table cellSpacing=4 cellPadding=0 border=0>
                            <tbody>
                                <tr>
                                    <td width=1 bgColor=#023264 height=1><img height=1 hspace=0 src="http://www.cnjsp.org/document/images/void.gif" width=1 border=0></td>
                                    <td bgColor=#023264 height=1><img height=1 hspace=0 src="http://www.cnjsp.org/document/images/void.gif" width=1 border=0></td>
                                    <td width=1 bgColor=#023264 height=1><img height=1 hspace=0 src="http://www.cnjsp.org/document/images/void.gif" width=1 border=0></td>
                                </tr>
                                <tr>
                                    <td width=1 bgColor=#023264><img height=1 hspace=0 src="http://www.cnjsp.org/document/images/void.gif" width=1 border=0></td>
                                    <td bgColor=#ffffff height=1>
                                    <pre>&lt;DefaultContext ...&gt;
                                    ...
                                    &lt;ResourceLink name="linkToGlobalResource"
                                    global="simpleValue"
                                    type="java.lang.Integer"
                                    ...
                                    &lt;/DefaultContext&gt;
                                    </pre>
                                    </td>
                                    <td width=1 bgColor=#023264><img height=1 hspace=0 src="http://www.cnjsp.org/document/images/void.gif" width=1 border=0></td>
                                </tr>
                                <tr>
                                    <td width=1 bgColor=#023264 height=1><img height=1 hspace=0 src="http://www.cnjsp.org/document/images/void.gif" width=1 border=0></td>
                                    <td bgColor=#023264 height=1><img height=1 hspace=0 src="http://www.cnjsp.org/document/images/void.gif" width=1 border=0></td>
                                    <td width=1 bgColor=#023264 height=1><img height=1 hspace=0 src="http://www.cnjsp.org/document/images/void.gif" width=1 border=0></td>
                                </tr>
                            </tbody>
                        </table>
                        </div>
                        <p>&lt;ResourceLink&gt;元素的有效属性如下：</p>
                        <table cellPadding=5 border=1>
                            <tbody>
                                <tr>
                                    <th width="15%" bgColor=#023264><font color=#ffffff>属性</font></th>
                                    <th width="85%" bgColor=#023264><font color=#ffffff>描述</font></th>
                                </tr>
                                <tr>
                                    <td vAlign=center align=left><strong><code>global</code></strong></td>
                                    <td vAlign=center align=left>
                                    <p>被连接的连接全局资源的名称<br></p>
                                    </td>
                                </tr>
                                <tr>
                                    <td vAlign=center align=left><strong><code>name</code></strong></td>
                                    <td vAlign=center align=left>
                                    <p>创建的资源连接的名称，相对于java:comp/env context<br></p>
                                    </td>
                                </tr>
                                <tr>
                                    <td vAlign=center align=left><strong><code>type</code></strong></td>
                                    <td vAlign=center align=left>
                                    <p>当web应用在该资源连接上进行查找时，返回的Java类名的全称<br></p>
                                    </td>
                                </tr>
                            </tbody>
                        </table>
                        </blockquote></td>
                    </tr>
                </tbody>
            </table>
            </blockquote></td>
        </tr>
    </tbody>
</table>
<img src ="http://www.blogjava.net/baoyaer/aggbug/122866.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2007-06-08 15:49 <a href="http://www.blogjava.net/baoyaer/articles/122866.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>妙用Telnet快速收发电子邮件</title><link>http://www.blogjava.net/baoyaer/articles/118228.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Fri, 18 May 2007 01:04:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/118228.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/118228.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/118228.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/118228.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/118228.html</trackback:ping><description><![CDATA[<div class="subtable altbg2 t_msg" style="WIDTH: auto; HEIGHT: auto"><br>妙用Telnet快速收发电子邮件 <br><br>方法一：打开&#8220;开始&#8221;菜单中的&#8220;运行&#8221;对话框，输入命令telnet 及远程服务器端口号， <br>如： <br>　　：telnet pop.china.com 110 就会与&#8220;中华网&#8221;的pop3服务器pop.china.com建立连接。 <br><br>　　方法二：在telnet界面之下，打开其主菜单上的&#8220;连接\远程系统&#8221;对话框，在&#8220;主机名&#8221;中 <br>输入：pop.china.com ，在&#8220;端口&#8221;中输入：110 ，终端类型就使用系统默认的vt100,如图三所 <br>示，这样设置之后，其执行结果与方法一相同。 <br><br>　　如果上述连接成功，POP3服务器就会回应如下信息(显示在终端上)： <br><br>　　+OK AIMC POP service (mail0.china.com) is ready.<br><br><br>　　在简单介绍telnet工具后，我们来了解如何用Telnet工具收取和发送电子邮件，以本人的电 <br>子邮箱[email]xu_xifeng@china.com[/email]为例进行说明(密码为：password)，显然这个邮箱在&#8220;中华网&#8221;上， <br>要收取&#8220;中华网&#8221;上的电子邮件，必须先登录到中华网的POP3服务器上，登录过程上面已经将 <br>过，在登录成功之后，紧接着输入如下命令（user命令接登录的用户名，pass命令接邮箱密码， <br>中间用空格隔开）： <br><br><br>　　user xu_xifeng <br>　　如果该用户名登录成功，POP3服务器会响应如下信息： <br>　　+OK Please enter password for user . <br>　　接着马上输入密码 <br>　　pass password <br>　　如果成功，终端会显示如下信息： <br>　　+OK xu_xifeng has 5 message (2294 octets)&nbsp;&nbsp;<br>　　其中数字5表示有5封邮件，2294表示这5封邮件总的字节数(即2294B),到此邮箱 <br>[email]xu_xifeng@china.com[/email]已成功登录,进入邮箱之后，有以下命令可以使用，其命令格式及参数说明 <br>如下： <br><br>　　1.stat命令 格式：stat 无需参数 <br>　　2.list命令 格式：list [n] 参数n可选，n为邮件编号 <br>　　3.uidl命令 格式：uidl [n] 同上 <br>　　4.retr命令 格式：retr n 参数n不可省，n为邮件编号 <br>　　5.dele命令 格式：dele n 同上 <br>　　6.top 命令 格式：top n m 参数n,m不可省,n为邮件编号,m为行数 <br>　　7.noop命令 格式：noop 无需参数 <br>　　8.quit命令 格式：quit 无需参数 <br>　　各命令的详细功能见下面的说明： <br><br>　　1、stat命令不带参数，对于此命令，POP3服务器会响应一个正确应答，此响应为一个单行的 <br>信息提示，它以&#8220;+OK&#8221;开头，接着是两个数字，第一个是邮件数目，第二个是邮件的大小，如： <br>+OK 4 1603（如图四的最末一行） <br><br>2、list命令的参数可选，该参数是一个数字，表示的是邮件在邮箱中的编号，我们可以利用不带 <br>参数的list命令，获得各邮件的编号，并且每一封邮件均占用一行显示，前面的数为邮件的编 <br>号，后面的数为邮件的大小。<br><br>　　3、uidl命令与list命令用途差不多，只不过uidl命令显示邮件的信息比list更详细，更具 <br>体，执行结果<br><br><br>　　4、retr命令是收邮件中最重要的一条命令,它的作用是查看邮件的内容,它必须带参数进行, <br>该命令执行之后,服务器应答的信息比较长,其中包括发件人的电子邮箱地址,发件时间,邮件主题 <br>等,这些信息统称为邮件头,紧接在邮件头之后的信息便是邮件正文<br><br><br>　　5、dele命令是用来删除指定的邮件(注意:dele n命令只是给邮件做上删除标记,只有在执行 <br>quit命令之后,邮件才会真正删除),删除的应答信息<br><br>　　6、top命令有两个参数,形如: top n m n为邮件编号,m是要读出邮件正文的行数,如果m=0,则 <br>只读出邮件的邮件头部分<br><br><br>　　7、noop命令,该命令发出后,POP3服务器不作任何事,仅返回一个正确响应"+OK"<br><br><br>　　8、quit命令,该命令发出后,telnet断开与POP3服务器的连接,系统进入更新状态,返回信息如 <br><br>===================================================================== <br>如何用telnet发送电子邮件呢？由于telnet发邮件的功能比较弱(它只能发一些简单的电子邮 <br>件)，因此不常用也不实用，所以我这里就只简单的给大家介绍一下，知道怎么用telnet发送邮件 <br>就可以了。 <br>　　与发邮件相同，在发送邮件之前，我们必须先同一个smtp服务器建立连接，还是以中华网的 <br>邮件服务器为例，打开&#8220;连接\远程系统&#8221;对话框，在&#8220;主机名&#8221;中输入：smtp.china.com ，在 <br>&#8220;端口&#8221;中输入：25 ，终端类型依然使用系统默认的vt100,如图十一所示，由此建立远程连接。 <br>如果此连接成功建立，远程smtp服务器就会响应如下信息<br><br>　　220 ************************************** <br><br>　　收到该信息之后，可以依次使用下面的命令(注意：顺序不能调动)来完成邮件的发送。 <br><br>　　step1.输入命令helo　xuxifeng <br><br>　　如果该请求(命令)成功接受，远程smtp服务器就会响应如下信息： <br><br>　　250 china.com, xuxifeng&lt;211.91.133.66&gt; okay<br>　　step2.输入命令mail from: <br><br>　　如果该请求成功接受，远程smtp服务器就会响应如下信息： <br>　　250 , sender ok<br><br>　　step3.输入命令rcpt to: <br><br>　　如果该请求成功接受，远程smtp服务器就会响应如下信息： <br>　　250 , Local recipient ok<br><br>　　step4.输入命令data <br><br>　　如果该请求成功接受，远程smtp服务器就会响应如下信息： <br>　　354 Start mail input; end with <br><br>到此一切发邮件的准备工作就绪，系统就等着你输入邮件的正文，注意：用telnet工具写邮件， <br>只能进行行编辑，回了车之后，上面的那一行再也不能更改了，还要说明一个问题，就是邮件正 <br>文怎么结束，其实很简单，你只要在回车之后，输入一个英文句号(.)，再回车就大功告成了，此 <br>时终端上会显示这样的信息： <br><br>　　250 Requested mail action okay, completed<br><br><br>　　最后不要忘了用quit命令退出此连接，以保证邮件能正常发送。在发邮件过程当中，当用户 <br>输入这样或那样的错误命令时，系统就会给出相应的错误提示，但是这些提示都是用英文写的， <br>可能有的网友对英文并不敏感，我这里就将几个常见的错误提示作一个说明：（数字为响应信息 <br>的状态码） <br><br>　　500:语法错误，不认识此命令 <br>　　501:命令的参数或变元有语法错误 <br>　　503:命令的先后次序有误 <br>　　553:邮件的处理过程未发生 <br><br>　　最后对本文作一个总结，用telnet收发电子邮件，其最大的特点在于它的速度快，在网速不 <br>高或是网页打开有困难的时候，该方法非常实用，尤其是收邮件，它能在几秒之内，让你登录到 <br>远程服务器上的电子邮箱中，查看你邮箱中的邮件，但是用它收发电子邮件，最大的弊端就是它 <br>的灵活性不大，界面也比较死板（全部都是字符显示），因此建议初学者还是不要用此法，对于 <br>&#8220;高手&#8221;到也无妨。</div>
<img src ="http://www.blogjava.net/baoyaer/aggbug/118228.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2007-05-18 09:04 <a href="http://www.blogjava.net/baoyaer/articles/118228.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>