﻿<?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>IT博客-大话人生-随笔分类-配置管理</title><link>http://www.cnitblog.com/stomic/category/7074.html</link><description /><language>zh-cn</language><lastBuildDate>Mon, 26 Sep 2011 14:00:56 GMT</lastBuildDate><pubDate>Mon, 26 Sep 2011 14:00:56 GMT</pubDate><ttl>60</ttl><item><title>一台机器同时运行多个Tomcat服务解决方案（补充版）</title><link>http://www.cnitblog.com/stomic/archive/2009/09/11/61364.html</link><dc:creator>大话人生</dc:creator><author>大话人生</author><pubDate>Fri, 11 Sep 2009 01:00:00 GMT</pubDate><guid>http://www.cnitblog.com/stomic/archive/2009/09/11/61364.html</guid><wfw:comment>http://www.cnitblog.com/stomic/comments/61364.html</wfw:comment><comments>http://www.cnitblog.com/stomic/archive/2009/09/11/61364.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/stomic/comments/commentRss/61364.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/stomic/services/trackbacks/61364.html</trackback:ping><description><![CDATA[<p>如果不加任何修改，在一台服务器上同时运行两个Tomcat服务显然会发生端口冲突。假设现在已经按照正常的方式安装配置好了第一个Tomcat,第二个如何设置呢？以下是使用Tomcat5.5解压版本所做的实验。<br>解决办法：<br>1.解压Tomcat到一个新的目录，比如d:\TomcatServer2;<br>2.新建一个环境变量CATALINA_HOME2，路径为d:\TomcatServer2;<br>3.编辑Tomcat/bin/startup.bat和catalina.bat，把CATALINA_HOME全部替换成CATALINA_HOME2;<br>4.编辑Tomcat/conf/server.xml,把8080和8005端口修改成其他数字，比如8888和9999;<br>5.运行测试。<br>补充：如果想只运行一个tomcat，可以通过配置多个Service来完成。<br>假设f:/sss为根目录，test为web应用目录<br>把下面的代码添加到server.xml的Server节点之后<br>&nbsp; &lt;Service name="sss"&gt;<br>&nbsp;&lt;Connector port="8888" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /&gt;<br>&nbsp;&lt;Connector port="9999" protocol="AJP/1.3" redirectPort="8444" /&gt;<br>&nbsp;&lt;Engine name="sss" defaultHost="localhost"&gt;<br>&nbsp; &lt;Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/&gt;<br>&nbsp; &lt;Host name="localhost" appBase="f:/sss" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false"&gt;<br>&nbsp; &lt;Context docBase="test" path=""/&gt;&nbsp; <br>&nbsp; &lt;/Host&gt;<br>&nbsp;&lt;/Engine&gt;<br>6.修改serve.xml中的server port，启动同的tomcat，需要设置不同的监听关闭端口。<br><br>但是有一个小小的问题是（据说是5.5的bug）：子目录不能有与应用名相同的情况。也就是说，test下面不能再有一个test目录。</p>
<img src ="http://www.cnitblog.com/stomic/aggbug/61364.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/stomic/" target="_blank">大话人生</a> 2009-09-11 09:00 <a href="http://www.cnitblog.com/stomic/archive/2009/09/11/61364.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Tomcat Catalina.bat解读</title><link>http://www.cnitblog.com/stomic/archive/2009/09/11/61359.html</link><dc:creator>大话人生</dc:creator><author>大话人生</author><pubDate>Thu, 10 Sep 2009 18:06:00 GMT</pubDate><guid>http://www.cnitblog.com/stomic/archive/2009/09/11/61359.html</guid><wfw:comment>http://www.cnitblog.com/stomic/comments/61359.html</wfw:comment><comments>http://www.cnitblog.com/stomic/archive/2009/09/11/61359.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnitblog.com/stomic/comments/commentRss/61359.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/stomic/services/trackbacks/61359.html</trackback:ping><description><![CDATA[<span class=hilite1><font style="BACKGROUND-COLOR: #ffff00">Catalina</font></span>.<span class=hilite2><font style="BACKGROUND-COLOR: #55ff55">bat</font></span>是tomcat所有脚本中最重要的脚本，完成几乎所有的tomcat操作。如启动，关闭等等,都是由<span class=hilite1><font style="BACKGROUND-COLOR: #ffff00">catalina</font></span>.<span class=hilite2><font style="BACKGROUND-COLOR: #55ff55">bat</font></span>脚本来完成的。接下来，我将对Tomcat <span class=hilite1><font style="BACKGROUND-COLOR: #ffff00">catalina</font></span>.<span class=hilite2><font style="BACKGROUND-COLOR: #55ff55">bat</font></span>脚本进行分析。 <br><br>&nbsp;&nbsp;&nbsp; 首先省去<span class=hilite1><font style="BACKGROUND-COLOR: #ffff00">catalina</font></span>.<span class=hilite2><font style="BACKGROUND-COLOR: #55ff55">bat</font></span>开头诸多注解，这些注解主要是讲解各个变量是干什么的。需要的话，自己看下英文就可以了。这里就不翻译了。 <br><br>rem Guess CATALINA_HOME if not defined&nbsp; 查看是否在tomcat目录下，与startup.<span class=hilite2><font style="BACKGROUND-COLOR: #55ff55">bat</font></span>里相同，不解释了。需要的话可以看我的另一篇博客。 <br>set CURRENT_DIR=%cd% <br>if not "%CATALINA_HOME%" == "" goto gotHome <br>set CATALINA_HOME=%CURRENT_DIR% <br>if exist "%CATALINA_HOME%\bin\<span class=hilite1><font style="BACKGROUND-COLOR: #ffff00">catalina</font></span>.<span class=hilite2><font style="BACKGROUND-COLOR: #55ff55">bat</font></span>" goto okHome <br>cd .. <br>set CATALINA_HOME=%cd% <br>cd %CURRENT_DIR% <br>:gotHome <br>if exist "%CATALINA_HOME%\bin\<span class=hilite1><font style="BACKGROUND-COLOR: #ffff00">catalina</font></span>.<span class=hilite2><font style="BACKGROUND-COLOR: #55ff55">bat</font></span>" goto okHome <br>echo The CATALINA_HOME environment variable is not defined correctly <br>echo This environment variable is needed to run this program <br>goto end <br>:okHome <br><br>rem Get standard environment variables <br>if exist "%CATALINA_HOME%\bin\setenv.<span class=hilite2><font style="BACKGROUND-COLOR: #55ff55">bat</font></span>" call "%CATALINA_HOME%\bin\setenv.<span class=hilite2><font style="BACKGROUND-COLOR: #55ff55">bat</font></span>" 如果存在setenv.<span class=hilite2><font style="BACKGROUND-COLOR: #55ff55">bat</font></span>脚本，调用它，我的tomcat 没有这个脚本 <br><br>rem Get standard Java environment variables <br>if exist "%CATALINA_HOME%\bin\setclasspath.<span class=hilite2><font style="BACKGROUND-COLOR: #55ff55">bat</font></span>" goto okSetclasspath 查看是否存在setclasspath.<span class=hilite2><font style="BACKGROUND-COLOR: #55ff55">bat</font></span>脚本，如果存在，转到okSetclasspath位置 <br>echo Cannot find %CATALINA_HOME%\bin\setclasspath.<span class=hilite2><font style="BACKGROUND-COLOR: #55ff55">bat</font></span> 否则输出下面两行，并退出 <br>echo This file is needed to run this program <br>goto end <br>:okSetclasspath&nbsp;&nbsp;&nbsp; okSetclasspath位置 <br><br>set BASEDIR=%CATALINA_HOME%&nbsp;&nbsp; 设定BASEDIR变量与CATALINA_HOME变量值相同 <br>call "%CATALINA_HOME%\bin\setclasspath.<span class=hilite2><font style="BACKGROUND-COLOR: #55ff55">bat</font></span>" %1&nbsp;&nbsp; 调用setclasspath.<span class=hilite2><font style="BACKGROUND-COLOR: #55ff55">bat</font></span>脚本并加上参数 <br>if errorlevel 1 goto end&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果存在错误 退出 <br><br>rem Add on extra jar files to CLASSPATH&nbsp;&nbsp; 设定JSSE_HOME变量，如果存在加入CLASSPATH，不存在跳过 <br><br>if "%JSSE_HOME%" == "" goto noJsse&nbsp;&nbsp;&nbsp; 检查是否存在JSSE_HOME变量 <br>set CLASSPATH=%CLASSPATH%;%JSSE_HOME%\lib\jcert.jar;%JSSE_HOME%\lib\jnet.jar;%JSSE_HOME%\lib\jsse.jar 如果有加入到CLASSPATH变量后面 <br>:noJsse&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>set CLASSPATH=%CLASSPATH%;%CATALINA_HOME%\bin\bootstrap.jar&nbsp; 将bootstrap.jar加入到CLASSPATH里 <br><br>if not "%CATALINA_BASE%" == "" goto gotBase&nbsp; 如果CATALINA_BASE变量不为空，跳过，转到gotBase位置 <br>set CATALINA_BASE=%CATALINA_HOME%&nbsp; 如果为空，将CATALINA_BASE设为CATALINA_HOME变量的值 <br>:gotBase <br><br>if not "%CATALINA_TMPDIR%" == "" goto gotTmpdir&nbsp;&nbsp; CATALINA_TMPDIR不为空，跳过，转到gotTmpdir位置 <br>set CATALINA_TMPDIR=%CATALINA_BASE%\temp&nbsp;&nbsp; 如果为空，将 CATALINA_TMPDIR设为%CATALINA_BASE%\temp变量的值（即tomcat\temp） <br>:gotTmpdir <br><br>if not exist "%CATALINA_HOME%\bin\tomcat-juli.jar" goto noJuli&nbsp; 如果不存在tomcat-juli.jar这个类，转到noJuli位置 <br>set JAVA_OPTS=%JAVA_OPTS% -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager - Djava.util.logging.config.file="%CATALINA_BASE%\conf\logging.properties"&nbsp; 如果存在，将变量加入到JAVA_OPTS里 <br>:noJuli <br><br><br><span style="COLOR: red">set JAVA_OPTS=%JAVA_OPTS% -Xms128m -Xmx512m -Dfile</span>.encoding=UTF8 -Duser.timezone=GMT -Djava.security.auth.login.config=%CATALINA_HOME%/conf/jaas.config&nbsp; 设定JAVA_OPTS变量 <br><br>echo Using CATALINA_BASE:&nbsp;&nbsp; %CATALINA_BASE%&nbsp;&nbsp;&nbsp;&nbsp; 输出CATALINA_BASE变量值 <br>echo Using CATALINA_HOME:&nbsp;&nbsp; %CATALINA_HOME%&nbsp;&nbsp;&nbsp;&nbsp; 输出CATALINA_HOME变量值 <br>echo Using CATALINA_TMPDIR: %CATALINA_TMPDIR% 输出CATALINA_TMPDIR变量值 <br>if ""%1"" == ""debug"" goto use_jdk&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果变量%1里存在debug ，转到use_jdk位置 <br>echo Using JRE_HOME:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; %JRE_HOME%&nbsp;&nbsp;&nbsp;&nbsp; 输出JRE_HOME变量值 <br>goto java_dir_displayed&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 转到java_dir_displayed <br>:use_jdk <br>echo Using JAVA_HOME:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; %JAVA_HOME%&nbsp;&nbsp;&nbsp; 输出JAVA_HOME变量值 <br>:java_dir_displayed <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 下面几行设定相应变量 <br>set _EXECJAVA=%_RUNJAVA%&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>set MAINCLASS=org.apache.<span class=hilite1><font style="BACKGROUND-COLOR: #ffff00">catalina</font></span>.startup.Bootstrap <br>set ACTION=start <br>set SECURITY_POLICY_FILE= <br>set DEBUG_OPTS= <br>set JPDA= <br><br>if not ""%1"" == ""jpda"" goto noJpda <br>set JPDA=jpda <br>if not "%JPDA_TRANSPORT%" == "" goto gotJpdaTransport <br>set JPDA_TRANSPORT=dt_shmem <br>:gotJpdaTransport <br>if not "%JPDA_ADDRESS%" == "" goto gotJpdaAddress <br>set JPDA_ADDRESS=jdbconn <br>:gotJpdaAddress <br>if not "%JPDA_SUSPEND%" == "" goto gotJpdaSuspend <br>set JPDA_SUSPEND=n <br>:gotJpdaSuspend <br>if not "%JPDA_OPTS%" == "" goto gotJpdaOpts <br>set JPDA_OPTS=-Xdebug -Xrunjdwp:transport=%JPDA_TRANSPORT%,address=%JPDA_ADDRESS%,server=y,suspend=%JPDA_SUSPEND% <br>:gotJpdaOpts <br>shift <br>:noJpda <br><br>if ""%1"" == ""debug"" goto doDebug&nbsp;&nbsp;&nbsp; 如果%1为debug，转到doDebug，运行debug模式 <br>if ""%1"" == ""run"" goto doRun&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果%1为run，转到doRun，运行正常模式 <br>if ""%1"" == ""start"" goto doStart&nbsp;&nbsp;&nbsp; 如果%1为start，转到doStart，启动tomcat <br>if ""%1"" == ""stop"" goto doStop&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果%1为stop，转到doStop，关闭tocmat <br>if ""%1"" == ""version"" goto doVersion 如果%1为version，转到doVersion，显示tomcat的版本号 <br><br>echo Usage:&nbsp; <span class=hilite1><font style="BACKGROUND-COLOR: #ffff00">catalina</font></span> ( commands ... ) 如果%1没有上述内容，输出下面几行，并结束 <br>echo commands: <br>echo&nbsp;&nbsp; debug&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Start <span class=hilite1><font style="BACKGROUND-COLOR: #ffff00">Catalina</font></span> in a debugger <br>echo&nbsp;&nbsp; debug -security&nbsp;&nbsp; Debug <span class=hilite1><font style="BACKGROUND-COLOR: #ffff00">Catalina</font></span> with a security manager <br>echo&nbsp;&nbsp; jpda start&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Start <span class=hilite1><font style="BACKGROUND-COLOR: #ffff00">Catalina</font></span> under JPDA debugger <br>echo&nbsp;&nbsp; run&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Start <span class=hilite1><font style="BACKGROUND-COLOR: #ffff00">Catalina</font></span> in the current window <br><br>echo&nbsp;&nbsp; run -security&nbsp;&nbsp;&nbsp;&nbsp; Start in the current window with security manager <br>echo&nbsp;&nbsp; start&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Start <span class=hilite1><font style="BACKGROUND-COLOR: #ffff00">Catalina</font></span> in a separate window <br>echo&nbsp;&nbsp; start -security&nbsp;&nbsp; Start in a separate window with security manager <br>echo&nbsp;&nbsp; stop&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Stop <span class=hilite1><font style="BACKGROUND-COLOR: #ffff00">Catalina</font></span> <br>echo&nbsp;&nbsp; version&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; What version of tomcat are you running? <br>goto end <br><br>:doDebug <br>shift&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 将%2里的值转到%1 <br>set _EXECJAVA=%_RUNJDB%&nbsp; 将变量 _EXECJAVA设为_RUNJDB变量的值 <br>set DEBUG_OPTS=-sourcepath "%CATALINA_HOME%\..\..\jakarta-tomcat-<span class=hilite1><font style="BACKGROUND-COLOR: #ffff00">catalina</font></span>\<span class=hilite1><font style="BACKGROUND-COLOR: #ffff00">catalina</font></span>\src\share"&nbsp; <br>设定DEBUG_OPTS变量 <br><br>if not ""%1"" == ""-security"" goto execCmd&nbsp;&nbsp;&nbsp; <br>如果%1不为-security，转到execCmd位置 <br><br>shift&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 将%2里的值转到%1 <br>echo Using Security Manager&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 输出该行 <br>set SECURITY_POLICY_FILE=%CATALINA_BASE%\conf\<span class=hilite1><font style="BACKGROUND-COLOR: #ffff00">catalina</font></span>.policy <br>设定SECURITY_POLICY_FILE变量的值 <br><br>goto execCmd&nbsp;&nbsp;&nbsp;&nbsp; 转到execCmd位置 <br><br>:doRun <br>shift&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 将%2里的值转到%1 <br>if not ""%1"" == ""-security"" goto execCmd&nbsp;&nbsp; 如果%1不为-security，转到execCmd位置 <br>shift&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 将%2里的值转到%1 <br>echo Using Security Manager&nbsp;&nbsp; 输出该行 <br>set SECURITY_POLICY_FILE=%CATALINA_BASE%\conf\<span class=hilite1><font style="BACKGROUND-COLOR: #ffff00">catalina</font></span>.policy <br>设定SECURITY_POLICY_FILE变量的值 <br><br>goto execCmd&nbsp; 转到execCmd位置 <br><br>:doStart <br>shift&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 将%2里的值转到%1 <br>if not "%OS%" == "Windows_NT" goto noTitle&nbsp; 如果OS变量不为Windows_NT，转到noTitle <br>set _EXECJAVA=start "Tomcat" %_RUNJAVA%&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 设定_EXECJAVA变量的值 <br>goto gotTitle&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 转到gotTitle位置 <br>:noTitle <br>set _EXECJAVA=start %_RUNJAVA%&nbsp;&nbsp;&nbsp; 设定 _EXECJAVA 变量的值 <br>:gotTitle&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>if not ""%1"" == ""-security"" goto execCmd&nbsp;&nbsp; 如果%1不为-security，转到execCmd位置 <br>shift&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 将%2里的值转到%1 <br>echo Using Security Manager&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 输出该行 <br>set SECURITY_POLICY_FILE=%CATALINA_BASE%\conf\<span class=hilite1><font style="BACKGROUND-COLOR: #ffff00">catalina</font></span>.policy&nbsp;&nbsp; <br>设定SECURITY_POLICY_FILE变量的值 <br><br>goto execCmd&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 转到execCmd位置 <br><br>:doStop <br>shift&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 将%2里的值转到%1 <br>set ACTION=stop&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 将ACTION的变量设为stop <br>set CATALINA_OPTS=&nbsp;&nbsp;&nbsp; 设CATALINA_OPTS为空 <br><br>goto execCmd&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 转到execCmd位置 <br><br>:doVersion&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 显示tomcat版本号 <br>%_EXECJAVA% -classpath "%CATALINA_HOME%\server\lib\<span class=hilite1><font style="BACKGROUND-COLOR: #ffff00">catalina</font></span>.jar" org.apache.<span class=hilite1><font style="BACKGROUND-COLOR: #ffff00">catalina</font></span>.util.ServerInfo&nbsp;&nbsp; 执行该命令 <br>goto end&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 结束该程序 <br><br>:execCmd&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>rem Get remaining unshifted command line arguments and save them in the <br>以下几行将命令参数存入CMD_LINE_ARGS变量中 <br><br>set CMD_LINE_ARGS= <br>:setArgs <br>if ""%1""=="""" goto doneSetArgs <br>set CMD_LINE_ARGS=%CMD_LINE_ARGS% %1 <br>shift <br>goto setArgs <br>:doneSetArgs <br><br>rem Execute Java with the applicable properties <br>if not "%JPDA%" == "" goto doJpda&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果JPDA变量不为空，转到doJpda位置 <br>if not "%SECURITY_POLICY_FILE%" == "" goto doSecurity <br>如果SECURITY_POLICY_FILE变量不为空，转到doSecurity位置 <br><br>如果都没有执行下面命令，并结束该程序 <br>%_EXECJAVA% %JAVA_OPTS% %CATALINA_OPTS% %DEBUG_OPTS% -Djava.endorsed.dirs="%JAVA_ENDORSED_DIRS%" -classpath "%CLASSPATH%" -Dcatalina.base="%CATALINA_BASE%" -Dcatalina.home="%CATALINA_HOME%" -Djava.io.tmpdir="%CATALINA_TMPDIR%" %MAINCLASS% %CMD_LINE_ARGS% %ACTION% <br>goto end <br>:doSecurity&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 执行下面命令，并结束该程序 <br>%_EXECJAVA% %JAVA_OPTS% %CATALINA_OPTS% %DEBUG_OPTS% -Djava.endorsed.dirs="%JAVA_ENDORSED_DIRS%" -classpath "%CLASSPATH%" -Djava.security.manager -Djava.security.policy=="%SECURITY_POLICY_FILE%" -Dcatalina.base="%CATALINA_BASE%" -Dcatalina.home="%CATALINA_HOME%" -Djava.io.tmpdir="%CATALINA_TMPDIR%" %MAINCLASS% %CMD_LINE_ARGS% %ACTION% <br>goto end <br>:doJpda&nbsp;&nbsp; <br>如果SECURITY_POLICY_FILE变量不为空，转到doSecurityJpda位置，为空执行下面命令，并结束该程序&nbsp;&nbsp; <br><br>if not "%SECURITY_POLICY_FILE%" == "" goto doSecurityJpda <br>%_EXECJAVA% %JAVA_OPTS% %CATALINA_OPTS% %JPDA_OPTS% %DEBUG_OPTS% -Djava.endorsed.dirs="%JAVA_ENDORSED_DIRS%" -classpath "%CLASSPATH%" -Dcatalina.base="%CATALINA_BASE%" -Dcatalina.home="%CATALINA_HOME%" -Djava.io.tmpdir="%CATALINA_TMPDIR%" %MAINCLASS% %CMD_LINE_ARGS% %ACTION% <br>goto end <br>:doSecurityJpda&nbsp; 执行下面命令，并结束该程序 <br>%_EXECJAVA% %JAVA_OPTS% %CATALINA_OPTS% %JPDA_OPTS% %DEBUG_OPTS% -Djava.endorsed.dirs="%JAVA_ENDORSED_DIRS%" -classpath "%CLASSPATH%" -Djava.security.manager -Djava.security.policy=="%SECURITY_POLICY_FILE%" -Dcatalina.base="%CATALINA_BASE%" -Dcatalina.home="%CATALINA_HOME%" -Djava.io.tmpdir="%CATALINA_TMPDIR%" %MAINCLASS% %CMD_LINE_ARGS% %ACTION% <br>goto end <br><br>:end <br><br>终结： <br><br>&nbsp;&nbsp; <span class=hilite1><font style="BACKGROUND-COLOR: #ffff00">catalina</font></span>.<span class=hilite2><font style="BACKGROUND-COLOR: #55ff55">bat</font></span>咋一看还以为是什么windows程序，可以双击运行，实际上就是调用java命令运行Bootstrap类。从上面代码可以看出tomcat确实是一个纯java的程序，脚本最后都变成直接使用java命令执行程序，与我们普通写的java程序，没有什么不同。只不过由于 tomcat可以使用各种众多的模式（如debug,Security等），以及各种需要各种参数所以不得不使用脚本来执行。 <br><br>如果你想看看你到底使用了什么命令可以在&#8220;if not "%SECURITY_POLICY_FILE%" == "" goto doSecurity&#8221;这行下面添加两行。 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; echo&nbsp; %_EXECJAVA% %JAVA_OPTS% %CATALINA_OPTS% %DEBUG_OPTS% -Djava.endorsed.dir ....（下面那段，是一行但太长，折行了） <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pause <br>&nbsp;&nbsp; 第一行的命令是打印这具话，系统会将% %里面的变量提换成找到的值并输出。第二行是暂停程序，你可以通过任意键来恢复运行。 <br>&nbsp;&nbsp; 下面是我的程序打印的结果： <br><br>start "Tomcat" "C:\Program Files\Java\jdk1.6.0_01\bin\java"&nbsp; -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.util.logging.config.file="C:\work\tomcat\conf\logging.properties" -Xms128m -Xmx512m -Dfile.encoding=UTF8 -Duser.timezone=GMT -Djava.security.auth.login.config=C:\work\tomcat/conf/jaas.config&nbsp;&nbsp; -Djava.endorsed.dirs="C:\work\tomcat\common\endorsed" -classpath "C:\Program Files\Java\jdk1.6.0_01\lib\tools.jar;C:\work\tomcat\bin\bootstrap.jar" -Dcatalina.base="C:\work\tomcat" -Dcatalina.home="C:\work\tomcat" -Djava.io.tmpdir="C:\work\tomcat\temp" org.apache.<span class=hilite1><font style="BACKGROUND-COLOR: #ffff00">catalina</font></span>.startup.Bootstrap&nbsp; start <br><br>&nbsp;&nbsp;&nbsp; start "tomcat"是另开一个窗口，窗口名是tomcat的意思，你可以去掉这部分，完将你程序打印的拷贝到命令行下，点回车，看是不是一样运行 tomcat了。<span class=hilite1><font style="BACKGROUND-COLOR: #ffff00">Catalina</font></span>.<span class=hilite2><font style="BACKGROUND-COLOR: #55ff55">bat</font></span> startup实际时就将各种系统变量加以总结，输出成这个命令。&nbsp;&nbsp; 呵呵! 
<img src ="http://www.cnitblog.com/stomic/aggbug/61359.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/stomic/" target="_blank">大话人生</a> 2009-09-11 02:06 <a href="http://www.cnitblog.com/stomic/archive/2009/09/11/61359.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在eclipse + MyEclipse下配置建立J2EE工程</title><link>http://www.cnitblog.com/stomic/archive/2009/07/17/60169.html</link><dc:creator>大话人生</dc:creator><author>大话人生</author><pubDate>Fri, 17 Jul 2009 06:48:00 GMT</pubDate><guid>http://www.cnitblog.com/stomic/archive/2009/07/17/60169.html</guid><wfw:comment>http://www.cnitblog.com/stomic/comments/60169.html</wfw:comment><comments>http://www.cnitblog.com/stomic/archive/2009/07/17/60169.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnitblog.com/stomic/comments/commentRss/60169.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/stomic/services/trackbacks/60169.html</trackback:ping><description><![CDATA[<p><font size=2><font face="新宋体, monospace">笔者过去做</font><font face="Times New Roman, serif">J2EE</font><font face="新宋体, monospace">时一直使用</font><font face="Times New Roman, serif">IBM</font><font face="新宋体, monospace">的</font><font face="Times New Roman, serif">WSAD(Websphere Studio Application Developer)</font><font face="新宋体, monospace">，这个</font><font face="Times New Roman, serif">IBM</font><font face="新宋体, monospace">的主打工具还是很好用的，缺点也很明显，太耗内存</font><font face="Times New Roman, serif">! </font><font face="新宋体, monospace">最低也要</font><font face="Times New Roman, serif">512M</font><font face="新宋体, monospace">的配置，想要跑的顺利一点？上</font><font face="Times New Roman, serif">1G</font><font face="新宋体, monospace">吧！虽然</font><font face="Times New Roman, serif">java</font><font face="新宋体, monospace">本身也就是个吃内存的主，还似乎还不至于这么过分。另一方面，在国内本身想弄到</font><font face="Times New Roman, serif">WSAD</font><font face="新宋体, monospace">也不是件容易事</font><font face="Times New Roman, serif">(</font><font face="新宋体, monospace">光是看看它的体积吧</font><font face="Times New Roman, serif">...)</font><font face="新宋体, monospace">，这里，向大家强烈推荐使用</font><font face="Times New Roman, serif">Eclipse(MyEclipse) </font><font face="新宋体, monospace">＋ </font><font face="Times New Roman, serif">Tomcat </font><font face="新宋体, monospace">！！</font></font>
<p style="LINE-HEIGHT: 150%" align=left><font size=2><font face="新宋体, monospace">首先在</font><font face="Times New Roman, serif" color=#0000ff><a href="http://www.eclipse.org/"><u>www.eclipse.org</u></a></font><font face="新宋体, monospace">免费下载</font><font face="Times New Roman, serif">Eclipse</font><font face="新宋体, monospace">，笔者写作此篇时比较稳定是</font><font face="Times New Roman, serif">3.0</font><font face="新宋体, monospace">，安装非常简单，也同时有非常详细的帮助文档。顺利启动后，就可以看到华丽的欢迎界面。</font></font></p>
<p style="LINE-HEIGHT: 150%" align=left><font size=2><font face="Times New Roman, serif">Tomcat</font><font face="新宋体, monospace">是著名开源组织</font><font face="Times New Roman, serif">apache</font><font face="新宋体, monospace">的巨献，当前的主要版本是</font><font face="Times New Roman, serif">Tomcat 5</font><font face="新宋体, monospace">，笔者写作时使用的是</font><font face="Times New Roman, serif">4.0.1</font><font face="新宋体, monospace">，已经是比较&#8220;历史悠久&#8221;的版本 </font><font face="Times New Roman, serif">:-). </font></font></p>
<p style="LINE-HEIGHT: 150%" align=left><font size=2><font face="新宋体, monospace">为了更好的管理</font><font face="Times New Roman, serif">J2EE</font><font face="新宋体, monospace">项目，一个很好的插件是</font><font face="Times New Roman, serif">MyEclipse</font><font face="新宋体, monospace">，你可以在</font><font face="Times New Roman, serif" color=#0000ff><a href="http://www.myeclipseide.com/"><u>www.myeclipseide.com </u></a></font><font face="新宋体, monospace">得到</font><font face="Times New Roman, serif">30</font><font face="新宋体, monospace">天的免费使用版本。</font></font></p>
<p style="LINE-HEIGHT: 150%" align=left><font face="新宋体, monospace" size=2>下面，让我们来走一遍。</font></p>
<p style="LINE-HEIGHT: 150%" align=left><font size=2><font face="新宋体, monospace">把</font><font face="Times New Roman, serif">myEclipse</font><font face="新宋体, monospace">解压到</font><font face="Times New Roman, serif">Eclipse</font><font face="新宋体, monospace">的本地路径上，重新启动</font><font face="Times New Roman, serif">Eclipse</font><font face="新宋体, monospace">以后，你在首选项将会发现多了</font><font face="Times New Roman, serif">MyEclipse</font><font face="新宋体, monospace">选项。</font></font></p>
<p style="LINE-HEIGHT: 150%" align=left><font size=2><img alt=" " src="http://yefeng177.blogchina.com/yefeng177/inc/e1.JPG" onload="javascript: img_auto_size(this,450,true);" align=baseline><br></font>
<p style="LINE-HEIGHT: 150%" align=left><font size=2><font face="新宋体, monospace">在</font><font face="Times New Roman, serif">Application Server</font><font face="新宋体, monospace">中，选定你采用的服务器类型，在这里，我选中</font><font face="Times New Roman, serif">Tomcat 4</font><font face="新宋体, monospace">，并将</font><font face="Times New Roman, serif">Tomcat</font><font face="新宋体, monospace">的安装路径</font><font face="Times New Roman, serif">(</font><font face="新宋体, monospace">右侧</font><font face="Times New Roman, serif">)</font><font face="新宋体, monospace">选中，接着，将</font><font face="Times New Roman, serif">Tomcat Server</font><font face="新宋体, monospace">置为</font><font face="Times New Roman, serif">Enable</font><font face="新宋体, monospace">状态。</font></font></p>
<p style="LINE-HEIGHT: 150%" align=left><font size=2><font face="新宋体, monospace">新建一个</font><font face="Times New Roman, serif">Web Project</font><font face="新宋体, monospace">，输入自己的项目名称以及准备采用的</font><font face="Times New Roman, serif">J2EE</font><font face="新宋体, monospace">标准版本。</font></font></p>
<p style="LINE-HEIGHT: 150%" align=left><img alt=" " src="http://yefeng177.blogchina.com/yefeng177/inc/e2.JPG" onload="javascript: img_auto_size(this,450,true);" align=baseline><font size=2><br><br></font>
<p style="LINE-HEIGHT: 150%" align=center><font size=2><br><br></font></p>
<p style="LINE-HEIGHT: 150%" align=left><font size=2><img alt=" " src="http://yefeng177.blogchina.com/yefeng177/inc/e3.JPG" onload="javascript: img_auto_size(this,450,true);" align=baseline><br clear=left><br><br></font></p>
<p style="LINE-HEIGHT: 150%" align=left><font size=2><font face="新宋体, monospace">可以看到，在浏览器中，</font><font face="Times New Roman, serif">Eclipse</font><font face="新宋体, monospace">所体现出来的项目体系结构与</font><font face="Times New Roman, serif">WSAD</font><font face="新宋体, monospace">是非常类似的，习惯上，在</font><font face="Times New Roman, serif">scr</font><font face="新宋体, monospace">目录中放置</font><font face="Times New Roman, serif">java</font><font face="新宋体, monospace">后台源代码，而在</font><font face="Times New Roman, serif">WebRoot</font><font face="新宋体, monospace">中放置页面设计文件。</font></font></p>
<p style="LINE-HEIGHT: 150%" align=left><font size=2><img alt=" " src="http://yefeng177.blogchina.com/yefeng177/inc/e4.JPG" onload="javascript: img_auto_size(this,450,true);" align=baseline><br clear=left><br><br></font></p>
<p style="LINE-HEIGHT: 150%" align=left><font size=2><font face="新宋体, monospace">下面，我要做的只是将这个建立好的</font><font face="Times New Roman, serif">web</font><font face="新宋体, monospace">工程与服务器连接起来</font></font></p>
<p style="LINE-HEIGHT: 150%" align=left><font size=2><br><br></font></p>
<p style="LINE-HEIGHT: 150%" align=left><font size=2><font face="新宋体, monospace">这里有一个小而关键的细节，在安装</font><font face="Times New Roman, serif">Tomcat</font><font face="新宋体, monospace">中，你所选择（或者是系统所替你选择的</font><font face="Times New Roman, serif">JRE</font><font face="新宋体, monospace">也许和</font><font face="Times New Roman, serif">Web</font><font face="新宋体, monospace">项目本身不一样，</font><font face="Times New Roman, serif">Web</font><font face="新宋体, monospace">项目的</font><font face="Times New Roman, serif">JRE</font><font face="新宋体, monospace">环境可以在右键单击项目名称</font><font face="Times New Roman, serif">-&gt;Properties-&gt;java Build Path</font><font face="新宋体, monospace">中看到），所以在</font><font face="Times New Roman, serif">window-&gt;Preferences-&gt;MyEclipse-&gt;Tomcat 4</font><font face="新宋体, monospace">的展开节点的</font><font face="Times New Roman, serif">JDK</font><font face="新宋体, monospace">上，你需要为自己的连接新建一个</font><font face="Times New Roman, serif">server name</font><font face="新宋体, monospace">，如图，笔者</font><font face="Times New Roman, serif">add... </font><font face="新宋体, monospace">了一个</font><font face="Times New Roman, serif">Tomcat 4</font><font face="新宋体, monospace">，并为其指定了</font><font face="Times New Roman, serif">Tomcat</font><font face="新宋体, monospace">在安装时所对应的</font><font face="Times New Roman, serif">JRE</font><font face="新宋体, monospace">环境路径，<font color=#0000ff>而不是</font></font><font face="Times New Roman, serif"><font color=#0000ff>Eclipse</font></font><font face="新宋体, monospace"><font color=#0000ff>项目自身对应的</font></font><font face="Times New Roman, serif"><font color=#0000ff>JRE</font></font><font face="新宋体, monospace">：</font></font></p>
<p style="LINE-HEIGHT: 150%" align=left><font size=2><img alt=" " src="http://yefeng177.blogchina.com/yefeng177/inc/e5.JPG" onload="javascript: img_auto_size(this,450,true);" align=baseline><br clear=left><br><br></font></p>
<p style="LINE-HEIGHT: 150%" align=left><font size=2><img alt=" " src="http://yefeng177.blogchina.com/yefeng177/inc/e6.JPG" onload="javascript: img_auto_size(this,450,true);" align=baseline><br clear=left><br><br></font></p>
<p style="LINE-HEIGHT: 150%" align=left><font face="新宋体, monospace" size=2>到了这里，我们所做的工作就基本完成了，</font></p>
<p style="LINE-HEIGHT: 150%" align=left><font size=2><font face="新宋体, monospace">点击工具栏上的部署</font><font face="Times New Roman, serif">(</font><font face="新宋体, monospace">红色</font><font face="Times New Roman, serif">)</font><font face="新宋体, monospace">按钮，在弹出对话框中选择自己的项目，并安</font><font face="Times New Roman, serif">(</font><font face="新宋体, monospace">黄色</font><font face="Times New Roman, serif">)</font><font face="新宋体, monospace">的添加按钮来添加一个服务器实例，在弹出的部署服务器上选择</font><font face="Times New Roman, serif">Tomcat</font><font face="新宋体, monospace">，选择</font><font face="Times New Roman, serif">Exploed Archive</font><font face="新宋体, monospace">后，</font><font face="Times New Roman, serif">IDE</font><font face="新宋体, monospace">会为你提供热编译的一致性。</font></font></p>
<p style="LINE-HEIGHT: 150%" align=left><font size=2><br><br></font></p>
<p style="LINE-HEIGHT: 150%" align=left><font size=2><img alt=" " src="http://yefeng177.blogchina.com/yefeng177/inc/e7.JPG" onload="javascript: img_auto_size(this,450,true);" align=baseline><br clear=left><br><br></font></p>
<p style="LINE-HEIGHT: 150%" align=left><font size=2><font face="新宋体, monospace">最后完成关联后，不要忘记启动</font><font face="Times New Roman, serif">Tomcat</font><font face="新宋体, monospace">服务器哟。在浏览器中输入自己的地址，就可以看看效果了，如</font><font face="Times New Roman, serif">http://localhost:8080/<font color=#0000ff>hyweb/MyJsp.jsp</font><font color=#000000>, </font></font><font face="新宋体, monospace"><font color=#000000>当然，还要注意自己的服务器端口设置了。</font></font></font></p>
<img src ="http://www.cnitblog.com/stomic/aggbug/60169.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/stomic/" target="_blank">大话人生</a> 2009-07-17 14:48 <a href="http://www.cnitblog.com/stomic/archive/2009/07/17/60169.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JSP动态网站环境搭建应用中详细步骤介绍</title><link>http://www.cnitblog.com/stomic/archive/2009/07/15/60116.html</link><dc:creator>大话人生</dc:creator><author>大话人生</author><pubDate>Wed, 15 Jul 2009 04:09:00 GMT</pubDate><guid>http://www.cnitblog.com/stomic/archive/2009/07/15/60116.html</guid><wfw:comment>http://www.cnitblog.com/stomic/comments/60116.html</wfw:comment><comments>http://www.cnitblog.com/stomic/archive/2009/07/15/60116.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/stomic/comments/commentRss/60116.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/stomic/services/trackbacks/60116.html</trackback:ping><description><![CDATA[&nbsp;Sun推出的JSP（Java Server Pages）是一种执行于服务器端的动态网页开发技术，它基于Java技术。执行JSP时需要在Web服务器上架设一个编译JSP网页的引擎。配置 JSP 环境可以有多种途径，但主要工作就是安装和配置Web服务器和JSP引擎。
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">下面就以Tomcat作为JSP引擎，配合Tomcat、Apache、IIS这三种Web服务器来讲述3种搭建JSP运行环境的方案。
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">一、相关软件介绍
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">1、 J2SDK：Java2的软件开发工具，是Java应用程序的基础。JSP是基于Java技术的，所以配置JSP环境之前必须要安装J2SDK。
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">2、 Apache服务器：Apache组织开发的一种常用Web服务器，提供Web服务。
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">3、 Tomcat服务器：Apache组织开发的一种JSP引擎，本身具有Web服务器的功能，可以作为独立的Web服务器来使用。但是，在作为Web服务器方面，Tomcat处理静态HTML页面时不如Apache迅速，也没有Apache健壮，所以我们一般将Tomcat与Apache配合使用，让Apache对网站的静态页面请求提供服务，而Tomcat作为专用的JSP引擎，提供JSP解析，以得到更好的性能。并且Tomcat本身就是Apache的一个子项目，所以Tomcat对Apache提供了强有力的支持。对于初学者来说，Tomcat是一个很不错的选择。
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">4、 mod_jk.dll：Apache组织Jakarta项目组开发的使Apache支持Tomcat的插件。有了这个插件，Tomcat能够和Apache进行无缝连接。
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">5、 tc4ntiis.zip：Apache组织Jakarta项目组开发的使IIS支持Tomcat的插件。
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">二、 软件下载
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">1、j2sdk Webjx.Com
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">版本：j2sdk1.4.1(35.9MB)
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">地址：http://java.sun.com/j2se/1.4.1/download.html
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">http://www.timefound.com.cn/info/data/resource/download/j2sdk-1_4_1_01-windows-i586.exe 20070108
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">2、Apache2
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">版本：Apache2.0.43（6.69MB） 　　地址：http://www.apache.inetcosmos.org/dist/httpd/binaries/win32/
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">3、Tomcat4
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">版本：4.1.21（8.33MB）
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">地址：http://jakarta.apache.org/builds/jakarta-tomcat-4.0/release/
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">http://apache.seekmeup.com/tomcat/tomcat-5/v5.5.20/bin/apache-tomcat-5.5.20.exe20070108
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">http://tomcat.apache.org/download-55.cgi#5.5.20
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">4、mod_jk.dll： (136KB)
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">地址：http://jakarta.apache.org/builds/jakarta-tomcat-connectors/jk/release/
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">5、tc4ntiis.zip（220KB）
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">地址：http://members.ozemail.com.au/~lampante/howto/tomcat/iisnt/tc4ntiis.zip
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">以上均为免费软件。 </p>
<p style="TEXT-INDENT: 2em">三、 配置前的准备
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">（一）准备一个测试用的JSP网页
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">打开文本编辑器，比如记事本，输入下列代码，并保存为test .jsp（注意扩展名为.jsp）。
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">以下为引用的内容：
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">
<center><ccid_nobr>
<table cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
    <tbody>
        <tr>
            <td class=code style="FONT-SIZE: 9pt" bgColor=#e6e6e6>
            <pre><ccid_code>＜HTML＞
            ＜HEAD＞
            ＜TITLE＞JSP测试页面＜/TITLE＞
            ＜/HEAD＞
            ＜BODY＞
            ＜%out.println("＜h1＞Hello World! ＜/h1＞");%＞
            ＜/BODY＞
            ＜/HTML＞</ccid_code></pre>
            </td>
        </tr>
    </tbody>
</table>
</ccid_nobr></center>
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">（二）安装J2SDK
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">不管哪种方案，在安装和配置JSP引擎之前必须先完成J2SDK的安装。
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">1、安装J2SDK
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">在Windows下，直接运行下载的j2sdk-1_4_1_01-windows-i586.exe文件，根据安装向导安装到一个目录，例如安装到f:\j2sdk 1.4.1；
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">2、 添加环境变量
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">（1）如果你的操作系统是Win 98，可以用记事本直接编辑Autoexec.bat，添加下面命令行：
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">以下为引用的内容：
<p style="TEXT-INDENT: 2em">PATH=％PATH%;f:\j2sdk1.4.1\bin
<p style="TEXT-INDENT: 2em">SET JAVA_HOME=f:\j2sdk1.4.1
<p style="TEXT-INDENT: 2em">SET CLASSPATH=f:\j2sdk1.4.1\lib\tools.jar
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">保存后，重新启动计算机，这样所添加的环境变量才会有效。
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">（2）如果你的操作系统是Win2000，那么右击&#8220;我的电脑&#8221;，在弹出菜单中选择"属性"&#8594;"系统特性" &#8594;"高级" &#8594;"环境变量"， 弹出环境变量对话框，就可以编辑系统的环境变量了。添加PATH、JAVA_HOME和CLASSPATH三个变量，变量值同上。<span class=a14c id=zoom></p>
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">四、 JSP环境的配置方案
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">（一）方案一：J2SDK＋Tomcat
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">在这种方案里Tomcat既作为JSP引擎又作为Web服务器，配置比较简单。
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">1、安装Tomcat
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">直接运行下载的jakarta-tomcat-4.0.1.exe，按照一般的Windows程序安装步骤即可安装好Tomcat,安装时它会自动寻找J2SDK的位置。例如安装到f:\tomcat4。
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">2、配置Tomcat的环境变量
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">添加一个新的环境变量TOMCAT_HOME，变量值为f:\tomcat4，添加方法同J2SDK环境变量的配置方法。
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">3、测试默认服务
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">设置完毕后就可以运行Tomcat服务器了。用f:\tomcat4\bin\startup.exe启动Tomcat，用f:\tomcat4\bin\shutdown.exe关闭。（如果在执行startup.exe或shutdown.exe的时候提示Out of Environment Space错误，选择DOS 窗口的菜单中的"属性"&#8594;" 内存"&#8594;" 常规内存"， 把"初始环境"由"自动"修改成"2816"就可以了。） </p>
<p style="TEXT-INDENT: 2em">启动Tomcat后，打开浏览器，在地址栏中输入http://localhost:8080（Tomcat默认端口为8080），如果在浏览器中看到Tomcat的欢迎界面，表示Tomcat工作正常。
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">4、测试项目
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">把刚才准备好的test.jsp放在f:\Tomcat\webapps\examples\jsp目录下, 在地址栏中输入http://localhost:8080/examples/jsp/test.jsp，如果浏览器中显示"Hello World！"，则说明你的JSP环境配置成功了！
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">由于Tomcat本身具有web服务器的功能，因此我们不必安装Apache，当然它也可以与Apache集成到一起，下面介绍。
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">（二）方案二：J2SDK＋Apache＋Tomcat
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">虽然Tomcat也可以作Web服务器,但其处理静态HTML的速度比不上Apache,且其作为Web服务器的功能远不如Apache,因此把Apache和Tomcat集成起来，用Apache充当Web服务器，而Tomcat作为专用的JSP引擎。这种方案的配置比较复杂，但是能让Apache和Tomcat完美整合，实现强大的功能。
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">注意，因为IIS Web服务器默认使用80端口，而Apache的默认端口也是80，所以如果你使用的是Win2000操作系统，而且预装了IIS，为方便请在进行以下操作之前先将IIS服务停掉。
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">1、安装Apache
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">运行下载的apache_2.0.43-win32-x86-no_ssl.exe，按照向导安装到f:\Apache2。（注意，Apache2.0.43安装成功后，必须将f:\Apache2\htdocs目录下的index.html.en改名为index.html，这样在测试默认服务时才会正常显示Apache的欢迎界面）。
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">2、测试Apache默认服务
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">安装完后，Apache服务器就已经自动运行了。打开浏览器，在地址栏中输入：http://localhost（Tomcat默认端口为80），如果在浏览器中看到Apache的欢迎界面，说明Apache工作正常。
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">3、 按照方案一的步骤安装Tomcat，并保证它正常运行。
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">4、 将下载的mod_jk-2.0.42.dll复制到f:\Apache2\modules目录下。
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">5、 建立mod_jk模块工作所需要的工作文件。
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">打开文本编辑器，输入下列语句：
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">以下为引用的内容：
<p style="TEXT-INDENT: 2em">workers.tomcat_home=f:\tomcat4 （让mod_jk模块知道Tomcat）
<p style="TEXT-INDENT: 2em">workers.java_home=f:\j2sdk1.4.1 （让mod_jk模块知道JSDK）
<p style="TEXT-INDENT: 2em">ps=\
<p style="TEXT-INDENT: 2em">worker.list=ajp13 （mod_jk的模块版本）
<p style="TEXT-INDENT: 2em">worker.ajp13.port=8009 （mod_jk的工作端口）
<p style="TEXT-INDENT: 2em">worker.ajp13.host=localhost
<p style="TEXT-INDENT: 2em">worker.ajp13.type=ajp13
<p style="TEXT-INDENT: 2em">worker.ajp13.lbfactor=1
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">把上面的语句以workers.properties为文件名保存在f:\Tomcat4\conf目录下（注意:文件的扩展名是.properties）。 　　
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">6、 配置Apache。
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">用文本编辑器打开f:\Apache2\conf\httpd.conf
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">1）找到"DirectoryIndex"，在index.html.var后面再添加index.jsp；
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">2）在httpd.conf的最后加入下面这段代码（括号里为解释） Webjx.Com </p>
<p style="TEXT-INDENT: 2em">以下为引用的内容：
<p style="TEXT-INDENT: 2em">LoadModule jk_module modules/mod_jk-2.0.42.dll
<p style="TEXT-INDENT: 2em">（装载mod_jk模块，用于处理Apache和Tomcat的连接）
<p style="TEXT-INDENT: 2em">JkWorkersFile "f:/tomcat4/conf/workers.properties"
<p style="TEXT-INDENT: 2em">（指出mod_jk模块工作所需要的工作文件workers.properties的位置）
<p style="TEXT-INDENT: 2em">JkMount /servlet/* ajp13
<p style="TEXT-INDENT: 2em">JkMount /*.jsp ajp13
<p style="TEXT-INDENT: 2em">（将所有servlet 和jsp请求通过Ajp13的协议送给Tomcat，让Tomcat来处理）
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">3）添加完毕后保存。
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">7、 配置Tomcat
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">用文本编辑器打开f:\Tomcat4\conf\server.xml。因为Tomcat4默认不启用Ajp13，所以查找到如下这段代码：
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">以下为引用的内容：
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">
<center><ccid_nobr>
<table cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
    <tbody>
        <tr>
            <td class=code style="FONT-SIZE: 9pt" bgColor=#e6e6e6>
            <pre><ccid_code>＜!--
            ＜Connector className="org.apache.ajp.tomcat4.Ajp13Connector"
            port="8009" minProcessors="5" maxProcessors="75" acceptCount="10" debug="0"/＞
            --＞</ccid_code></pre>
            </td>
        </tr>
    </tbody>
</table>
</ccid_nobr></center>
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">把注释符号＜!-- --＞ 删掉就可以启用Ajp13了。
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">然后保存，现在Tomcat和Apache的整合配置基本完成了。
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">8、 整体测试
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">把test.jsp放在f:\Tomcat\webapps\examples\jsp 目录下，依次启动Apache2，Tomcat4。打开浏览器，在地址栏里输入http://localhost:8080/examples/jsp/test.jsp，如果浏览器中出现"Hello World！"，则Tomcat重新配置后工作正常；在地址栏中输入http://localhost/examples/jsp/test.jsp，若与http://localhost:8080/examples/jsp/test.jsp的结果相同，那就表明Apache和Tomcat整合成功了！
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">（三）方案三：J2SDK＋IIS＋Tomcat Webjx.Com
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">Windows平台下最常用的Web服务器无疑是IIS，正常情况下IIS不支持JSP，我们可以通过使用一个IIS到Tomcat重定向插件，使IIS能够将所有的JSP请求发送到Tomcat执行，可以使IIS增加处理JSP的功能。如果你已经习惯了使用IIS，那么可以尝试这种配置。（如果您已经安装过Apache服务器，为了便于后面的操作请先卸载Apache。）
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">1、按照方案一的步骤安装Tomcat，并保证它正常运行。（例如安装到f:\tomcat4）； Webjx.Com
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">2、将下载的tc4ntiis.zip直接解压缩到f:\tomcat4目录下。查看配置所需要的文件，确保它们在以下位置：
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">f:\tomcat4\server\lib\ajp.jar
<p style="TEXT-INDENT: 2em">f:\tomcat4\server\lib\tomcat-util.jar f:\tomcat4\bin\native\isapi_redirect.dll f:\tomcat4\conf\ntiis\workers.properties f:\tomcat4\conf\ntiis\uriworkermap.properties f:\tomcat4\conf\ntiis\iis_redirect.reg
<p style="TEXT-INDENT: 2em">f:\tomcat4\log\iis_redirect.log Webjx.Com
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">3、用文本编辑器打开f:\tomcat4\conf\ntiis\workers.properties ，修改下列值为：
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">workers.tomcat_home=f:\tomcat4
<p style="TEXT-INDENT: 2em">workers.java_home=f:\j2sdk1.4.1
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">4、双击f:\tomcat4\conf\ntiis\iis_redirect.reg ，将此注册文件内的信息添加到注册表中，但是要修改log_file、worker_file 、worker_mount_file这三个键的键值，以适合你的环境（比如本文中的Tomcat就安装在f:\tomcat4，而不是默认的c:\tomcat4）。添加并修改完毕后如下图。 </p>
<p style="TEXT-INDENT: 2em">5、打开Internet服务管理器，在默认站点上添加一个新的虚拟目录，名称为jakarta，这个虚拟目录指向f:\tomcat4\bin\native ，并启动该默认站点。
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">6、在Internet服务管理器中用鼠标右键单击服务器名，选择"属性"&#8594;主属性中"WWW服务"的"编辑" &#8594;"ISAPI筛选器"选项卡，添加一个ISAPI筛选器，名字为Jakarta Redirect，可执行文件指定为f:\Tomcat4\bin\native\isapi_redirector.dll。在添加ISAPI过滤器后, Jakarta Redirect的状态是一个红色的向下的箭头，重新启动IIS服务，就会变成绿色的箭头。
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">7、编辑 server.xml 文件并保存（同方案二的第7步）。
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">8、重新启动IIS和Tomcat。
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">9、测试项目：把test.jsp放在f:\Tomcat\webapps\examples\jsp 目录下。打开浏览器，在地址栏里输入http://localhost:8080/examples/jsp/test.jsp，如果浏览器中出现"Hello World！"，则Tomcat重新配置后工作正常；在地址栏中输入http://localhost/examples/jsp/test.jsp，若与http://localhost:8080/examples/jsp/test.jsp的结果相同，那就表明IIS和Tomcat整合成功了！
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">五、结束语
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">搭建JSP的运行环境是学习JSP技术的基础，JSP引擎种类很多，配置方法也很多，而且软件的版本也在不断的升级，大家可以根据自己的需要和实际情况选择合适的配置方法。希望本文给出的几种JSP环境配置方案，对想学习JSP的人有所帮助。 </p>
</span>
<img src ="http://www.cnitblog.com/stomic/aggbug/60116.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/stomic/" target="_blank">大话人生</a> 2009-07-15 12:09 <a href="http://www.cnitblog.com/stomic/archive/2009/07/15/60116.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>（原）TD进行平台移植报错问题</title><link>http://www.cnitblog.com/stomic/archive/2009/03/11/55285.html</link><dc:creator>大话人生</dc:creator><author>大话人生</author><pubDate>Wed, 11 Mar 2009 13:07:00 GMT</pubDate><guid>http://www.cnitblog.com/stomic/archive/2009/03/11/55285.html</guid><wfw:comment>http://www.cnitblog.com/stomic/comments/55285.html</wfw:comment><comments>http://www.cnitblog.com/stomic/archive/2009/03/11/55285.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/stomic/comments/commentRss/55285.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/stomic/services/trackbacks/55285.html</trackback:ping><description><![CDATA[<meta http-equiv="Content-Type" content="text/html; charset=" utf-8="">
<meta name="ProgId" content="Word.Document">
<meta name="Generator" content="Microsoft Word 12">
<meta name="Originator" content="Microsoft Word 12">
<link rel="File-List" href="file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_filelist.xml">
<link rel="Edit-Time-Data" href="file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_editdata.mso"><!--[if !mso]>
<style>
v\:* {behavior:url(#default#VML);}
o\:* {behavior:url(#default#VML);}
w\:* {behavior:url(#default#VML);}
.shape {behavior:url(#default#VML);}
</style>
<![endif]-->
<link rel="themeData" href="file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_themedata.thmx">
<link rel="colorSchemeMapping" href="file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_colorschememapping.xml"><!--[if gte mso 9]><xml>
<w:worddocument>
<w:view>Normal</w:view>
<w:zoom>0</w:zoom>
<w:trackmoves>false</w:trackmoves>
<w:trackformatting/>
<w:punctuationkerning/>
<w:drawinggridverticalspacing>7.8 磅</w:drawinggridverticalspacing>
<w:displayhorizontaldrawinggridevery>0</w:displayhorizontaldrawinggridevery>
<w:displayverticaldrawinggridevery>2</w:displayverticaldrawinggridevery>
<w:validateagainstschemas/>
<w:saveifxmlinvalid>false</w:saveifxmlinvalid>
<w:ignoremixedcontent>false</w:ignoremixedcontent>
<w:alwaysshowplaceholdertext>false</w:alwaysshowplaceholdertext>
<w:donotpromoteqf/>
<w:lidthemeother>EN-US</w:lidthemeother>
<w:lidthemeasian>ZH-CN</w:lidthemeasian>
<w:lidthemecomplexscript>X-NONE</w:lidthemecomplexscript>
<w:compatibility>
<w:spaceforul/>
<w:balancesinglebytedoublebytewidth/>
<w:donotleavebackslashalone/>
<w:ultrailspace/>
<w:donotexpandshiftreturn/>
<w:adjustlineheightintable/>
<w:breakwrappedtables/>
<w:snaptogridincell/>
<w:wraptextwithpunct/>
<w:useasianbreakrules/>
<w:dontgrowautofit/>
<w:splitpgbreakandparamark/>
<w:dontvertaligncellwithsp/>
<w:dontbreakconstrainedforcedtables/>
<w:dontvertalignintxbx/>
<w:word11kerningpairs/>
<w:cachedcolbalance/>
<w:usefelayout/>
</w:compatibility>
<m:mathpr>
<m:mathfont m:val="Cambria Math"/>
<m:brkbin m:val="before"/>
<m:brkbinsub m:val="&#45;-"/>
<m:smallfrac m:val="off"/>
<m:dispdef/>
<m:lmargin m:val="0"/>
<m:rmargin m:val="0"/>
<m:defjc m:val="centerGroup"/>
<m:wrapindent m:val="1440"/>
<m:intlim m:val="subSup"/>
<m:narylim m:val="undOvr"/>
</m:mathpr></w:worddocument>
</xml><![endif]--><!--[if gte mso 9]><xml>
<w:latentstyles deflockedstate="false" defunhidewhenused="true"
DefSemiHidden="true" defqformat="false" defpriority="99"
LatentStyleCount="267">
<w:lsdexception locked="false" priority="0" semihidden="false"
UnhideWhenUsed="false" qformat="true" name="Normal"/>
<w:lsdexception locked="false" priority="9" semihidden="false"
UnhideWhenUsed="false" qformat="true" name="heading 1"/>
<w:lsdexception locked="false" priority="9" qformat="true" name="heading 2"/>
<w:lsdexception locked="false" priority="9" qformat="true" name="heading 3"/>
<w:lsdexception locked="false" priority="9" qformat="true" name="heading 4"/>
<w:lsdexception locked="false" priority="9" qformat="true" name="heading 5"/>
<w:lsdexception locked="false" priority="9" qformat="true" name="heading 6"/>
<w:lsdexception locked="false" priority="9" qformat="true" name="heading 7"/>
<w:lsdexception locked="false" priority="9" qformat="true" name="heading 8"/>
<w:lsdexception locked="false" priority="9" qformat="true" name="heading 9"/>
<w:lsdexception locked="false" priority="39" name="toc 1"/>
<w:lsdexception locked="false" priority="39" name="toc 2"/>
<w:lsdexception locked="false" priority="39" name="toc 3"/>
<w:lsdexception locked="false" priority="39" name="toc 4"/>
<w:lsdexception locked="false" priority="39" name="toc 5"/>
<w:lsdexception locked="false" priority="39" name="toc 6"/>
<w:lsdexception locked="false" priority="39" name="toc 7"/>
<w:lsdexception locked="false" priority="39" name="toc 8"/>
<w:lsdexception locked="false" priority="39" name="toc 9"/>
<w:lsdexception locked="false" priority="35" qformat="true" name="caption"/>
<w:lsdexception locked="false" priority="10" semihidden="false"
UnhideWhenUsed="false" qformat="true" name="Title"/>
<w:lsdexception locked="false" priority="1" name="Default Paragraph Font"/>
<w:lsdexception locked="false" priority="11" semihidden="false"
UnhideWhenUsed="false" qformat="true" name="Subtitle"/>
<w:lsdexception locked="false" priority="22" semihidden="false"
UnhideWhenUsed="false" qformat="true" name="Strong"/>
<w:lsdexception locked="false" priority="20" semihidden="false"
UnhideWhenUsed="false" qformat="true" name="Emphasis"/>
<w:lsdexception locked="false" priority="59" semihidden="false"
UnhideWhenUsed="false" name="Table Grid"/>
<w:lsdexception locked="false" unhidewhenused="false" name="Placeholder Text"/>
<w:lsdexception locked="false" priority="1" semihidden="false"
UnhideWhenUsed="false" qformat="true" name="No Spacing"/>
<w:lsdexception locked="false" priority="60" semihidden="false"
UnhideWhenUsed="false" name="Light Shading"/>
<w:lsdexception locked="false" priority="61" semihidden="false"
UnhideWhenUsed="false" name="Light List"/>
<w:lsdexception locked="false" priority="62" semihidden="false"
UnhideWhenUsed="false" name="Light Grid"/>
<w:lsdexception locked="false" priority="63" semihidden="false"
UnhideWhenUsed="false" name="Medium Shading 1"/>
<w:lsdexception locked="false" priority="64" semihidden="false"
UnhideWhenUsed="false" name="Medium Shading 2"/>
<w:lsdexception locked="false" priority="65" semihidden="false"
UnhideWhenUsed="false" name="Medium List 1"/>
<w:lsdexception locked="false" priority="66" semihidden="false"
UnhideWhenUsed="false" name="Medium List 2"/>
<w:lsdexception locked="false" priority="67" semihidden="false"
UnhideWhenUsed="false" name="Medium Grid 1"/>
<w:lsdexception locked="false" priority="68" semihidden="false"
UnhideWhenUsed="false" name="Medium Grid 2"/>
<w:lsdexception locked="false" priority="69" semihidden="false"
UnhideWhenUsed="false" name="Medium Grid 3"/>
<w:lsdexception locked="false" priority="70" semihidden="false"
UnhideWhenUsed="false" name="Dark List"/>
<w:lsdexception locked="false" priority="71" semihidden="false"
UnhideWhenUsed="false" name="Colorful Shading"/>
<w:lsdexception locked="false" priority="72" semihidden="false"
UnhideWhenUsed="false" name="Colorful List"/>
<w:lsdexception locked="false" priority="73" semihidden="false"
UnhideWhenUsed="false" name="Colorful Grid"/>
<w:lsdexception locked="false" priority="60" semihidden="false"
UnhideWhenUsed="false" name="Light Shading Accent 1"/>
<w:lsdexception locked="false" priority="61" semihidden="false"
UnhideWhenUsed="false" name="Light List Accent 1"/>
<w:lsdexception locked="false" priority="62" semihidden="false"
UnhideWhenUsed="false" name="Light Grid Accent 1"/>
<w:lsdexception locked="false" priority="63" semihidden="false"
UnhideWhenUsed="false" name="Medium Shading 1 Accent 1"/>
<w:lsdexception locked="false" priority="64" semihidden="false"
UnhideWhenUsed="false" name="Medium Shading 2 Accent 1"/>
<w:lsdexception locked="false" priority="65" semihidden="false"
UnhideWhenUsed="false" name="Medium List 1 Accent 1"/>
<w:lsdexception locked="false" unhidewhenused="false" name="Revision"/>
<w:lsdexception locked="false" priority="34" semihidden="false"
UnhideWhenUsed="false" qformat="true" name="List Paragraph"/>
<w:lsdexception locked="false" priority="29" semihidden="false"
UnhideWhenUsed="false" qformat="true" name="Quote"/>
<w:lsdexception locked="false" priority="30" semihidden="false"
UnhideWhenUsed="false" qformat="true" name="Intense Quote"/>
<w:lsdexception locked="false" priority="66" semihidden="false"
UnhideWhenUsed="false" name="Medium List 2 Accent 1"/>
<w:lsdexception locked="false" priority="67" semihidden="false"
UnhideWhenUsed="false" name="Medium Grid 1 Accent 1"/>
<w:lsdexception locked="false" priority="68" semihidden="false"
UnhideWhenUsed="false" name="Medium Grid 2 Accent 1"/>
<w:lsdexception locked="false" priority="69" semihidden="false"
UnhideWhenUsed="false" name="Medium Grid 3 Accent 1"/>
<w:lsdexception locked="false" priority="70" semihidden="false"
UnhideWhenUsed="false" name="Dark List Accent 1"/>
<w:lsdexception locked="false" priority="71" semihidden="false"
UnhideWhenUsed="false" name="Colorful Shading Accent 1"/>
<w:lsdexception locked="false" priority="72" semihidden="false"
UnhideWhenUsed="false" name="Colorful List Accent 1"/>
<w:lsdexception locked="false" priority="73" semihidden="false"
UnhideWhenUsed="false" name="Colorful Grid Accent 1"/>
<w:lsdexception locked="false" priority="60" semihidden="false"
UnhideWhenUsed="false" name="Light Shading Accent 2"/>
<w:lsdexception locked="false" priority="61" semihidden="false"
UnhideWhenUsed="false" name="Light List Accent 2"/>
<w:lsdexception locked="false" priority="62" semihidden="false"
UnhideWhenUsed="false" name="Light Grid Accent 2"/>
<w:lsdexception locked="false" priority="63" semihidden="false"
UnhideWhenUsed="false" name="Medium Shading 1 Accent 2"/>
<w:lsdexception locked="false" priority="64" semihidden="false"
UnhideWhenUsed="false" name="Medium Shading 2 Accent 2"/>
<w:lsdexception locked="false" priority="65" semihidden="false"
UnhideWhenUsed="false" name="Medium List 1 Accent 2"/>
<w:lsdexception locked="false" priority="66" semihidden="false"
UnhideWhenUsed="false" name="Medium List 2 Accent 2"/>
<w:lsdexception locked="false" priority="67" semihidden="false"
UnhideWhenUsed="false" name="Medium Grid 1 Accent 2"/>
<w:lsdexception locked="false" priority="68" semihidden="false"
UnhideWhenUsed="false" name="Medium Grid 2 Accent 2"/>
<w:lsdexception locked="false" priority="69" semihidden="false"
UnhideWhenUsed="false" name="Medium Grid 3 Accent 2"/>
<w:lsdexception locked="false" priority="70" semihidden="false"
UnhideWhenUsed="false" name="Dark List Accent 2"/>
<w:lsdexception locked="false" priority="71" semihidden="false"
UnhideWhenUsed="false" name="Colorful Shading Accent 2"/>
<w:lsdexception locked="false" priority="72" semihidden="false"
UnhideWhenUsed="false" name="Colorful List Accent 2"/>
<w:lsdexception locked="false" priority="73" semihidden="false"
UnhideWhenUsed="false" name="Colorful Grid Accent 2"/>
<w:lsdexception locked="false" priority="60" semihidden="false"
UnhideWhenUsed="false" name="Light Shading Accent 3"/>
<w:lsdexception locked="false" priority="61" semihidden="false"
UnhideWhenUsed="false" name="Light List Accent 3"/>
<w:lsdexception locked="false" priority="62" semihidden="false"
UnhideWhenUsed="false" name="Light Grid Accent 3"/>
<w:lsdexception locked="false" priority="63" semihidden="false"
UnhideWhenUsed="false" name="Medium Shading 1 Accent 3"/>
<w:lsdexception locked="false" priority="64" semihidden="false"
UnhideWhenUsed="false" name="Medium Shading 2 Accent 3"/>
<w:lsdexception locked="false" priority="65" semihidden="false"
UnhideWhenUsed="false" name="Medium List 1 Accent 3"/>
<w:lsdexception locked="false" priority="66" semihidden="false"
UnhideWhenUsed="false" name="Medium List 2 Accent 3"/>
<w:lsdexception locked="false" priority="67" semihidden="false"
UnhideWhenUsed="false" name="Medium Grid 1 Accent 3"/>
<w:lsdexception locked="false" priority="68" semihidden="false"
UnhideWhenUsed="false" name="Medium Grid 2 Accent 3"/>
<w:lsdexception locked="false" priority="69" semihidden="false"
UnhideWhenUsed="false" name="Medium Grid 3 Accent 3"/>
<w:lsdexception locked="false" priority="70" semihidden="false"
UnhideWhenUsed="false" name="Dark List Accent 3"/>
<w:lsdexception locked="false" priority="71" semihidden="false"
UnhideWhenUsed="false" name="Colorful Shading Accent 3"/>
<w:lsdexception locked="false" priority="72" semihidden="false"
UnhideWhenUsed="false" name="Colorful List Accent 3"/>
<w:lsdexception locked="false" priority="73" semihidden="false"
UnhideWhenUsed="false" name="Colorful Grid Accent 3"/>
<w:lsdexception locked="false" priority="60" semihidden="false"
UnhideWhenUsed="false" name="Light Shading Accent 4"/>
<w:lsdexception locked="false" priority="61" semihidden="false"
UnhideWhenUsed="false" name="Light List Accent 4"/>
<w:lsdexception locked="false" priority="62" semihidden="false"
UnhideWhenUsed="false" name="Light Grid Accent 4"/>
<w:lsdexception locked="false" priority="63" semihidden="false"
UnhideWhenUsed="false" name="Medium Shading 1 Accent 4"/>
<w:lsdexception locked="false" priority="64" semihidden="false"
UnhideWhenUsed="false" name="Medium Shading 2 Accent 4"/>
<w:lsdexception locked="false" priority="65" semihidden="false"
UnhideWhenUsed="false" name="Medium List 1 Accent 4"/>
<w:lsdexception locked="false" priority="66" semihidden="false"
UnhideWhenUsed="false" name="Medium List 2 Accent 4"/>
<w:lsdexception locked="false" priority="67" semihidden="false"
UnhideWhenUsed="false" name="Medium Grid 1 Accent 4"/>
<w:lsdexception locked="false" priority="68" semihidden="false"
UnhideWhenUsed="false" name="Medium Grid 2 Accent 4"/>
<w:lsdexception locked="false" priority="69" semihidden="false"
UnhideWhenUsed="false" name="Medium Grid 3 Accent 4"/>
<w:lsdexception locked="false" priority="70" semihidden="false"
UnhideWhenUsed="false" name="Dark List Accent 4"/>
<w:lsdexception locked="false" priority="71" semihidden="false"
UnhideWhenUsed="false" name="Colorful Shading Accent 4"/>
<w:lsdexception locked="false" priority="72" semihidden="false"
UnhideWhenUsed="false" name="Colorful List Accent 4"/>
<w:lsdexception locked="false" priority="73" semihidden="false"
UnhideWhenUsed="false" name="Colorful Grid Accent 4"/>
<w:lsdexception locked="false" priority="60" semihidden="false"
UnhideWhenUsed="false" name="Light Shading Accent 5"/>
<w:lsdexception locked="false" priority="61" semihidden="false"
UnhideWhenUsed="false" name="Light List Accent 5"/>
<w:lsdexception locked="false" priority="62" semihidden="false"
UnhideWhenUsed="false" name="Light Grid Accent 5"/>
<w:lsdexception locked="false" priority="63" semihidden="false"
UnhideWhenUsed="false" name="Medium Shading 1 Accent 5"/>
<w:lsdexception locked="false" priority="64" semihidden="false"
UnhideWhenUsed="false" name="Medium Shading 2 Accent 5"/>
<w:lsdexception locked="false" priority="65" semihidden="false"
UnhideWhenUsed="false" name="Medium List 1 Accent 5"/>
<w:lsdexception locked="false" priority="66" semihidden="false"
UnhideWhenUsed="false" name="Medium List 2 Accent 5"/>
<w:lsdexception locked="false" priority="67" semihidden="false"
UnhideWhenUsed="false" name="Medium Grid 1 Accent 5"/>
<w:lsdexception locked="false" priority="68" semihidden="false"
UnhideWhenUsed="false" name="Medium Grid 2 Accent 5"/>
<w:lsdexception locked="false" priority="69" semihidden="false"
UnhideWhenUsed="false" name="Medium Grid 3 Accent 5"/>
<w:lsdexception locked="false" priority="70" semihidden="false"
UnhideWhenUsed="false" name="Dark List Accent 5"/>
<w:lsdexception locked="false" priority="71" semihidden="false"
UnhideWhenUsed="false" name="Colorful Shading Accent 5"/>
<w:lsdexception locked="false" priority="72" semihidden="false"
UnhideWhenUsed="false" name="Colorful List Accent 5"/>
<w:lsdexception locked="false" priority="73" semihidden="false"
UnhideWhenUsed="false" name="Colorful Grid Accent 5"/>
<w:lsdexception locked="false" priority="60" semihidden="false"
UnhideWhenUsed="false" name="Light Shading Accent 6"/>
<w:lsdexception locked="false" priority="61" semihidden="false"
UnhideWhenUsed="false" name="Light List Accent 6"/>
<w:lsdexception locked="false" priority="62" semihidden="false"
UnhideWhenUsed="false" name="Light Grid Accent 6"/>
<w:lsdexception locked="false" priority="63" semihidden="false"
UnhideWhenUsed="false" name="Medium Shading 1 Accent 6"/>
<w:lsdexception locked="false" priority="64" semihidden="false"
UnhideWhenUsed="false" name="Medium Shading 2 Accent 6"/>
<w:lsdexception locked="false" priority="65" semihidden="false"
UnhideWhenUsed="false" name="Medium List 1 Accent 6"/>
<w:lsdexception locked="false" priority="66" semihidden="false"
UnhideWhenUsed="false" name="Medium List 2 Accent 6"/>
<w:lsdexception locked="false" priority="67" semihidden="false"
UnhideWhenUsed="false" name="Medium Grid 1 Accent 6"/>
<w:lsdexception locked="false" priority="68" semihidden="false"
UnhideWhenUsed="false" name="Medium Grid 2 Accent 6"/>
<w:lsdexception locked="false" priority="69" semihidden="false"
UnhideWhenUsed="false" name="Medium Grid 3 Accent 6"/>
<w:lsdexception locked="false" priority="70" semihidden="false"
UnhideWhenUsed="false" name="Dark List Accent 6"/>
<w:lsdexception locked="false" priority="71" semihidden="false"
UnhideWhenUsed="false" name="Colorful Shading Accent 6"/>
<w:lsdexception locked="false" priority="72" semihidden="false"
UnhideWhenUsed="false" name="Colorful List Accent 6"/>
<w:lsdexception locked="false" priority="73" semihidden="false"
UnhideWhenUsed="false" name="Colorful Grid Accent 6"/>
<w:lsdexception locked="false" priority="19" semihidden="false"
UnhideWhenUsed="false" qformat="true" name="Subtle Emphasis"/>
<w:lsdexception locked="false" priority="21" semihidden="false"
UnhideWhenUsed="false" qformat="true" name="Intense Emphasis"/>
<w:lsdexception locked="false" priority="31" semihidden="false"
UnhideWhenUsed="false" qformat="true" name="Subtle Reference"/>
<w:lsdexception locked="false" priority="32" semihidden="false"
UnhideWhenUsed="false" qformat="true" name="Intense Reference"/>
<w:lsdexception locked="false" priority="33" semihidden="false"
UnhideWhenUsed="false" qformat="true" name="Book Title"/>
<w:lsdexception locked="false" priority="37" name="Bibliography"/>
<w:lsdexception locked="false" priority="39" qformat="true" name="TOC Heading"/>
</w:latentstyles>
</xml><![endif]--><style>
<!--
/* Font Definitions */
@font-face
{font-family:宋体;
panose-1:2 1 6 0 3 1 1 1 1 1;
mso-font-alt:SimSun;
mso-font-charset:134;
mso-generic-font-family:auto;
mso-font-pitch:variable;
mso-font-signature:3 135135232 16 0 262145 0;}
@font-face
{font-family:"Cambria Math";
panose-1:2 4 5 3 5 4 6 3 2 4;
mso-font-charset:0;
mso-generic-font-family:roman;
mso-font-pitch:variable;
mso-font-signature:-1610611985 1107304683 0 0 159 0;}
@font-face
{font-family:Calibri;
panose-1:2 15 5 2 2 2 4 3 2 4;
mso-font-charset:0;
mso-generic-font-family:swiss;
mso-font-pitch:variable;
mso-font-signature:-1610611985 1073750139 0 0 159 0;}
@font-face
{font-family:"\@宋体";
panose-1:2 1 6 0 3 1 1 1 1 1;
mso-font-charset:134;
mso-generic-font-family:auto;
mso-font-pitch:variable;
mso-font-signature:3 135135232 16 0 262145 0;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{mso-style-unhide:no;
mso-style-qformat:yes;
mso-style-parent:"";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
mso-pagination:none;
font-size:10.5pt;
mso-bidi-font-size:11.0pt;
font-family:"Calibri","sans-serif";
mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;
mso-fareast-font-family:宋体;
mso-fareast-theme-font:minor-fareast;
mso-hansi-font-family:Calibri;
mso-hansi-theme-font:minor-latin;
mso-bidi-font-family:"Times New Roman";
mso-bidi-theme-font:minor-bidi;
mso-font-kerning:1.0pt;}
.MsoChpDefault
{mso-style-type:export-only;
mso-default-props:yes;
mso-bidi-font-family:"Times New Roman";
mso-bidi-theme-font:minor-bidi;}
/* Page Definitions */
@page
{mso-page-border-surround-header:no;
mso-page-border-surround-footer:no;}
@page Section1
{size:595.3pt 841.9pt;
margin:72.0pt 90.0pt 72.0pt 90.0pt;
mso-header-margin:42.55pt;
mso-footer-margin:49.6pt;
mso-paper-source:0;
layout-grid:15.6pt;}
div.Section1
{page:Section1;}
-->
</style><!--[if gte mso 10]>
<style>
/* Style Definitions */
table.MsoNormalTable
{mso-style-name:普通表格;
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-priority:99;
mso-style-qformat:yes;
mso-style-parent:"";
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
mso-para-margin:0cm;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:10.5pt;
mso-bidi-font-size:11.0pt;
font-family:"Calibri","sans-serif";
mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;
mso-hansi-font-family:Calibri;
mso-hansi-theme-font:minor-latin;
mso-font-kerning:1.0pt;}
</style>
<![endif]-->
<p class="MsoNormal"><span style="font-family: 宋体;">问题：</span></p>
<p class="MsoNormal"><span lang="EN-US">WINXP+ACCESS</span><span style="font-family: 宋体;">平台进行</span><span lang="EN-US">TD</span><span style="font-family: 宋体;">移植到</span><span lang="EN-US">WIN2003+ACCESS</span><span style="font-family: 宋体;">平台。报告的错误分别为：</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">新增</span><span lang="EN-US">bug</span><span style="font-family: 宋体;">时报错为</span><span lang="EN-US">:failed to add new bug;<br>
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;
&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;Details:&nbsp;&nbsp;Failed to add new bug.<br>
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;
&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;Cannot get sequence value<br>
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;
&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;CSequence :: Get_Next_Sequence<br>
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;
&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;CBug :: AddBug<br>
</span><span style="font-family: 宋体;">修改</span><span lang="EN-US">bug</span><span style="font-family: 宋体;">时报错为</span><span lang="EN-US">:CDBLock::OBjLock-unable to insert new lock<br>
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;
&nbsp;&nbsp; &nbsp;&nbsp; &nbsp; Details:&nbsp; &nbsp;CDBLock::ObjLock - unable
to insert new lock<br>
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;
&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;CDBLock::ObjLock - unable to insert new lock<br>
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;
&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;CDBLock:<span>:D</span>BLOCK</span><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">解决：</span><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">此问题为</span><span lang="EN-US">TD</span><span style="font-family: 宋体;">进行平台移植过后的权限问题。会发现在</span><span lang="EN-US">WIN2003</span><span style="font-family: 宋体;">系统</span><span lang="EN-US">NTF</span><span style="font-family: 宋体;">格式下，站点目录</span><span lang="EN-US">TD_Dir</span><span style="font-family: 宋体;">只有只读权限，无法对项目中进行写操作。因此需要将</span><span lang="EN-US">ACCESS</span><span style="font-family: 宋体;">数据库目录读写权限打开就能解决此问题了。</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">在此将</span><span lang="EN-US">ACCESS</span><span style="font-family: 宋体;">权限读写打开图解记录如下：</span></p>
<p class="MsoNormal"><span lang="EN-US">win2000</span><span style="font-family: 宋体;">和</span><span lang="EN-US">win2003</span><span style="font-family: 宋体;">的用户也可以参考这个步骤（前几步不需要）。</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">一、如果动力系统的数据库所在的分区为</span><span lang="EN-US">NTFS</span><span style="font-family: 宋体;">分区，则进入后台或其他一些操作时会提示出错：数据库只读。</span><span lang="EN-US">&nbsp;&nbsp;FAT32</span><span style="font-family: 宋体;">分区无些问题。</span><span lang="EN-US"><br>
<a href="http://www.7dn.cn/Article/UploadFiles/200409/20040902230917889.jpg" title="&quot;新窗口打开&quot; t " onfocus="this.blur()"><span style="color: blue; text-decoration: none;"><!--[if gte vml 1]><v:shapetype
id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t"
path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f">
<v:stroke joinstyle="miter"/>
<v:formulas>
<v:f eqn="if lineDrawn pixelLineWidth 0"/>
<v:f eqn="sum @0 1 0"/>
<v:f eqn="sum 0 0 @1"/>
<v:f eqn="prod @2 1 2"/>
<v:f eqn="prod @3 21600 pixelWidth"/>
<v:f eqn="prod @3 21600 pixelHeight"/>
<v:f eqn="sum @0 0 1"/>
<v:f eqn="prod @6 1 2"/>
<v:f eqn="prod @7 21600 pixelWidth"/>
<v:f eqn="sum @8 21600 0"/>
<v:f eqn="prod @7 21600 pixelHeight"/>
<v:f eqn="sum @10 21600 0"/>
</v:formulas>
<v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"/>
<o:lock v:ext="edit" aspectratio="t"/>
</v:shapetype><v:shape id="图片_x0020_4" o:spid="_x0000_i1034" type="#_x0000_t75"
alt="http://www.7dn.cn/Article/UploadFiles/200409/20040902230917889.jpg"
href="http://www.7dn.cn/Article/UploadFiles/200409/20040902230917889.jpg"
target="&quot;_blank&quot;" title="&quot;新窗口打开&quot;" style="'width:284.25pt;
height:337.5pt;visibility:visible;mso-wrap-style:square'" o:button="t">
<v:imagedata src="file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtmlclip1\01\clip_image001.jpg"
o:title="20040902230917889"/>
</v:shape><![endif]--><!--[if !vml]--><span></span></span></a></span><a  href="http://www.7dn.cn/Article/UploadFiles/200409/20040902230917889.jpg" title="新窗口打开" onfocus="this.blur()" target="_blank"><img  src="http://www.7dn.cn/Article/UploadFiles/200409/20040902230917889.jpg" onmousewheel="return bbimg(this)" onload="javascript:if(this.width>screen.width-500)this.style.width=screen.width-500;" border="0"></a><span lang="EN-US"><a href="http://www.7dn.cn/Article/UploadFiles/200409/20040902230917889.jpg" title="&quot;新窗口打开&quot; t " onfocus="this.blur()"><span style="color: blue; text-decoration: none;"><span></span><!--[endif]--></span></a><br>
</span><span style="font-family: 宋体;">二、请进入文件管理器的文件夹选项</span><span lang="EN-US"><br>
<a href="http://www.7dn.cn/Article/UploadFiles/200409/20040902230918506.jpg" title="&quot;新窗口打开&quot; t " onfocus="this.blur()"><span style="color: blue; text-decoration: none;"><!--[if gte vml 1]><v:shape
id="图片_x0020_5" o:spid="_x0000_i1033" type="#_x0000_t75" alt="http://www.7dn.cn/Article/UploadFiles/200409/20040902230918506.jpg"
href="http://www.7dn.cn/Article/UploadFiles/200409/20040902230918506.jpg"
target="&quot;_blank&quot;" title="&quot;新窗口打开&quot;" style="'width:465pt;
height:341.25pt;visibility:visible;mso-wrap-style:square'" o:button="t">
<v:imagedata src="file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtmlclip1\01\clip_image002.jpg"
o:title="20040902230918506"/>
</v:shape><![endif]--><!--[if !vml]--><span></span></span></a></span><a  href="http://www.7dn.cn/Article/UploadFiles/200409/20040902230918506.jpg" title="新窗口打开" onfocus="this.blur()" target="_blank"><img  src="http://www.7dn.cn/Article/UploadFiles/200409/20040902230918506.jpg" onmousewheel="return bbimg(this)" style="width: 524px;" onload="javascript:if(this.width>screen.width-500)this.style.width=screen.width-500;" border="0"></a><span style="font-family: 宋体;"><br></span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">三、将</span><span lang="EN-US">&#8220;</span><span style="font-family: 宋体;">使用简单文件共享</span><span lang="EN-US">&#8221;</span><span style="font-family: 宋体;">前的勾选去掉</span><span lang="EN-US"><br>
<a href="http://www.7dn.cn/Article/UploadFiles/200409/20040902230920141.jpg" title="&quot;新窗口打开&quot; t " onfocus="this.blur()"><span style="color: blue; text-decoration: none;"><!--[if gte vml 1]><v:shape
id="图片_x0020_6" o:spid="_x0000_i1032" type="#_x0000_t75" alt="http://www.7dn.cn/Article/UploadFiles/200409/20040902230920141.jpg"
href="http://www.7dn.cn/Article/UploadFiles/200409/20040902230920141.jpg"
target="&quot;_blank&quot;" title="&quot;新窗口打开&quot;" style="'width:289.5pt;
height:352.5pt;visibility:visible;mso-wrap-style:square'" o:button="t">
<v:imagedata src="file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtmlclip1\01\clip_image003.jpg"
o:title="20040902230920141"/>
</v:shape><![endif]--><!--[if !vml]--><span></span></span></a></span><a  href="http://www.7dn.cn/Article/UploadFiles/200409/20040902230920141.jpg" title="新窗口打开" onfocus="this.blur()" target="_blank"><img  src="http://www.7dn.cn/Article/UploadFiles/200409/20040902230920141.jpg" onmousewheel="return bbimg(this)" onload="javascript:if(this.width>screen.width-500)this.style.width=screen.width-500;" border="0"></a><span lang="EN-US"><a href="http://www.7dn.cn/Article/UploadFiles/200409/20040902230920141.jpg" title="&quot;新窗口打开&quot; t " onfocus="this.blur()"><span style="color: blue; text-decoration: none;"><span></span><!--[endif]--></span></a><br>
</span><span style="font-family: 宋体;">四、右键点击数据库目录－共享和安全</span><span lang="EN-US"><br>
<a href="http://www.7dn.cn/Article/UploadFiles/200409/20040902230921764.jpg" title="&quot;新窗口打开&quot; t " onfocus="this.blur()"><span style="color: blue; text-decoration: none;"><!--[if gte vml 1]><v:shape
id="图片_x0020_7" o:spid="_x0000_i1031" type="#_x0000_t75" alt="http://www.7dn.cn/Article/UploadFiles/200409/20040902230921764.jpg"
href="http://www.7dn.cn/Article/UploadFiles/200409/20040902230921764.jpg"
target="&quot;_blank&quot;" title="&quot;新窗口打开&quot;" style="'width:465pt;
height:341.25pt;visibility:visible;mso-wrap-style:square'" o:button="t">
<v:imagedata src="file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtmlclip1\01\clip_image004.jpg"
o:title="20040902230921764"/>
</v:shape><![endif]--><!--[if !vml]--><span></span></span></a></span><a  href="http://www.7dn.cn/Article/UploadFiles/200409/20040902230921764.jpg" title="新窗口打开" onfocus="this.blur()" target="_blank"><img  src="http://www.7dn.cn/Article/UploadFiles/200409/20040902230921764.jpg" onmousewheel="return bbimg(this)" style="width: 524px;" onload="javascript:if(this.width>screen.width-500)this.style.width=screen.width-500;" border="0"></a><span style="font-family: 宋体;"><br></span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">五、添加组和用户名称</span><span lang="EN-US"><br>
<a href="http://www.7dn.cn/Article/UploadFiles/200409/20040902230921982.jpg" title="&quot;新窗口打开&quot; t " onfocus="this.blur()"><span style="color: blue; text-decoration: none;"><!--[if gte vml 1]><v:shape
id="图片_x0020_8" o:spid="_x0000_i1030" type="#_x0000_t75" alt="http://www.7dn.cn/Article/UploadFiles/200409/20040902230921982.jpg"
href="http://www.7dn.cn/Article/UploadFiles/200409/20040902230921982.jpg"
target="&quot;_blank&quot;" title="&quot;新窗口打开&quot;" style="'width:284.25pt;
height:337.5pt;visibility:visible;mso-wrap-style:square'" o:button="t">
<v:imagedata src="file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtmlclip1\01\clip_image005.jpg"
o:title="20040902230921982"/>
</v:shape><![endif]--><!--[if !vml]--><span></span></span></a></span><a  href="http://www.7dn.cn/Article/UploadFiles/200409/20040902230921982.jpg" title="新窗口打开" onfocus="this.blur()" target="_blank"><img  src="http://www.7dn.cn/Article/UploadFiles/200409/20040902230921982.jpg" onmousewheel="return bbimg(this)" onload="javascript:if(this.width>screen.width-500)this.style.width=screen.width-500;" border="0"></a><span lang="EN-US"><a href="http://www.7dn.cn/Article/UploadFiles/200409/20040902230921982.jpg" title="&quot;新窗口打开&quot; t " onfocus="this.blur()"><span style="color: blue; text-decoration: none;"><span></span><!--[endif]--></span></a><br>
</span><span style="font-family: 宋体;">六、点击高级选项</span><span lang="EN-US"><br>
<a href="http://www.7dn.cn/Article/UploadFiles/200409/20040902230922228.jpg" title="&quot;新窗口打开&quot; t " onfocus="this.blur()"><span style="color: blue; text-decoration: none;"><!--[if gte vml 1]><v:shape
id="图片_x0020_9" o:spid="_x0000_i1029" type="#_x0000_t75" alt="http://www.7dn.cn/Article/UploadFiles/200409/20040902230922228.jpg"
href="http://www.7dn.cn/Article/UploadFiles/200409/20040902230922228.jpg"
target="&quot;_blank&quot;" title="&quot;新窗口打开&quot;" style="'width:348pt;
height:190.5pt;visibility:visible;mso-wrap-style:square'" o:button="t">
<v:imagedata src="file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtmlclip1\01\clip_image006.jpg"
o:title="20040902230922228"/>
</v:shape><![endif]--><!--[if !vml]--><span></span></span></a></span><a  href="http://www.7dn.cn/Article/UploadFiles/200409/20040902230922228.jpg" title="新窗口打开" onfocus="this.blur()" target="_blank"><img  src="http://www.7dn.cn/Article/UploadFiles/200409/20040902230922228.jpg" onmousewheel="return bbimg(this)" onload="javascript:if(this.width>screen.width-500)this.style.width=screen.width-500;" border="0"></a><span lang="EN-US"><a href="http://www.7dn.cn/Article/UploadFiles/200409/20040902230922228.jpg" title="&quot;新窗口打开&quot; t " onfocus="this.blur()"><span style="color: blue; text-decoration: none;"><span></span><!--[endif]--></span></a><br>
</span><span style="font-family: 宋体;">七、查找用户或组</span><span lang="EN-US"><br>
<a href="http://www.7dn.cn/Article/UploadFiles/200409/20040902230922543.jpg" title="&quot;新窗口打开&quot; t " onfocus="this.blur()"><span style="color: blue; text-decoration: none;"><!--[if gte vml 1]><v:shape
id="图片_x0020_10" o:spid="_x0000_i1028" type="#_x0000_t75" alt="http://www.7dn.cn/Article/UploadFiles/200409/20040902230922543.jpg"
href="http://www.7dn.cn/Article/UploadFiles/200409/20040902230922543.jpg"
target="&quot;_blank&quot;" title="&quot;新窗口打开&quot;" style="'width:390.75pt;
height:439.5pt;visibility:visible;mso-wrap-style:square'" o:button="t">
<v:imagedata src="file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtmlclip1\01\clip_image007.jpg"
o:title="20040902230922543"/>
</v:shape><![endif]--><!--[if !vml]--><span></span></span></a></span><a  href="http://www.7dn.cn/Article/UploadFiles/200409/20040902230922543.jpg" title="新窗口打开" onfocus="this.blur()" target="_blank"><img  src="http://www.7dn.cn/Article/UploadFiles/200409/20040902230922543.jpg" onmousewheel="return bbimg(this)" onload="javascript:if(this.width>screen.width-500)this.style.width=screen.width-500;" border="0"></a><span lang="EN-US"><a href="http://www.7dn.cn/Article/UploadFiles/200409/20040902230922543.jpg" title="&quot;新窗口打开&quot; t " onfocus="this.blur()"><span style="color: blue; text-decoration: none;"><span></span><!--[endif]--></span></a><br>
</span><span style="font-family: 宋体;">八、选择</span><span lang="EN-US">IUSR_*** </span><span style="font-family: 宋体;">（</span><span lang="EN-US">***</span><span style="font-family: 宋体;">为你的机器的名称）</span><span lang="EN-US"><br>
<a href="http://www.7dn.cn/Article/UploadFiles/200409/20040902230922979.jpg" title="&quot;新窗口打开&quot; t " onfocus="this.blur()"><span style="color: blue; text-decoration: none;"><!--[if gte vml 1]><v:shape
id="图片_x0020_11" o:spid="_x0000_i1027" type="#_x0000_t75" alt="http://www.7dn.cn/Article/UploadFiles/200409/20040902230922979.jpg"
href="http://www.7dn.cn/Article/UploadFiles/200409/20040902230922979.jpg"
target="&quot;_blank&quot;" title="&quot;新窗口打开&quot;" style="'width:390.75pt;
height:439.5pt;visibility:visible;mso-wrap-style:square'" o:button="t">
<v:imagedata src="file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtmlclip1\01\clip_image008.jpg"
o:title="20040902230922979"/>
</v:shape><![endif]--><!--[if !vml]--><span></span></span></a></span><a  href="http://www.7dn.cn/Article/UploadFiles/200409/20040902230922979.jpg" title="新窗口打开" onfocus="this.blur()" target="_blank"><img  src="http://www.7dn.cn/Article/UploadFiles/200409/20040902230922979.jpg" onmousewheel="return bbimg(this)" onload="javascript:if(this.width>screen.width-500)this.style.width=screen.width-500;" border="0"></a><span lang="EN-US"><a href="http://www.7dn.cn/Article/UploadFiles/200409/20040902230922979.jpg" title="&quot;新窗口打开&quot; t " onfocus="this.blur()"><span style="color: blue; text-decoration: none;"><span></span><!--[endif]--></span></a><br>
</span><span style="font-family: 宋体;">九、点击确定</span><span lang="EN-US"><br>
<a href="http://www.7dn.cn/Article/UploadFiles/200409/20040902230923435.jpg" title="&quot;新窗口打开&quot; t " onfocus="this.blur()"><span style="color: blue; text-decoration: none;"><!--[if gte vml 1]><v:shape
id="图片_x0020_12" o:spid="_x0000_i1026" type="#_x0000_t75" alt="http://www.7dn.cn/Article/UploadFiles/200409/20040902230923435.jpg"
href="http://www.7dn.cn/Article/UploadFiles/200409/20040902230923435.jpg"
target="&quot;_blank&quot;" title="&quot;新窗口打开&quot;" style="'width:348pt;
height:190.5pt;visibility:visible;mso-wrap-style:square'" o:button="t">
<v:imagedata src="file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtmlclip1\01\clip_image009.jpg"
o:title="20040902230923435"/>
</v:shape><![endif]--><!--[if !vml]--><span></span></span></a></span><a  href="http://www.7dn.cn/Article/UploadFiles/200409/20040902230923435.jpg" title="新窗口打开" onfocus="this.blur()" target="_blank"><img  src="http://www.7dn.cn/Article/UploadFiles/200409/20040902230923435.jpg" onmousewheel="return bbimg(this)" onload="javascript:if(this.width>screen.width-500)this.style.width=screen.width-500;" border="0"></a><span lang="EN-US"><a href="http://www.7dn.cn/Article/UploadFiles/200409/20040902230923435.jpg" title="&quot;新窗口打开&quot; t " onfocus="this.blur()"><span style="color: blue; text-decoration: none;"><span></span><!--[endif]--></span></a><br>
</span><span style="font-family: 宋体;">十、勾选数据库目录对于</span><span lang="EN-US">IUSR_***</span><span style="font-family: 宋体;">的读写权限</span><span lang="EN-US"><br>
<a href="http://www.7dn.cn/Article/UploadFiles/200409/20040902230923461.jpg" title="&quot;新窗口打开&quot; t " onfocus="this.blur()"><span style="color: blue; text-decoration: none;"><!--[if gte vml 1]><v:shape
id="图片_x0020_13" o:spid="_x0000_i1025" type="#_x0000_t75" alt="http://www.7dn.cn/Article/UploadFiles/200409/20040902230923461.jpg"
href="http://www.7dn.cn/Article/UploadFiles/200409/20040902230923461.jpg"
target="&quot;_blank&quot;" title="&quot;新窗口打开&quot;" style="'width:284.25pt;
height:337.5pt;visibility:visible;mso-wrap-style:square'" o:button="t">
<v:imagedata src="file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtmlclip1\01\clip_image010.jpg"
o:title="20040902230923461"/>
</v:shape><![endif]--><!--[if !vml]--><span></span></span></a></span><a  href="http://www.7dn.cn/Article/UploadFiles/200409/20040902230923461.jpg" title="新窗口打开" onfocus="this.blur()" target="_blank"><img  src="http://www.7dn.cn/Article/UploadFiles/200409/20040902230923461.jpg" onmousewheel="return bbimg(this)" onload="javascript:if(this.width>screen.width-500)this.style.width=screen.width-500;" border="0"></a></p><img src ="http://www.cnitblog.com/stomic/aggbug/55285.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/stomic/" target="_blank">大话人生</a> 2009-03-11 21:07 <a href="http://www.cnitblog.com/stomic/archive/2009/03/11/55285.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>TD的备份与还原</title><link>http://www.cnitblog.com/stomic/archive/2009/03/02/55043.html</link><dc:creator>大话人生</dc:creator><author>大话人生</author><pubDate>Mon, 02 Mar 2009 12:48:00 GMT</pubDate><guid>http://www.cnitblog.com/stomic/archive/2009/03/02/55043.html</guid><wfw:comment>http://www.cnitblog.com/stomic/comments/55043.html</wfw:comment><comments>http://www.cnitblog.com/stomic/archive/2009/03/02/55043.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/stomic/comments/commentRss/55043.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/stomic/services/trackbacks/55043.html</trackback:ping><description><![CDATA[<p>【摘要】TestDirector, （以下简称TD）它是<a onclick="javascript:tagshow(event, 'Mercury');" href="javascript:;" target=_self><u><strong><font color=#000066>Mercury</font></strong></u></a> Interactive 公司推出的基于WEB浏览器环境下的<a onclick="javascript:tagshow(event, '%B2%E2%CA%D4');" href="javascript:;" target=_self><u><strong><font color=#000066>测试</font></strong></u></a>管理工具。通过TD的流程控制可以规范软件企业的测试流程、改善测试质量、减轻测试人员的负担、提高<a onclick="javascript:tagshow(event, '%B9%A4%D7%F7');" href="javascript:;" target=_self><u><strong><font color=#000066>工作</font></strong></u></a>效率。在接触TD过程中仍然存在着很多未知领域等待着我们这些从事<a onclick="javascript:tagshow(event, '%C8%ED%BC%FE%B2%E2%CA%D4');" href="javascript:;" target=_self><u><strong><font color=#000066>软件测试</font></strong></u></a>工作的同行去研究去拓展，如何更有效的使用TD提高我们的测试管理，将是我们继续研究关注的方向。本文总结了我们在移植TD项目方面的一些经验和技巧，希望对大家有所帮助。</p>
<p>【关键词】项目移植集成工作环境分布式工作环境</p>
<p>这里我们先将以上的几个名词解释一下：</p>
<p><span>项目移植：这里说的项目移植是指将已经建立的TD项目整体文件在保证<strong class=g style="FONT-WEIGHT: normal; CURSOR: hand; COLOR: #0000ff; TEXT-DECORATION: underline">数据安全</strong><span><span>和完整的前提下移植到<a onclick="javascript:tagshow(event, '%C6%E4%CB%FB');" href="javascript:;" target=_self><u><strong><font color=#000066>其他</font></strong></u></a><strong style="FONT-WEIGHT: normal; CURSOR: hand; COLOR: #0000ff; TEXT-DECORATION: underline">服务器</strong>的过程，这个过程包括以下几个方面（1）</span><strong class=g style="FONT-WEIGHT: normal; CURSOR: hand; COLOR: #0000ff; TEXT-DECORATION: underline">数据</strong>库的移植（2）项目文件的移植（3）项目配置文件的移植。经过移植后的TD项目可以实现双机备份的功能。</span></span></p>
<p><span>集成工作环境：我们把TD服务程序和TD 使用的<strong style="FONT-WEIGHT: normal; CURSOR: hand; COLOR: #0000ff; TEXT-DECORATION: underline"><a onclick="javascript:tagshow(event, '%CA%FD%BE%DD%BF%E2');" href="javascript:;" target=_self><u><strong><font color=#000066>数据库</font></strong></u></a></strong>存放在同一台计算机上的这种工作环境称为集成工作环境。这种工作环境节省成本，维护较复杂，不利于数据的安全性。</span></p>
<p>分布式工作环境：我们把TD服务器程序和TD后台使用的数据库存放在不同机器上，也就是使用单独的一台计算机作为TD项目的数据库服务器，TD服务程序通过网络访问数据库服务器，这种工作环境称为分步式工作环境。这种环境的成本较高，但是利用维护，数据的安全性较高。对一些专业性的企业尤其是需要将TD开放到Internet上，我们建议使用这种工作环境。</p>
<p><a><strong><span class=style3><font color=#11779f><u>。</u></font></span></strong></a><strong>移植说明</strong></p>
<p>基于IIS WEB服务下的TD服务程序支持的数据库有ACCESS,SQL SERVER、SYBASE、ORACLE。由于ACCESS数据库的迁移比较容易本文就不介绍，本文主要讨论<a onclick="javascript:tagshow(event, 'SQL');" href="javascript:;" target=_self><u><strong><font color=#000066>SQL</font></strong></u></a> SERVER数据库的移植。掌握SQL SERVER数据库类型的TD项目移植，对ORACLE、SYBASE类型数据库的项目移植工作也能做到触类旁通。下面大家就跟我们一切进入TD项目移植的具体工作吧！</p>
<p>下面的移植工作，我们选用了一个名为：E-CIS的项目进行实例移植，同时我们将其他计算机上的TD项目（SAAA、SIMS、E-ICID）与E-CIS进行了合并。</p>
<p><strong>。集成工作环境的数据迁移</strong></p>
<p><a class=style3><font color=#11779f><u>1</u></font></a>、拟分析产生的原因和解决方法</p>
<p>产生的原因：</p>
<p>由于我们配置的TD服务器与数据库服务器是同一台计算机，一旦计算机发生故障，TD项目中的数据既便是备份出来也很难恢复，其主要原因是：</p>
<ul>
    <li>使用TD建立项目时，TD会在数据库中自动建立一个名为TD的用户，我们运行的E-CIS项目中所有的表都是由TD这个用户建立的，无法删除和添加这个用户。
    <li><span>在SQL查询分析器中可以看到所有相关的表都是td.*的格式，这样会造成如果SQL查询分析器是以其他用户登入，执行select * from all list出现错误。出现一定要加前缀后才能查询出来数据问题，这个就是造成<strong class=g style="FONT-WEIGHT: normal; CURSOR: hand; COLOR: #0000ff; TEXT-DECORATION: underline">恢复数据</strong>库后即使其他项目都配置正确，但TD依然不能正常使用的一个重要原因。</span>
    <li>在安装TD后会在安装盘符：\Program Files\Common Files\Mercury Interactive\Domsinfo目录下，有一个用来存放系统信息的ACCESS数据库Doms.mdb，这个数据库由TD创建，并且是经过加密的，它存放着TD所有的配置信息。这个数据库是是否能够成功恢复TD项目的一个重要因素。</li>
</ul>
<p><a class=style3><font color=#11779f><u>2</u></font></a>、移植前的备份工作</p>
<p>在正式移植之前，我们首先要做好数据的备份工作，这也是我们移植工作的一部分，虽然我们现在的移植<a onclick="javascript:tagshow(event, '%BC%BC%CA%F5');" href="javascript:;" target=_self><u><strong><font color=#000066>技术</font></strong></u></a>已经相对较成熟，但是我们还是要建议大家移植之前的备份是很有必要的。备份主要备份以下的数据：</p>
<p>．备份DomsInfo目录；</p>
<p>默认在C:\Program Files\Common Files\Mercury Interactive下。这个目录包含了Doms.mdb文件（用户信息和工程列表）、connection strings（连接字符串）、parameters（参数）、global style sheets（全局风格表）、the database template（Empty_DB.mdb）（一些临时数据）</p>
<p>．备份TD项目安装文件；</p>
<p>TD_Dir包含每个工程的自动测试、附件、设置、风格列表。默认在C:\TD_Dir\Default目录下，打开这个目录可以看到TD的工程文件，我们需要将这些工程文件备份下来。</p>
<p>．备份项目数据库；</p>
<p>备份项目用的数据库文件。</p>
<p>3、移植工作</p>
<p>移植工作分为四个部分：</p>
<p>――数据库的迁移；</p>
<p>――建立访问数据表文件的TD用户；</p>
<p>――修改TD的项目配置数据库(Access)；</p>
<p>――修改Project中的INI文件。</p>
<p><a class=style3><font color=#11779f><u>1</u></font></a>）数据库的迁移：</p>
<p>数据库的移植目的是：将项目数据库从原来的计算机移植到新的计算机。</p>
<p>具体思路：通过SQL Server 集成的导入和导出数据功能将原数据库文件导入新的SQL Server服务器中。在这个过程，原表中由TD用户创建的表也会更改为DBO用户创建。例如：数据库中的表ALL_LISTS原来由td用户创建，移植后ALL_LISTS表的用户更改为dbo这样问题也就解决了。</p>
<p>我们现在开始图解数据库的操作：</p>
　　　　　　　　　　从开始菜单中打开&#8220;导入和导出数据&#8221;如图：
<table width=616 border=0>
    <tbody>
        <tr>
            <td width=240>&nbsp;<wbr></td>
            <td width=122><img title=点击图片可在新窗口打开 style="CURSOR: pointer" height=303 src="http://www.51testing.com/emagzine/lib/NO3/6/pic1.jpg" width=389></td>
            <td width=240>&nbsp;<wbr></td>
        </tr>
    </tbody>
</table>
<p>　　　　　　　　　单击 &#8220;Next&#8221;</p>
<table width=614 border=0>
    <tbody>
        <tr>
            <td width=157>&nbsp;<wbr></td>
            <td width=283><img title=点击图片可在新窗口打开 style="CURSOR: pointer" height=304 src="http://www.51testing.com/emagzine/lib/NO3/6/pic2.jpg" width=389></td>
            <td width=160>&nbsp;<wbr></td>
        </tr>
    </tbody>
</table>
<p>　　　　　　　　　选择要恢复的数据源后单击&#8220;Next&#8221;</p>
<table width=615 border=0>
    <tbody>
        <tr>
            <td width=170>&nbsp;<wbr></td>
            <td width=263><img title=点击图片可在新窗口打开 style="CURSOR: pointer" height=306 src="http://www.51testing.com/emagzine/lib/NO3/6/pic3.jpg" width=390></td>
            <td width=168>&nbsp;<wbr></td>
        </tr>
    </tbody>
</table>
<p><span>　　　设置<strong class=g style="FONT-WEIGHT: normal; CURSOR: hand; COLOR: #0000ff; TEXT-DECORATION: underline">数据库恢复</strong>到的位置，注意：需要在数据库</span><img title=点击图片可在新窗口打开 style="CURSOR: pointer" height=22 src="http://www.51testing.com/emagzine/lib/NO3/6/pic22.jpg" width=63>这里设定数据库被恢复的名称，点击 　　　<img title=点击图片可在新窗口打开 style="CURSOR: pointer" height=24 src="http://www.51testing.com/emagzine/lib/NO3/6/pic23.jpg" width=108></p>
<table width=615 border=0>
    <tbody>
        <tr>
            <td width=170>&nbsp;<wbr></td>
            <td width=263><img title=点击图片可在新窗口打开 style="CURSOR: pointer" height=219 src="http://www.51testing.com/emagzine/lib/NO3/6/pic4.jpg" width=286></td>
            <td width=168>&nbsp;<wbr></td>
        </tr>
    </tbody>
</table>
<p>　　　　　　　　　　建立数据库名称后，单击确定后，再&#8220;Next&#8221;按钮：</p>
<table width=617 border=0>
    <tbody>
        <tr>
            <td width=106>&nbsp;<wbr></td>
            <td width=389><img title=点击图片可在新窗口打开 style="CURSOR: pointer" height=302 src="http://www.51testing.com/emagzine/lib/NO3/6/pic5.jpg" width=387></td>
            <td width=108>&nbsp;<wbr></td>
        </tr>
    </tbody>
</table>
<p>　　　　　　　　　再&#8220;Next&#8221;（这个选项选择第三项更具有完整性）</p>
<table width=617 border=0>
    <tbody>
        <tr>
            <td width=185>&nbsp;<wbr></td>
            <td width=233><img title=点击图片可在新窗口打开 style="CURSOR: pointer" height=306 src="http://www.51testing.com/emagzine/lib/NO3/6/pic6.jpg" width=389></td>
            <td width=184>&nbsp;<wbr></td>
        </tr>
    </tbody>
</table>
<p>　　　　　　　　　选择需要恢复的数据表后（在这里选择全部表），再&#8221;Next&#8221;：</p>
<table width=614 border=0>
    <tbody>
        <tr>
            <td width=116>&nbsp;<wbr></td>
            <td width=368><img title=点击图片可在新窗口打开 style="CURSOR: pointer" height=305 src="http://www.51testing.com/emagzine/lib/NO3/6/pic7.jpg" width=390></td>
            <td width=116>&nbsp;<wbr></td>
        </tr>
    </tbody>
</table>
<p>　　　　　　　　　准备开始恢复，单击&#8220;Next&#8221;：</p>
<table width=617 border=0>
    <tbody>
        <tr>
            <td width=125>&nbsp;<wbr></td>
            <td width=351><img title=点击图片可在新窗口打开 style="CURSOR: pointer" height=307 src="http://www.51testing.com/emagzine/lib/NO3/6/pic8.jpg" width=389></td>
            <td width=127>&nbsp;<wbr></td>
        </tr>
    </tbody>
</table>
<p>　　　　　　　　　单击&#8221;Finish&#8221;按钮，开始恢复：</p>
<table width=614 border=0>
    <tbody>
        <tr>
            <td width=117>&nbsp;<wbr></td>
            <td width=369><img title=点击图片可在新窗口打开 style="CURSOR: pointer" height=305 src="http://www.51testing.com/emagzine/lib/NO3/6/pic9.jpg" width=369></td>
            <td width=114>&nbsp;<wbr></td>
        </tr>
    </tbody>
</table>
<p>　　　　　　　　　　恢复成功后出现提示：</p>
<table width=614 border=0>
    <tbody>
        <tr>
            <td width=109>&nbsp;<wbr></td>
            <td width=381><img title=点击图片可在新窗口打开 style="CURSOR: pointer" height=110 src="http://www.51testing.com/emagzine/lib/NO3/6/pic10.jpg" width=381></td>
            <td width=110>&nbsp;<wbr></td>
        </tr>
    </tbody>
</table>
<p>数据库恢复完成。</p>
<p><a class=style3><font color=#11779f><u>2</u></font></a>）建立访问数据表文件的TD用户：</p>
<p>建立td用户的目的是：使td用户具有访问新恢复项目数据库的权限。</p>
<p>具体思路：建立一个名为td的用户，使这个用户具有访问TD项目数据库的控制权限，TD通过这个用户对项目数据库进行增、删、改的操作。</p>
<p>打开企业管理器，在目标数据库计算机中建立TD用户，并且设定TD用户访问的数据库。</p>
<table width=614 border=0>
    <tbody>
        <tr>
            <td width=95>&nbsp;<wbr></td>
            <td width=413><img title=点击图片可在新窗口打开 style="WIDTH: 400px; CURSOR: pointer" height=305 src="http://www.51testing.com/emagzine/lib/NO3/6/pic11.jpg" width=413></td>
            <td width=92>&nbsp;<wbr></td>
        </tr>
    </tbody>
</table>
<p>　　　　　　　　在登录项中新建用户，在弹出的对话框中设定td用户相关的属性，如：</p>
<table width=614 border=0>
    <tbody>
        <tr>
            <td width=166>&nbsp;<wbr></td>
            <td width=270><img title=点击图片可在新窗口打开 style="CURSOR: pointer" height=304 src="http://www.51testing.com/emagzine/lib/NO3/6/pic12.jpg" width=270></td>
            <td width=164>&nbsp;<wbr></td>
        </tr>
    </tbody>
</table>
<p>设定的密码可以根据用户确定，这里设定为：tdtdtd；在&#8220;服务器角色&#8221;中设定td用户的权限，我们给出建议设定为&#8220;System Administrators&#8221;：</p>
<table width=614 border=0>
    <tbody>
        <tr>
            <td width=165>&nbsp;<wbr></td>
            <td width=269><img title=点击图片可在新窗口打开 style="CURSOR: pointer" height=305 src="http://www.51testing.com/emagzine/lib/NO3/6/pic13.jpg" width=269></td>
            <td width=166>&nbsp;<wbr></td>
        </tr>
    </tbody>
</table>
<p>　　　　　　　　　　　　　　完成&#8220;服务器角色&#8221;的设定，为td用户设定数据库访问的权限：</p>
<table width=614 border=0>
    <tbody>
        <tr>
            <td width=166>&nbsp;<wbr></td>
            <td width=271><img title=点击图片可在新窗口打开 style="CURSOR: pointer" height=304 src="http://www.51testing.com/emagzine/lib/NO3/6/pic14.jpg" width=271></td>
            <td width=163>&nbsp;<wbr></td>
        </tr>
    </tbody>
</table>
<p>设定td用户能够访问TD项目的数据库和Master数据库。设定完成后，确认td用户默认数据库是否为Default_e-cis_db</p>
<p>设定完成。</p>
<p><a class=style3><font color=#11779f><u>3</u></font></a>）：修改TD的配置项目文件(Access)：</p>
<p>修改配置文件目的是：将项目文件（TDDIR目录下存在的项目文件）和项目数据库进行关联。</p>
<p>具体思路：修改ACCESS数据库中每一个配置参数，使TD项目文件和项目数据库关联，通过这个操作我们还可以实现多个TD项目合并删除的功能。（在这里我们就不详细介绍，有兴趣的朋友可以研究一下）</p>
<p>在TD安装的计算机中的C:\Program Files\Common Files\Mercury Interactive\DomsInfo目录下打开doms.mdb文件，此文件是经过加密处理的，其密码为：tdtdtd</p>
<p>打开后可以看到相应的表：</p>
<table width=614 border=0>
    <tbody>
        <tr>
            <td width=103>&nbsp;<wbr></td>
            <td width=393><img title=点击图片可在新窗口打开 style="CURSOR: pointer" height=304 src="http://www.51testing.com/emagzine/lib/NO3/6/pic15.jpg" width=393></td>
            <td width=104>&nbsp;<wbr></td>
        </tr>
    </tbody>
</table>
<p>这些表，存放着TD所有的配置信息，是很重要的，我们根据自己的工作环境实际配置这个表，其中需要修改的表是：DBSERVER、DOMAINS、PARAMS、PROJECT和TDSERVERS这五个表。</p>
a.DBSERVER表中主要修改DBSERVER_NAME（目标数据库服务器的IP如本例为１０.168.188.151）、DB_USER_PASS（用户密码如tdtdtd）、DB_ADMIN_USER（管理用户名如td）和DB_ADMIN_PASSWORD（管理用户密码如tdtdtd）字段的值，如下图：
<table width=616 border=0>
    <tbody>
        <tr>
            <td width=62>&nbsp;<wbr></td>
            <td width=483><img title=点击图片可在新窗口打开 style="WIDTH: 400px; CURSOR: pointer" height=226 src="http://www.51testing.com/emagzine/lib/NO3/6/pic16.jpg" width=483></td>
            <td width=57>&nbsp;<wbr></td>
        </tr>
    </tbody>
</table>
<p>　　　　　　b.DOMAINS表中主要修改PHYSICAL_DIRECTORY字段的值。(基本上不要修改)</p>
<table width=615 border=0>
    <tbody>
        <tr>
            <td width=58>&nbsp;<wbr></td>
            <td width=484><img title=点击图片可在新窗口打开 style="WIDTH: 400px; CURSOR: pointer" height=227 src="http://www.51testing.com/emagzine/lib/NO3/6/pic17.jpg" width=484></td>
            <td width=59>&nbsp;<wbr></td>
        </tr>
    </tbody>
</table>
<p>　　　　　c.PARAMS表中主要修改PARAM_VALUE字段的值。（基本上不要修改）</p>
<table width=614 border=0>
    <tbody>
        <tr>
            <td width=59>&nbsp;<wbr></td>
            <td width=484><img title=点击图片可在新窗口打开 style="WIDTH: 400px; CURSOR: pointer" height=254 src="http://www.51testing.com/emagzine/lib/NO3/6/pic18.jpg" width=484></td>
            <td width=57>&nbsp;<wbr></td>
        </tr>
    </tbody>
</table>
<p>d.PROJECT表中主要增加或修改一个记录就行了，其关键字段表示的意思是PROJECT_ID(项目ID号不能重复),PROJECT_NAME（项目名称）,DB_NAME（项目对应的数据库名称如本例的default_e_cis_db）,DB_TYPE(数据库类型１为ACCESS，2为SQL SERVER),PHYSICAL_DIRECTORY(TD服务器中的共享目录如本例为\\10.168.188.152\td_dir\default\e_cis、DB_USER_PASS(TD用户密码如本例为tdtdtd)、DBSERVER_NAME(数据库的IP地址)。</p>
<table width=614 border=0>
    <tbody>
        <tr>
            <td width=58>&nbsp;<wbr></td>
            <td width=484><img title=点击图片可在新窗口打开 style="WIDTH: 400px; CURSOR: pointer" height=211 src="http://www.51testing.com/emagzine/lib/NO3/6/pic19.jpg" width=484></td>
            <td width=58>&nbsp;<wbr></td>
        </tr>
    </tbody>
</table>
<p>　　　　　e.TDSERVERS中主要修改DBSERVER_NAME、TD_IP_ADDRESS</p>
<table width=616 border=0>
    <tbody>
        <tr>
            <td width=49>&nbsp;<wbr></td>
            <td width=502><img title=点击图片可在新窗口打开 style="WIDTH: 500px; CURSOR: pointer; HEIGHT: 210px" height=211 src="http://www.51testing.com/emagzine/lib/NO3/6/pic20.jpg" width=502></td>
            <td width=51>&nbsp;<wbr></td>
        </tr>
    </tbody>
</table>
<p><strong>说明：</strong>以上修改是针对移植工作修改的表，如果我们需要将分布在多台计算机上的TD项目合并移植到一台服务器上，还需要修改ACCESS数据库中的SEQUENCES表中的USER_SEQ字段的数值，这个字段是用来控制用户数量，如果数值太小TD部分用户就出现无法登录的现象。</p>
<table width=614 border=0>
    <tbody>
        <tr>
            <td width=50>&nbsp;<wbr></td>
            <td width=501><img title=点击图片可在新窗口打开 style="WIDTH: 500px; CURSOR: pointer; HEIGHT: 208px" height=209 src="http://www.51testing.com/emagzine/lib/NO3/6/pic21.jpg" width=501></td>
            <td width=49>&nbsp;<wbr></td>
        </tr>
    </tbody>
</table>
<p><strong>总结：</strong>修改的内容还需要根据自己的实际情况进行修改，我这里只列出常修改的一些字段。</p>
<p><a class=style3><font color=#11779f><u>4</u></font></a>）：修改Project中的INI文件：</p>
<p>修改INI文件目的是：ini文件保存数据库信息，TD程序信息，项目名称以及相关的内容。</p>
<p>具体思路：修改ini文件配置参数，使TD项目文件和项目数据库关联。</p>
<p>将C：\TD_Dir\Default目录下面的E-CIS项目文件，拷贝到备份的计算机中，然后修改E-CIS文件夹内的Dbid.ini文件：</p>
<p>Dbid.ini 内容：</p>
<p>[General]</p>
<p>Database_Type=MSSQL</p>
<p>Created_Date=08/11/04 15：44：39</p>
<p>Created_By=td</p>
<p>AliasName=E-CIS</p>
<p>Database Name=default_e_cis_db</p>
<p>Database Server=10.168.188.229</p>
<p>Domain Name=DEFAULT</p>
<p>SendAllQualified=Y</p>
<p>Has_VCS_DB=Y</p>
<p>主要修改的内容是：</p>
<p>Database Name=default_e_cis_db</p>
<p>Database Server=10.168.188.229</p>
<p>按照实际情况填写这些信息，就ok了。</p>
<p><strong>总结：</strong>通过以上的介绍，我们集成工作环境的移植工作就已经完成了。经过这样的移植，我们可以实现TD项目的双机备份，双机备份可以让我们的数据更安全、更有保障。</p>
<p><strong>．分布式工作环境的备份和恢复方法</strong></p>
<p>分布式工作环境的项目移植相对集成工作环境移植更简单，在这里我们不详细介绍，相信大家看过集成工作环境的移植对分布式移植不在话下了。</p>
<p>我们对分布式工作环境移植的思路：</p>
<ul>
    <li>强调首先备份项目的数据。
    <li>移植TDDir目录下的项目文件到新的服务器上。
    <li>复制DomsInfo目录到新服务器C:\Program Files\Common Files\Mercury Interactive下。
    <li>修改这个目录下Doms.mdb文件的参数。（修改的详细方法见集成工作环境的移植）</li>
</ul>
<p><strong>总结：</strong>相对集成工作环境移植来说，分布式结构移植少了数据库的移植，可以继续使用原有的数据库，在移植过程中数据库的移植是移植成功与否的关键因素之一，少了这个过程相信大家移植更为方便。</p>
<p><strong>【小结】</strong>以上我们介绍了两种结构的移植工作，经过上述修改项后，迁移数据的工作就已经成功，td服务器可以访问迁移后的数据库。通过移植工作，同时可以解决TD项目的双机相互备份的问题，保障数据的安全性。</p>
<p>再次备份TD项目，只需要将原来TD后台数据库表中的数据导入另一台计算机中的数据库中，就可以实现。</p>
<img src ="http://www.cnitblog.com/stomic/aggbug/55043.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/stomic/" target="_blank">大话人生</a> 2009-03-02 20:48 <a href="http://www.cnitblog.com/stomic/archive/2009/03/02/55043.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>VSS版本控制与源代码管理 </title><link>http://www.cnitblog.com/stomic/archive/2008/10/29/50831.html</link><dc:creator>大话人生</dc:creator><author>大话人生</author><pubDate>Tue, 28 Oct 2008 17:38:00 GMT</pubDate><guid>http://www.cnitblog.com/stomic/archive/2008/10/29/50831.html</guid><wfw:comment>http://www.cnitblog.com/stomic/comments/50831.html</wfw:comment><comments>http://www.cnitblog.com/stomic/archive/2008/10/29/50831.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/stomic/comments/commentRss/50831.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/stomic/services/trackbacks/50831.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 一、开发前的准备1.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在装有Windows 2000或者Windows XP Professional的机器上安装.Net Framework SDK、Visual Studio.Net、Visual Source Safe 6C。（如果用户操作系统是Windows .Net Server，则无须安装.Net ...&nbsp;&nbsp;<a href='http://www.cnitblog.com/stomic/archive/2008/10/29/50831.html'>阅读全文</a><img src ="http://www.cnitblog.com/stomic/aggbug/50831.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/stomic/" target="_blank">大话人生</a> 2008-10-29 01:38 <a href="http://www.cnitblog.com/stomic/archive/2008/10/29/50831.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>（转）谈谈VSS的分支合并功能</title><link>http://www.cnitblog.com/stomic/archive/2008/10/20/50417.html</link><dc:creator>大话人生</dc:creator><author>大话人生</author><pubDate>Mon, 20 Oct 2008 02:14:00 GMT</pubDate><guid>http://www.cnitblog.com/stomic/archive/2008/10/20/50417.html</guid><wfw:comment>http://www.cnitblog.com/stomic/comments/50417.html</wfw:comment><comments>http://www.cnitblog.com/stomic/archive/2008/10/20/50417.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/stomic/comments/commentRss/50417.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/stomic/services/trackbacks/50417.html</trackback:ping><description><![CDATA[<font color=#ff0000>本文出自typhoon的51Testing软件</font><a onclick="javascript:tagshow(event, '%B2%E2%CA%D4');" href="javascript:;" target=_self><u><strong><font color=#0000ff>测试</font></strong></u></a><font color=#ff0000>博客，</font><a onclick="javascript:tagshow(event, '%D7%AA%D4%D8');" href="javascript:;" target=_self><u><strong><font color=#0000ff>转载</font></strong></u></a><font color=#ff0000>请保留出处及链接：</font><a href="http://www.51testing.com/?103489" target=_blank><font color=#ff0000><u>http://www.51testing.com/?103489</u></font></a>
<p>　　很多人在应用<a onclick="javascript:tagshow(event, 'vss');" href="javascript:;" target=_self><u><strong><font color=#0000ff>vss</font></strong></u></a>的简单功能，但是对于VSS的分支合并功能，却很少应用。今天正好做了下vss的分支合并功能的测试。在此共享给大家！ </p>
<p>　　一、测试步骤：1、建立两个vss目录，QA目录和Jessie目录（假设QA为公共源代码目录，Jessie为个人<a onclick="javascript:tagshow(event, '%B9%A4%D7%F7');" href="javascript:;" target=_self><u><strong><font color=#0000ff>工作</font></strong></u></a>目录）</p>
<p>　　2、检入5种文件进QA目录： </p>
<p>　　.ini</p>
<p>　　.cpp</p>
<p>　　.h</p>
<p>　　.txt</p>
<p>　　.doc</p>
<p>　　3、然后再把五个文件托进&#8220;Jessie&#8221;目录，点击菜单上&#8220;branch...&#8221;确定后，进入分支开发状态；</p>
<p>　　4、修改&#8220;Jessie&#8221;下面的文件，将5个文件都chenck out进行修改，在最后一行新增或插入修改，然后check in；</p>
<p>　　5、进入&#8220;QA&#8221;目录下，分别选择每个文件，点击菜单上&#8220;merge branches... &#8221;，出现提出框，此时vss匹配两目录下的文件，有3种情况：</p>
<p>　　if 文件类型是Vss不支持文件 then </p>
<p>　　提示不能合并</p>
<p>　　else 进行匹配，匹配结果有两种：</p>
<p>　　a.如果同名的两处文件不存在冲突，提示确认后，即可按照&#8220;Jessie&#8221;目录下的文件更新；</p>
<p>　　b.如果同名的两处文件存在冲突，系统弹出显示框，显示文件中的每处冲突位置和内容，这是需要人干预决定。</p>
<p>　　6、合并完毕，查看各文件内容，发现测试的ini、cpp、h、txt文件都能进行分支合并，但是doc这种binary类型的文件不能进行分支合并操作。 </p>
<p>　　二、 vss分支合并操作的优缺点分析：</p>
<p>　　1、优点：分支合并操作简单，方便控制好权限，且能及时得到的工作产物；</p>
<p>　　2、缺点：分支合并操作支持的类型有限制，对binary类型的文件不支持；</p>
<p>　　多人修改同一文件的同一处，合并时，需要人工手工合并；</p>
<p><font color=#ff0000>版权声明：</font>51Testing软件测试网及相关内容提供者拥有51testing.com内容的全部版权，未经明确的书面许可，任何人或单位不得对本网站内容复制、转载或进行镜像。51testing软件测试网欢迎与业内同行进行有益的合作和交流，如果有任何有关内容方面的合作事宜，请<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#119;&#101;&#98;&#109;&#97;&#115;&#116;&#101;&#114;&#64;&#53;&#49;&#116;&#101;&#115;&#116;&#105;&#110;&#103;&#46;&#99;&#111;&#109;" target=_blank><u><font color=#0000ff>联系我们</font></u></a>。</p>
<img src ="http://www.cnitblog.com/stomic/aggbug/50417.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/stomic/" target="_blank">大话人生</a> 2008-10-20 10:14 <a href="http://www.cnitblog.com/stomic/archive/2008/10/20/50417.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何做好IT项目管理的需求管理</title><link>http://www.cnitblog.com/stomic/archive/2008/10/13/50153.html</link><dc:creator>大话人生</dc:creator><author>大话人生</author><pubDate>Mon, 13 Oct 2008 09:57:00 GMT</pubDate><guid>http://www.cnitblog.com/stomic/archive/2008/10/13/50153.html</guid><wfw:comment>http://www.cnitblog.com/stomic/comments/50153.html</wfw:comment><comments>http://www.cnitblog.com/stomic/archive/2008/10/13/50153.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnitblog.com/stomic/comments/commentRss/50153.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/stomic/services/trackbacks/50153.html</trackback:ping><description><![CDATA[&nbsp;摘要：随着IT在现代<a onclick="javascript:tagshow(event, '%C9%FA%BB%EE');" href="javascript:;" target=_self><u><strong><font color=#0000ff>生活</font></strong></u></a>起到越来越重要的作用，根据本人参与的项目管理、售前调研、系统开发的多年经验结合最新的项目管理知识，我们就<a onclick="javascript:tagshow(event, '%D0%E8%C7%F3%B9%DC%C0%ED');" href="javascript:;" target=_self><u><strong><font color=#0000ff>需求管理</font></strong></u></a>这个领域来讨论IT项目的需求管理，特别是如何建立完善的需求说明书，以及采用那些相关的需求管理模板文件来实现需求变更控制。本论文从<a onclick="javascript:tagshow(event, '%BC%BC%CA%F5');" href="javascript:;" target=_self><u><strong><font color=#0000ff>技术</font></strong></u></a>工具、模板和经验相结合的方法来讨论现代IT项目的需求管理(RM)。
<p>　　关键字：头脑风暴法、德尔菲法、要素加权法;RM：需求管理，CCB：变更控制委员会，QFD：质量功能调配，HOQ：质量屋。</p>
<p>　　约定：本文涉及到的关键字概念和采用的技术的概念都不做详细解释，里面的概念定义请查阅相关书籍，这里只讨论这些在需求管理中的使用;同时里面的案例信息也不在这里做详细交代。</p>
<p>　　引用案例：某市网上审批项目。</p>
<p>　　1　概述</p>
<p>　　我们知道现代项目管理的六要素是：时间、成本、质量、组织、范围、客户满意度，实际上，要满足这六个要素，计划一个良好的需求分析是实现这六因素的前提，如果我们在项目生命周期的某些阶段出了问题，而我们可能还不知道，这将影响整个项目周期，无论该计划如何详尽，如果需求有误和需求分析不到位，项目的控制将没有任何价值，IT软件项目中百分之四十至百分之六十的问题都是在需求分析阶段埋下的&#8220;祸根&#8221;(Leffingwell 1997)，从某种意义来讲，项目的成功基于项目的需求管理的成功。</p>
<p>　　2　需求的定义及特点</p>
<p>　　根据IEEE项目工程标准词汇表(1997)年中对需求的描述如下：业主解决问题或达到目的所需的条件或权能，和系统或系统部件要满足合同、标准、规范或<a onclick="javascript:tagshow(event, '%C6%E4%CB%FB');" href="javascript:;" target=_self><u><strong><font color=#0000ff>其他</font></strong></u></a>正式规定文档所需具有的条件或权能。在PMBOK中，项目需求就是在&#8220;项目范围&#8221;约定的。</p>
<p>　　需求最显著的特点是&#8220;随着项目而改变、随着项目而渐进明晰&#8221;，项目管理的特点是随着进展而渐进明细化，可以看出需求管理和项目管理一样，这就意味着需求在项目的整个生命周期都可能存在的，这样项目管理的过程，也必不可少需求的管理。</p>
<p>　　3　如何获取需求</p>
<p>　　获得需求的方式可以有多种多样：电话询问、现场考察、聆听用户讲解、阅读用户编制的相关文件(如招标书)，其实这些方法都是GET方式，我们可以通过以下两类技术手段来达到：GET(获取)和PUSH(引导、反馈、激发)相互结合的方式来得到我们真正的需求，而这两个过程都是必须交互进行的，一般我们可以筛选一名非常有经验(包括谈判技巧、深厚的业务和技术背景、人缘很好、勤奋努力)的人士担任需求工程师，长期在客户那里<a onclick="javascript:tagshow(event, '%B9%A4%D7%F7');" href="javascript:;" target=_self><u><strong><font color=#0000ff>工作</font></strong></u></a>，他的工作主要是界定项目的范围和需求变更管理，通过我们编制的各类模板文档来实现需求变更的控制;</p>
<p>　　一般来讲IT集成需求包含三个不同的层次-业务需求、用户需求和功能需求-也包括非功能需求:业务需求提供给客户和产品开发商的新系统的最初利益,反映了组织机构或客户对系统、产品高层次的目标要求，它们在项目视图与范围文档中予以说明;用户需求文档描述了用户使用产品必须要完成的任务，这在使用实例文档或方案脚本说明中予以说明;功能需求定义了开发人员必须实现的软件功能，使得用户能完成他们的任务，从而满足了业务需求，必须具备一定的业务背景和技术背景，能从三个不同的层次发掘客户的需求。</p>
<p>　　根据我们在某市网上审批项目中的经验，我们采用如下方法，其中每项工作都记录文档备案：如查阅了大量资料和病历资料格式、各类应急防御措施、统计分析报表、系统规划书、旧系统业务状况、历史资料、还访谈了操作员的应用感受、多次技术交流、专题讨论等多种形式的交互式讨论和分析。这样无论是业务、功能、用户详尽的期望我们都了解的比较透彻。</p>
<p>4　需求管理</p>
<p>　　获取了需求接着要作的的工作就是对需求分析、消化和评审、基线制定、需求说明书制定，这里我们主要集中在需求分析和需求说明书两方面来。</p>
<p>　　4.1需求分析</p>
<p>　　1)建立需求关联图：需求关联图是用于定义系统与系统外部实体间的界限和接口的简单模型，同时它也明确了通过接口的信息流和物质流，通过关联图，对用户需求的约定和确认以及CCB的评审都是非常关键的。</p>
<p>　　2)创建开发原型：创建用户接口原型可以在如下应用如下情况：如果开发人员或用户不能确定需求时，开发一个用户接口原型，这样使得许多概念和可能发生的事更为直观明了。用户通过评价原型将使项目参与者能更好地相互理解所要解决的问题。通过开发原形，业主和集成商都可以相互了解业务，发掘潜在的信息，避免用户需求的不必要变更。</p>
<p>　　3)分析可行性：分析需求可行性在允许的成本、性能要求下，分析每项需求实施的可行性，明确与每项需求实现相联系的风险，包括与<a onclick="javascript:tagshow(event, '%C6%E4%CB%FC');" href="javascript:;" target=_self><u><strong><font color=#0000ff>其它</font></strong></u></a>需求的冲突，对外界因素的依赖和技术障碍，这个主要用于内部评审和制定技术线路提供依据，如在什么情况下采用.NET技术,什么情况下采用J2EE技术,我们在2003年电子政务网上审批系统中充分对需求(业务、技术、用户操作人员需求、现有系统需求等)做整体提取分析来确定技术线路的选型。</p>
<p>　　4)确定需求优先级：确定需求的优先级别应用分析方法来确定使用实例、产品特性或单项需求实现的优先级别。以优先级为基础确定产品版本将包括哪些特性或哪类需求。当允许需求变更时，在特定的版本中加入每一项变更，并在那个版本计划中作出需要的变更。</p>
<p>　　5)为需求建立模型：为需求建立模型需求的图形分析模型是软件需求规格说明极好的补充说明。它们能提供不同的信息与关系以有助于找到不正确的、不一致的、遗漏的和冗余的需求。这样的模型包括数据流图、实体关系图、状态变换图、对话框图、对象类及交互作用图。</p>
<p>　　6)编写数据字典：在需求阶段，很难使团队的思路一致，建立一个合适的机制是完全必要的，这就是数据字典，数据字典是对系统用到的所有数据项和结构的定义，以确保开发人员使用统一的数据定义。在需求阶段，数据字典至少应定义客户数据项以确保客户与开发小组是使用一致的定义和术语。分析和设计工具通常包括数据字典组件。</p>
<p>　　4.2建立需求与产品质量的关系模型</p>
<p>　　需求是项目正确实施的一个前提,如果没有抓住用户的需求,那么很可能是漏洞百出，最终产品将不是一个真正的可交付物。我们知道，质量是一个客户满意度的一个主要因素，质量在项目中又有许多影响因素，这里我们着重从需求的角度出发来讨论需求与质量的关系，那么如何来从需求的角度出发建立与质量的控制呢?</p>
<p>　　我们来建立一个思路如下：客户所有的期望 需求产生 转换矩阵 产品开发 可交付物 客户满意。在这里转换矩阵就非常关键了，如何来实现需求与质量的关联呢，可以通过质量功能调配(QFD)来实现，通过QFD可以把需求(用户期望)、产品特性关联起来，这里要用到一个工具：质量屋(House of Quality)，我现在用一个案例来说明这个工具，在做某市网上审批项目中，我们从客户哪里收集和整理了许多需求：审批项目、报表要求、认证方式、工作流要求、数据范围及格式、操作界面、医药管理规范等等;我们通过建立质量屋完成了需求与如何去实现，如下图所示：</p>
<p align=center><img title=点击图片可在新窗口打开 style="CURSOR: pointer" height=208 alt=g src="http://www.51testing.com/ddimg/uploadimg/20080512/20085122386.jpg" width=290></p>
在QFD技术中以三种形式来定性地描述工程特征之间的相关影响关系，即正相关(向相同方向变化)、不相关和负相关(向相反方向变化)。对相关程度还可以进一步地细分为强相关、一般相关和弱相关几种关系，并给以标度值来表达相关程度，这样我们可以定义一些需求的强弱程度：如不确定需求、一般确定需求、强烈确定需求等，在这个HOQ中，还要用到其他技术工具，如：要素加权法等，这样做的好处是主次分明，可以把需求分析和管理做到随时间的推进客户的变更变限于固定的框架里，符合如下曲线，而不至于走向极端。<br>
<p align=center><img title=点击图片可在新窗口打开 style="CURSOR: pointer" height=172 alt=gh src="http://www.51testing.com/ddimg/uploadimg/20080512/20085121717.gif" width=320></p>
<p align=left>4.3需求说明书编写经验谈</p>
<p align=left>　　目前需求说明书有固定的格式和要求,可以从专门介绍需求说明书的相关书籍中获得,在本论文中,我着重阐述需求说明书的经验，编写优秀的是没有公式化的方法的，这需要大量的经验，要从你在过去的文档中发现的问题学习。</p>
<p align=left>　　1) 采用IT项目需求规格说明模版,要注意的是很多人拿来需求说明书模板就套用,这就有很大的风险,例如:会出现需求不全、需求范围界定不到位、需求分类不明确等因素，我们应该把需求规格说明书拿来后先罗列许多要点：约定、法律法规、需求分类、技术限制、采用的技术和工具等等全面考虑，与项目干系人特别是用户进行沟通，然后讨论，可以采用头脑风暴法和德尔菲方法来讨论，确定说明书大纲，而不能照本著书。</p>
<p align=left>　　2) 附加文档的管理，值得注意的是需求说明书并非一成不变的，我们可以通过附加文档来跟踪用户的新的需求和需求变更，这样必须建立一个配套的文档集合，随时跟踪需求，保证开发团体步进统一，一般这些文件是要考虑的：《需求(或功能)变更申请书》、《需求(或功能)变更规格书》、《需求清单一览表》等。这样做的好处是对需求时实监控，保证项目的安排，同时让用户知道变更是一件很严肃的事情，可以防止个别人提出无法界定的需求(因为现实IT项目中，很多问题是其他系统的遗留而又超出本项目技术线路可以弥补的问题等)。</p>
<p align=left>　　3) 编写需求说明书的时候，可能还会遇到一些解决不了的需求，我们也一定用专门的章节要罗列出来，防止漏项，同时也利于我们在做实施计划的时候来采取那种措施，采购其他设备、投入相关人力或其他办法。</p>
<p align=left>　　4) 需求必须要客户确认，许多项目，可能开发商为了保护自己的&#8220;利益&#8221;很多事情都没有得到客户的确认，其实在需求阶段，我们的需求是要跟客户确认的，比如数据字典、界面选型、技术线路、功能模块等，这样做的好处是防止需求把握不得当，缺少了用户必要的功能，另一个就是防止了开发商需求镀金，提供了不必要的功能。</p>
<p align=left>　　5　总结</p>
<p align=left>　　经过以上各个方面来讨论需求管理在整个项目生命期所起到的作用，结合自身的经验，和一个案例《某市网上审批系统》综合分析了需求管理的办法和用到的工具，根据自身经验提出编写需求说明书要注意的地方。</p>
<img src ="http://www.cnitblog.com/stomic/aggbug/50153.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/stomic/" target="_blank">大话人生</a> 2008-10-13 17:57 <a href="http://www.cnitblog.com/stomic/archive/2008/10/13/50153.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>（原）TD使用和安装中常见问题</title><link>http://www.cnitblog.com/stomic/archive/2008/09/28/49612.html</link><dc:creator>大话人生</dc:creator><author>大话人生</author><pubDate>Sun, 28 Sep 2008 06:26:00 GMT</pubDate><guid>http://www.cnitblog.com/stomic/archive/2008/09/28/49612.html</guid><wfw:comment>http://www.cnitblog.com/stomic/comments/49612.html</wfw:comment><comments>http://www.cnitblog.com/stomic/archive/2008/09/28/49612.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/stomic/comments/commentRss/49612.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/stomic/services/trackbacks/49612.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: TD正常安装后不能正常运行，造成浏览器运行假死的状况有可能造成的原因是由于杀毒软件阻止了TD的进程运行，需要关闭掉杀毒软件，然后再次运行TDTD中字体如何进行修改1.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 首先下载字体控件有SP4的字体控件下载地址：&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;...&nbsp;&nbsp;<a href='http://www.cnitblog.com/stomic/archive/2008/09/28/49612.html'>阅读全文</a><img src ="http://www.cnitblog.com/stomic/aggbug/49612.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/stomic/" target="_blank">大话人生</a> 2008-09-28 14:26 <a href="http://www.cnitblog.com/stomic/archive/2008/09/28/49612.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>测试技术常见的十一种问题</title><link>http://www.cnitblog.com/stomic/archive/2008/04/17/42473.html</link><dc:creator>大话人生</dc:creator><author>大话人生</author><pubDate>Thu, 17 Apr 2008 06:24:00 GMT</pubDate><guid>http://www.cnitblog.com/stomic/archive/2008/04/17/42473.html</guid><wfw:comment>http://www.cnitblog.com/stomic/comments/42473.html</wfw:comment><comments>http://www.cnitblog.com/stomic/archive/2008/04/17/42473.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/stomic/comments/commentRss/42473.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/stomic/services/trackbacks/42473.html</trackback:ping><description><![CDATA[<p>一、<a href="http://www.51testing.com/javascrīpt:;" target=_self ōnclick="javascrīpt:tagshow(event, '%B2%E2%CA%D4%BC%BC%CA%F5');"><u><strong><a href="http://www.51testing.com/javascrīpt:;" target=_self ōnclick="javascrīpt:tagshow(event, '%B2%E2%CA%D4');"><u><strong><font color=#0000ff>测试</font></strong></u></a>技术</strong></u></a>常见问题 <br>　　1、 <a href="http://www.51testing.com/javascrīpt:;" target=_self ōnclick="javascrīpt:tagshow(event, '%B5%A5%D4%AA%B2%E2%CA%D4');"><u><strong><font color=#0000ff>单元测试</font></strong></u></a>主要内容是什么？</p>
<p>　　单元测试大多数由开发人员来完成，测试人员技术背景较好或者开发系统软件时可能会安排测试人员进行单元测试，大多数进行的单元测试都是开发人员调试程序或者开发组系统联合调试的过程。讨论这个问题主要是扩充一下读者的视野。</p>
<p>　　单元测试一般包括五个方面的测试：</p>
<p>　　（1）模块接口测试：模块接口测试是单元测试的基础。只有在数据能正确流入、流出模块的前提下，<a href="http://www.51testing.com/javascrīpt:;" target=_self ōnclick="javascrīpt:tagshow(event, '%C6%E4%CB%FB');"><u><strong><font color=#0000ff>其他</font></strong></u></a>测试才有意义。模块接口测试也是集成测试的重点，这里进行的测试主要是为后面打好基础。测试接口正确与否应该考虑下列因素：</p>
<p>输入的实际参数与形式参数的个数是否相同； <br>输入的实际参数与形式参数的属性是否匹配； <br>输入的实际参数与形式参数的量纲是否一致； <br>调用其他模块时所给实际参数的个数是否与被调模块的形参个数相同； <br>调用其他模块时所给实际参数的属性是否与被调模块的形参属性匹配； <br>调用其他模块时所给实际参数的量纲是否与被调模块的形参量纲一致； <br>调用预定义函数时所用参数的个数、属性和次序是否正确； <br>是否存在与当前入口点无关的参数引用； <br>是否修改了只读型参数； <br>对全程变量的定义各模块是否一致； <br>是否把某些约束作为参数传递。 <br>　　如果模块功能包括外部输入输出，还应该考虑下列因素：</p>
<p>文件属性是否正确； <br>OPEN/CLOSE语句是否正确； <br>格式说明与输入输出语句是否匹配； <br>缓冲区大小与记录长度是否匹配； <br>文件使用前是否已经打开； <br>是否处理了文件尾； <br>是否处理了输入/输出错误； <br>输出信息中是否有文字性错误。 <br>局部数据结构测试； <br>边界条件测试； <br>模块中所有独立执行通路测试； <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; （2）局部数据结构测试：检查局部数据结构是为了保证临时存储在模块内的数据在程序执行过程中完整、正确，局部功能是整个功能运行的基础。重点是一些函数是否正确执行，内部是否运行正确。局部数据结构往往是错误的根源，应仔细设计测试用例，力求发现下面几类错误：</p>
<p>不合适或不相容的类型说明； <br>变量无初值； <br>变量初始化或省缺值有错； <br>不正确的变量名（拼错或不正确地截断）； <br>出现上溢、下溢和地址异常。 <br>　　（3）边界条件测试：边界条件测试是单元测试中最重要的一项任务。众所周知，软件经常在边界上失效，采用边界值分析技术，针对边界值及其左、右设计测试用例，很有可能发现新的错误。边界条件测试是一项基础测试，也是后面系统测试中的<a href="http://www.51testing.com/javascrīpt:;" target=_self ōnclick="javascrīpt:tagshow(event, '%B9%A6%C4%DC%B2%E2%CA%D4');"><u><strong><font color=#0000ff>功能测试</font></strong></u></a>的重点，边界测试执行的较好，可以大大提高程序健壮性。</p>
<p>　　（4）模块中所有独立路径测试：在模块中应对每一条独立执行路径进行测试，单元测试的基本任务是保证模块中每条语句至少执行一次。测试目的主要是为了发现因错误计算、不正确的比较和不适当的控制流造成的错误。具体做法就是程序员逐条调试语句。常见的错误包括：</p>
<p>误解或用错了算符优先级； <br>混合类型运算； <br>变量初值错； <br>精度不够； <br>表达式符号错。 <br>　　比较判断与控制流常常紧密相关，测试时注意下列错误： </p>
<p>不同数据类型的对象之间进行比较； <br>错误地使用逻辑运算符或优先级； <br>因计算机表示的局限性，期望理论上相等而实际上不相等的两个量相等； <br>比较运算或变量出错； <br>循环终止条件或不可能出现； <br>迭代发散时不能退出； <br>错误地修改了循环变量。 <br>　　模块的各条错误处理通路测试：程序在遇到异常情况时不应该退出，好的程序应能预见各种出错条件，并预设各种出错处理通路。如果用户不按照正常操作，程序就退出或者停止<a href="http://www.51testing.com/javascrīpt:;" target=_self ōnclick="javascrīpt:tagshow(event, '%B9%A4%D7%F7');"><u><strong><font color=#0000ff>工作</font></strong></u></a>，实际上也是一种缺陷，因此单元测试要测试各种错误处理路径。一般这种测试着重检查下列问题：</p>
<p>输出的出错信息难以理解； <br>记录的错误与实际遇到的错误不相符； <br>在程序自定义的出错处理段运行之前，系统已介入； <br>异常处理不当； <br>错误陈述中未能提供足够的定位出错信息。 <br>　　2、 如何理解强度测试？</p>
<p>　　强度测试是为了确定系统在最差工作环境的工作能力,也可能是用于验证在标准工作压力下的各种资源的最下限指标。<br>它和压力测试的目标是不同的,压力测试是在标准工作环境下,不断增加系统负荷,最终测试出该系统能力达到的最大负荷(稳定和峰值),而强度测试则是在非标准工作环境下,甚至不断人为降低系统工作环境所需要的资源,如网络带宽,系统内存,数据锁等等,以测试系统在资源不足的情况下的工作状态,通过强度测试,可以确定本系统正常工作的最差环境.</p>
<p>　　强度测试和压力测试的测试指标相近,大多都是与时间相关的指标,如并发量(吞吐量),延迟(最大\最小\平均)以及顺序指标等</p>
<p>　　强度测试需要对系统的结构熟悉,针对系统的特征设计强度测试的方法</p>
<p>　　3、 如何理解压力、负载、<a onclick="javascript:tagshow(event, '%D0%D4%C4%DC%B2%E2%CA%D4');" href="javascript:;" target=_self><u><strong><font color=#0000ff>性能测试</font></strong></u></a>测试？</p>
<p>　　性能测试是一个较大的范围，实际上性能测试本身包含了性能、强度、压力、负载等多方面的测试内容。</p>
<p>　　压力测试是对服务器的稳定性以及负载能力等方面的测试，是一种很平常的测试。增大访问系统的用户数量、或者几个用户进行大数据量操作都是压力测试。而负载测试是压力相对较大的测试，主要是测试系统在一种或者集中极限条件下的相应能力，是性能测试的重要部分。100个用户对系统进行连续半个小时的访问可以看作压力测试，那么连续访问8个小时就可以认为负载测试，1000个用户连续访问系统1个小时也可以看作是负载测试。</p>
<p>　　实际上压力测试和负载测试没有明显的区分。测试人员应该站在关注整体性能的高度上来对系统进行测试。性能测试的相关内容，读者可以参考10.2.2节。</p>
<p>　　4、 什么是系统瓶颈？</p>
<p>　　瓶颈主要是指整个软硬件构成的软件系统某一方面或者几个方面能力不能满足用户的特定业务要求，&#8220;特定&#8221;是指瓶颈会在某些条件下会出现，因为毕竟大多数系统在投入前。</p>
<p>　　严格的从技术角度讲，所有的系统都会有瓶颈，因为大多数系统的资源配置不是协调的，例如CPU使用率刚好达到100％时，内存也正好耗尽的系统不是很多见。因此我们讨论系统瓶颈要从应用的角度讨论：关键是看系统能否满足用户需求。在用户极限使用系统的情况下，系统的响应仍然正常，我们可以认为改系统没有瓶颈或者瓶颈不会影响用户工作。</p>
<p>　　因此我们测试系统瓶颈主要是实现下面两个目的：</p>
<p>发现&#8220;表面&#8221;的瓶颈。主要是模拟用户的操作，找出用户极限使用系统时的瓶颈，然后解决瓶颈，这是性能测试的基本目标。 <br>发现潜在的瓶颈并解决，保证系统的长期稳定性。主要是考虑用户在将来扩展系统或者业务发生变化时，系统能够适应变化。满足用户目前需求的系统不是最好的，我们设计系统的目标是在保证系统整个软件生命周期能够不断适应用户的变化，或者通过简单扩展系统就可以适应新的变化。 <br>5、 文档测试主要包含什么内容？</p>
<p>　　在国内软件开发管理中，文档管理几乎是最弱的一项，因而在测试工作中特别容易忽略文档测试也就不足为奇了。要想给用户提供完整的产品，文档测试是必不可少的。文档测试一般注重下面几个方面：</p>
<p>　　文档的完整性：主要是测试文档内容的全面性与完整性，从总体上把握文档的质量。例如用户手册应该包括软件的所有功能模块。</p>
<p>　　描述与软件实际情况的一致性：主要测试软件文档与软件实际的一致程度。例如用户手册基本完整后，我们还要注意用户手册与实际功能描述是否一致。因为文档往往跟不上软件版本的更新速度。</p>
<p>　　易理解性：主要是检查文档对关键、重要的操作有无图文说明，文字、图表是否易于理解。对于关键、重要的操作仅仅只有文字说明肯定是不够的，应该附有图表使说明更为直观和明了。</p>
<p>　　文档中提供操作的实例：这项检查内容主要针对用户手册。对主要功能和关键操作提供的应用实例是否丰富，提供的实例描述是否详细。只有简单的图文说明，而无实例的用户手册看起来就像是软件界面的简单拷贝，对于用户来说，实际上没有什么帮助。</p>
<p>　　印刷与包装质量：主要是检查软件文档的商品化程度。有些用户手册是简单打印、装订而成，过于粗糙，不易于用户保存。优秀的文档例如用户手册和技术白皮书，应提供商品化包装，并且印刷精美。<br></p>
<p>6、 功能测试用例需要详细到什么程度才是合格的？</p>
<p>　　这个问题也是测试工程师经常问的问题。有人主张测试用例详细到每个步骤执行什么都要写出来，目的是即使一个不了解系统的新手都可以按照测试用例来执行工作。主张这类写法的人还可以举出例子：欧美、日本等软件外包文档都是这样做的。</p>
<p>　　另外一种观点就是主张写的粗些，类似于编写测试大纲。主张这种观点的人是因为软件开发<a onclick="javascript:tagshow(event, '%D0%E8%C7%F3%B9%DC%C0%ED');" href="javascript:;" target=_self><u><strong><font color=#0000ff>需求管理</font></strong></u></a>不规范，变动十分频繁，因而不能按照欧美的高标准来编写测试用例。这样的测试用例容易维护，可以让测试执行人员有更大的发挥空间。</p>
<p>　　实际上，<a onclick="javascript:tagshow(event, '%C8%ED%BC%FE%B2%E2%CA%D4');" href="javascript:;" target=_self><u><strong><font color=#0000ff>软件测试</font></strong></u></a>用例的详细程度首先要以覆盖到测试点为基本要求。举个例子：&#8220;用户登陆系统&#8221;的测试用例可以不写出具体的执行数据，但是至少要写出五种以上情况（），如果只用一句话覆盖了这个功能是不合格的测试用例。覆盖功能点不是指列出功能点，而是要写出功能点的各个方面（如果组合情况较多时可以采用等价划分）。</p>
<p>　　另一个影响测试用例的就是组织的开发能力和测试对象特点。如果开发力量比较落后，编写较详细的测试用例是不现实的，因为根本没有那么大的资源投入，当然这种情况很随着团队的发展而逐渐有所改善。测试对象特点重点是指测试对象在进度、成本等方面的要求，如果进度较紧张的情况下，是根本没有时间写出高质量的测试用例的，甚至有些时候测试工作只是一种辅助工作，因而不编写测试用例。</p>
<p>　　因此，测试用例的编写要根据测试对象特点、团队的执行能力等各个方面综合起来决定编写策略。最后要注意的是测试人员一定不能抱怨，力争在不断提高测试用例编写水平的同时，不断地提高自身能力。</p>
<p>　　7、 配置和兼容性测试的区别是什么？</p>
<p>　　配置测试的目的是保证软件在其相关的硬件上能够正常运行，而兼容性测试主要是测试软件能否与不同的软件正确协作。</p>
<p>　　配置测试的核心内容就是使用各种硬件来测试软件的运行情况，一般包括：</p>
<p>　　（1） 软件在不同的主机上的运行情况，例如Dell和Apple；</p>
<p>　　（2） 软件在不同的组件上的运行情况，例如开发的拨号程序要测试在不同厂商生产的Modem上的运行情况；</p>
<p>　　（3） 不同的外设；</p>
<p>　　（4） 不同的接口；</p>
<p>　　（5） 不同的可选项，例如不同的内存大小；</p>
<p>　　兼容性测试的核心内容：</p>
<p>　　（1） 测试软件是否能在不同的<a onclick="javascript:tagshow(event, '%B2%D9%D7%F7%CF%B5%CD%B3');" href="javascript:;" target=_self><u><strong><font color=#0000ff>操作系统</font></strong></u></a>平台上兼容；</p>
<p>　　（2） 测试软件是否能在同一操作系统平台的不同版本上兼容；</p>
<p>　　（3） 软件本身能否向前或者向后兼容；</p>
<p>　　（4） 测试软件能否与<a onclick="javascript:tagshow(event, '%C6%E4%CB%FC');" href="javascript:;" target=_self><u><strong><font color=#0000ff>其它</font></strong></u></a>相关的软件兼容；</p>
<p>　　（5） 数据兼容性测试，主要是指数据能否共享；</p>
<p>　　配置和兼容性测试通称对开发系统类软件比较重要，例如驱动程序、操作系统、<a onclick="javascript:tagshow(event, '%CA%FD%BE%DD%BF%E2');" href="javascript:;" target=_self><u><strong><font color=#0000ff>数据库</font></strong></u></a>管理系统等。具体进行时仍然按照测试用例来执行。<br></p>
<p>8、 软件文档测试主要包含什么？</p>
<p>　　随着软件文档系统日益庞大，文档测试已经成为软件测试的重要内容。文档测试对象主要如下：</p>
<p>包装文字和图形； <br>市场宣传材料、广告以及其它插页； <br>授权、注册登记表； <br>最终用户许可协议； <br>安装和设置向导； <br>用户手册； <br>联机帮助； <br>样例、示范例子和模板； <br>&#8230; &#8230; <br>　　文档测试的目的是提高易用性和可靠性，降低支持费用，因为用户通过文档就可以自己解决问题。因此文档测试的检查内容主要如下：</p>
<p>读者对象——主要是文档的内容是否能让该级别的读者理解； <br>术语——主要是检查术语是否适合读者； <br>内容和主题——检查主题是否合适、是否丢失、格式是否规范等； <br>图标和屏幕抓图——检查图表的准确度和精确度； <br>样例和示例——是否与软件功能一致； <br>拼写和语法； <br>文档的关联性——是否与其它相关文档的内容一致，例如与广告信息是否一致； <br>　　文档测试是相当重要的一项测试工作，不但要给予充分的重视，更要要认真的完成，象做功能测试一样来对待文档测试。</p>
<p>　　9、 没有产品说明书和需求文档地情况下能够进行<a onclick="javascript:tagshow(event, '%BA%DA%BA%D0%B2%E2%CA%D4');" href="javascript:;" target=_self><u><strong><font color=#0000ff>黑盒测试</font></strong></u></a>吗？</p>
<p>　　这个问题是国内测试工程师经常遇到的问题，根源就是国内软件开发文档管理不规范，对变更的管理方法就更不合理了。实际上没有任何文档的时候，测试人员是能够进行黑盒测试的，这种测试方式我们可以称之为探索测试，具体做法就是测试工程师根据自己的专业技能、领域知识等不断的深入了解测试对象、理解软件功能，进而发现缺陷。</p>
<p>　　在这种做法基本上把软件当成了产品说明书，测试过程中要和开发人员不断的进行交流。尤其在作项目的时候，进度压力比较大，可以作为加急测试方案。最大的风险是不知道有些特性是否被遗漏。</p>
<p>　　10、测试中的&#8220;杀虫剂怪事&#8221;是指什么？</p>
<p>　　&#8220;杀虫剂怪事&#8221;一词由Boris Beizer在其编著的《软件<a onclick="javascript:tagshow(event, '%B2%E2%CA%D4%BC%BC%CA%F5');" href="javascript:;" target=_self><u><strong><font color=#0000ff>测试技术</font></strong></u></a>》第二版中提出。用于描述测试人员对同一测试对象进行的测试次数越多，发现的缺陷就会越来越少的现象。就像老用一种农药，害虫就会有免疫力，农药发挥不了效力。这种现象的根本原因就是测试人员对测试软件过于熟悉，形成思维定势。</p>
<p>　　为了克服这种现象，测试人员需要不断编写新的测试程序或者测试用例，对程序的不同部分进行测试，以发现更多的缺陷。也可以引用新人来测试软件，刚刚进来的新手往往能发现一些意想不到的问题。</p>
<p>　　11、在配置测试中，如何判断发现的缺陷是普通问题还是特定的配置问题？</p>
<p>　　在进行配置测试时，测试工程师仍然会发现一些普通的缺陷，也就是与配置环境无关的缺陷。因此判断新发现的问题，需要在不同的配置中重新执行发现软件缺陷的步骤，如果软件缺陷不出现了，就可能是配置缺陷；如果在所有的配置中都出现，就可能是普通缺陷。<br></p>
<p>需要注意的是，配置问题可以在一大类配置中出现。例如，拨号程序可能在所有的外置Modem中都存在问题，而内置的Modem不会有任何问题。</p>
<p>　　二、其它常见问题</p>
<p>　　1、 为什么尽量不要让时间有富裕的员工去做一些测试？</p>
<p>　　表面上看这体现了管理的效率和灵活性，但实际上也体现了管理者对测试的轻视。测试和测试的人有很大关系。测试工作人员应该是勤奋并富有耐心，善于<a onclick="javascript:tagshow(event, '%D1%A7%CF%B0');" href="javascript:;" target=_self><u><strong><font color=#0000ff>学习</font></strong></u></a>、思考和发现问题，细心有条理，总结问题，如果具备这样的优点，做其它工作同样也会很出色，因此这里还有一个要求，就是要喜欢测试这项工作。如果他是专职的，那么肯定更有经验和信心。国内的小伙子好象都喜欢做程序员，两者工作性质不同，待遇不同，地位不同，对自我实现的价值的认识也不同，这是行业的一个需要改善的问题。如果只是为了完成任务而完成任务，或者发现了几个问题就觉得满意了，这在任何其它工作中都是不行的。</p>
<p>　　2、 完全测试程序是可能的吗？</p>
<p>　　软件测试初学者可能认为拿到软件后需要进行完全测试，找到全部的软件缺陷，使软件&#8220;零缺陷&#8221;发布。实际上完全测试是不可能的。主要有以下一个原因：</p>
<p>完全测试比较耗时，时间上不允许； <br>完全测试通常意味着较多资源投入，这在现实中往往是行不通的； <br>输入量太大，不能一一进行测试； <br>输出结果太多，只能分类进行验证； <br>软件实现途径太多； <br>软件产品说明书没有客观标准，从不同的角度看，软件缺陷的标准不同； <br>　　因此测试的程度要根据实际情况确定。</p>
<p>　　3、 软件测试的风险主要体现在哪里？</p>
<p>　　我们没有对软件进行完全测试，实际就是选择了风险，因为缺陷极有可能存在没有进行测试的部分。举个例子，程序员为了方便，在调试程序时会弹出一些提示信息框，而这些提示只在某种条件下会弹出，碰巧程序发布前这些代码中的一些没有被注释掉。在测试时测试工程师又没有对其进行测试。如果客户碰到它，这将是代价昂贵的缺陷，因为交付后才被客户发现。</p>
<p>　　因此，我们要尽可能的选择最合适的测试量，把风险降低到最小。</p>
<p>　　4、 发现的缺陷越多，说明软件缺陷越多吗？</p>
<p>　　这是一个比较常见的现象。测试工程师在没有找到缺陷前会绞尽脑汁的思考，但是找到一个后，会接二连三的发现很多缺陷，颇有个人成就感。其中的原因主要如下：</p>
<p>代码复用、拷贝代码导致程序员容易犯相同的错误。类的继承导致所有的子类会包含基类的错误，反复拷贝同一代码意味可能也复制了缺陷。 <br>程序员比较劳累是可以导致某些连续编写的功能缺陷较多。程序员加班是一种司空见惯的现象，因此体力不只时容易编写一些缺陷较多的程序。而这些连续潜伏缺陷恰恰时测试工程师大显身手的地方。 <br>　　&#8220;缺陷一个连着一个&#8221;不是一个客观规律，只是一个常见的现象。如果软件编写的比较好，这种现象就不常见了。测试人员只要严肃认真的测试程序就可以了。</p>
<p>　　5、 所有的软件缺陷都能修复吗？所有的软件缺陷都要修复吗？</p>
<p>　　从技术上讲，所有的软件缺陷都是能够修复的，但是没有必要修复所有的软件缺陷。测试人员要做的是能够正确判断什么时候不能追求软件的完美。对于整个项目团队，要做的是对每一个软件缺陷进行取舍，根据风险决定那些缺陷要修复。发生这种现象的主要原因如下：<br>没有足够的时间资源。在任何一个项目中，通常情况下开发人员和测试人员都是不够用的，而且在项目中没有预算足够的回归测试时间，再加上修改缺陷可能引入新的缺陷，因此在交付期限的强大压力下，必须放弃某些缺陷的修改。&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 有些缺陷只是特殊情况下出现，这种缺陷处于商业利益考虑，可以在以后升级中进行修复。&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 不是缺陷的缺陷。我们经常会碰到某些功能方面的问题被当成缺陷来处理，这类问题可以以后有时间时考虑再处理。 <br>　　最后要说的是，缺陷是否修改要由软件测试人员、项目经理、程序员共同讨论来决定是否修复，不同角色的人员从不同的角度来思考，以做出正确的决定。</p>
<p>　　6、 软件测试人员就是QA吗？</p>
<p>　　软件测试人员的职责是尽可能早的找出软件缺陷，确保得以修复。而质量保证人员（QA）主要职责是创建或者制定标准和方法，提高促进软件开发能力和减少软件缺陷。测试人员的主要工作是测试，质量保证人员日常工作重要内容是检查与评审，测试工作也是测试保证人员的工作对象。</p>
<p>　　软件测试和质量是相辅相成的关系，都是为了提高软件质量而工作。</p>
<p>　　7、 如何减少测试人员跳槽带来的损失？</p>
<p>　　在IT行业里跳槽已经是一种司空见惯的现象，而且跳槽无论给公司还是给个人都会带来一定的损失。测试队伍也无疑会面临跳槽的威胁，作为测试经理管理者，只有从日常工作中开始做起，最能最大限度的减少损失。建议我们从以下两个方面做起：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 加强部门内员工之间的互相学习，互相学习是建立学习型组织的基本要求，是知识互相转移的过程。在此基础上，可以把个人拥有的技术以知识的形式沉积下来，也就完成了隐性知识到显性知识的转化。&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 通常情况下，企业能为员工提供足够大的发展空间时，如果不是待遇特别低，员工都不会主动离开企业。因此我们要想留住员工，管理者就应该把员工的个人成长和企业的发展联系起来，为员工设定合理发展规划并付诸实现。不过这项要求做起来比较，要有比较好的企业文化为依托。 <br>　　8、 测试产品与测试项目的区别是什么？</p>
<p>　　习惯上把开发完成后进行商业化、几乎不进行代码修改就可以售给用户使用的软件成为软件产品，也就是可以买&#8220;卖拷贝&#8221;的软件，例如<a onclick="javascript:tagshow(event, 'Windows');" href="javascript:;" target=_self><u><strong><font color=#0000ff>Windows</font></strong></u></a> 2000。而通常把针对一个或者几个特定的用户而开发的软件成为软件项目，软件项目是一种个性化的产品，可以是按照用户要求全部重新开发，也可以修改已有的软件产品来满足特定的用户需求。项目和产品的不同特点，决定我们测试产品和测试项目仍然会有很多不同的地方：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 质量要求不同。通常产品的质量要高一些，修复发布后产品的缺陷成本较高，甚至会带来很多负面的影响。而做项目通常面向某一用户，虽然质量越高越好，但是一般只要满足用户要求就可以了。&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 测试资源投入多少不同。做软件产品通常是研发中心来开发，进度压力要小些。同时由于质量要求高，因此会投入较多的人力、物力资源。&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 项目最后要和用户共同验收测试，这是产品测试不具有的特点。 <br>　　此外，测试产品与测试项目在<a onclick="javascript:tagshow(event, '%C8%B1%CF%DD%B9%DC%C0%ED');" href="javascript:;" target=_self><u><strong><font color=#0000ff>缺陷管理</font></strong></u></a>方面、测试策略制定都会有很大不同，测试管理者应该结合具体的环境，恰如其分的完成工作。</p>
<p>　　9、 和用户共同测试（UAT测试）的注意点有哪些？</p>
<p>　　软件产品在投产前，通常都会进行用户验收测试。如果用户验收测试没有通过，直接结果就是那不到&#8220;Money&#8221;，间接影响是损害了公司的形象，而后者的影响往往更严重。根据作者的经验，用户验收测试一定要让用户满意。</p>
<p>　　实际上用户现场测试更趋于是一种演示。在不欺骗用户的前提下，我们向用户展示我们软件的优点，最后让&#8220;上帝&#8221;满意并欣然掏出&#8220;银子&#8221;才是我们的目标。因此用户测试要注意下面的事项：</p>
<p>　　（1）用户现场测试不可能测试全部功能，因此要测试核心功能。这需要提前做好准备，这些核心功能一定要预先经过测试，证明没有问题才可以和用户共同进行测试。测试核心模块的目的是建立用户对软件的信心。当然如果这些模块如果问题较多，不应该进行演示。<br></p>
<p>（2）如果某些模块确实有问题，我们可以演示其它重要的业务功能模块，必要时要向</p>
<p>　　用户做成合理的解释。争得时间后，及时修改缺陷来弥补。</p>
<p>　　（3）永远不能欺骗用户，蒙混过关。道理很简单，因为软件是要给用户用的，问题早晚会暴露出来，除非你可以马上修改。</p>
<p>　　和用户进行测试还要注意各种交流技巧，争取不但短期利益得到了满足，还要为后面得合作打好基础。</p>
<p>　　10、如何编写提交给用户的测试报告？</p>
<p>　　随着测试工作越来越受重视，开发团队向客户提供测试文档是不可避免的事情。很多人会问：&#8220;我们可以把工作中的测试报告提供给客户吗？&#8221;答案是否定的。因为提供内部测试报告，可能会让客户失去信心，甚至否定项目。</p>
<p>　　测试报告一般分为内部测试报告和外部测试报告。内部报告是我们在测试工作中的项目文档，反映了测试工作的实施情况，这里不过多讨论，读者可以参考第9章的相关内容。这里主要讨论一下外部测试报告的写法，一般外部测试报告要满足下面几个要求：</p>
<p>根据内部测试报告进行编写，一般可以摘录； <br>不可以向客户报告严重缺陷，即使是已经修改的缺陷，开发中的缺陷也没有必要让客户知道； <br>报告上可以列出一些缺陷，但必须是中级的缺陷，而且这些缺陷必须是修复的； <br>报告上面的内容尽量要真实可靠； <br>整个测试报告要仔细审阅，力争不给项目带来负面作用，尤其是性能测试报告。 <br>　　总之，外部测试报告要小心谨慎的编写。</p>
<p>　　11、开发人员老是犯一些低级错误怎么解决？</p>
<p>　　这种现象在开发流程不规范的团队里特别常见，尤其是一些&#8220;作坊式&#8221;的团队里。解决这种问题一般从两个方面入手：</p>
<p>　　一方面从开发管理入手，也就是从根源来解决问题。可以制定规范的开发流程，甚至可以制定惩罚制度，还有就是软件开发前做好规划设计。</p>
<p>　　另一方面就是加强测试，具体做法就是加强开发人员的自己测试，把这些问题&#8220;消灭&#8221;在开发阶段，这是比较好的做法，读者可以参考第13章试案例分析的&#8220;13.1.2缺陷反复出现，谁的责任&#8221;小节，13.1.2专门讨论了这类问题的方法。</p>
<p>　　此外，还可以通过规范的缺陷管理来对开发人员进行控制，比如测试部门整理出常见的缺陷，让开发人员自己对照进行检查，以减少这类低级错误的发生。</p>
<p>　　开发人员犯错误是正常的现象，作为测试人员一定不能抱怨，要认认真真的解决问题才是上策。</p>
<p>　　12.测试工具在测试工作中是什么地位？</p>
<p>　　国内的很多测试工程师对<a onclick="javascript:tagshow(event, '%B2%E2%CA%D4%B9%A4%BE%DF');" href="javascript:;" target=_self><u><strong><font color=#0000ff>测试工具</font></strong></u></a>相当迷恋，尤其是一些新手，甚至期望测试工具可以取代手工测试。测试工具在测试工作中起的是辅助作用，一般用来提高测试效率。<a onclick="javascript:tagshow(event, '%D7%D4%B6%AF%BB%AF%B2%E2%CA%D4');" href="javascript:;" target=_self><u><strong><font color=#0000ff>自动化测试</font></strong></u></a>弥补了手工测试的不足，减轻一定的工作量。实际上测试工具是无法替代大多数手工测试的，而一些诸如性能测试等自动化测试也是手工所不能完成的。</p>
<p>　　对于自动测试技术，应当依据软件的不同情况来分别对待，一般自动技术会应用在引起大量重复性工作的地方、系统的压力点、以及任何适合使用程序解决大批量输入数据的地方。然后再寻找合适的自动测试工具，或者自己开发测试程序。一定不要为了使用测试工具而使用。</p>
<img src ="http://www.cnitblog.com/stomic/aggbug/42473.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/stomic/" target="_blank">大话人生</a> 2008-04-17 14:24 <a href="http://www.cnitblog.com/stomic/archive/2008/04/17/42473.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>(原创)自学SVN篇之Windows XP+apache+SVN配置及权限管理</title><link>http://www.cnitblog.com/stomic/archive/2008/04/17/42469.html</link><dc:creator>大话人生</dc:creator><author>大话人生</author><pubDate>Thu, 17 Apr 2008 04:46:00 GMT</pubDate><guid>http://www.cnitblog.com/stomic/archive/2008/04/17/42469.html</guid><wfw:comment>http://www.cnitblog.com/stomic/comments/42469.html</wfw:comment><comments>http://www.cnitblog.com/stomic/archive/2008/04/17/42469.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/stomic/comments/commentRss/42469.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/stomic/services/trackbacks/42469.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 自学SVN篇之Windows XP+apache+SVN配置及权限管理在Windows XP下搭建Apache+SVN的服务器环境来进行版本控制。在此篇分两个部分配置和权限配置Apache1.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在windows下安装Apache http server（apache_2.0.55-win32...&nbsp;&nbsp;<a href='http://www.cnitblog.com/stomic/archive/2008/04/17/42469.html'>阅读全文</a><img src ="http://www.cnitblog.com/stomic/aggbug/42469.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/stomic/" target="_blank">大话人生</a> 2008-04-17 12:46 <a href="http://www.cnitblog.com/stomic/archive/2008/04/17/42469.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>windows上安装apache2.0.59+SVN+自动邮件通知(完整版)</title><link>http://www.cnitblog.com/stomic/archive/2008/04/16/42433.html</link><dc:creator>大话人生</dc:creator><author>大话人生</author><pubDate>Wed, 16 Apr 2008 06:01:00 GMT</pubDate><guid>http://www.cnitblog.com/stomic/archive/2008/04/16/42433.html</guid><wfw:comment>http://www.cnitblog.com/stomic/comments/42433.html</wfw:comment><comments>http://www.cnitblog.com/stomic/archive/2008/04/16/42433.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cnitblog.com/stomic/comments/commentRss/42433.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/stomic/services/trackbacks/42433.html</trackback:ping><description><![CDATA[前几天写了<span class=t_tag onclick=tagshow(event) href="tag.php?name=linux">linux</span>版的，受广大论友的邀请，特写此windows的版本，希望大家能够共同为此论坛作出贡献，也希望越来越多的人能够更加方便地使用SVN。<br><br>OS: Windows XP SP2<br>1) 安装Apache Server<br>2) 安装SVN<br>3) 配置邮件通知<br><br><strong>1. 安装<span class=t_tag onclick=tagshow(event) href="tag.php?name=apache">apache</span>2.0.59</strong>,从这里可以下载到<a href="http://apache.justdn.org/httpd/binaries/win32/apache_2.2.3-win32-x86-no_ssl.msi" target=_blank><u><font color=#0000ff>http://apache.justdn.org/httpd/b ... in32-x86-no_<span class=t_tag onclick=tagshow(event) href="tag.php?name=ssl">ssl</span>.msi</font></u></a><br>安装过程中设置以下参数：<br>Network Domain: localhost<br>Server name: localhost<br>Administrator's Emai Address: <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#119;&#105;&#110;&#100;&#121;&#109;&#97;&#120;&#64;&#49;&#50;&#54;&#46;&#99;&#111;&#109;"><u><font color=#0000ff>windymax@126.com</font></u></a><br>安装到默认路径为C:\Program Files\Apache Group\Apache2<br><br><strong>2. 安装<span class=t_tag onclick=tagshow(event) href="tag.php?name=subversion">subversion</span>1.4.0</strong>,从这里下载<a href="http://www.iusesvn.com/bbs/download/svn-win32-1.4.0.zip" target=_blank><u><font color=#0000ff>http://www.iuse<span class=t_tag onclick=tagshow(event) href="tag.php?name=svn">svn</span>.com/bbs/download/<span class=t_tag onclick=tagshow(event) href="tag.php?name=svn">svn</span>-win32-1.4.0.zip</font></u></a><br>安装到默认路径为C:\Program Files\Subversion<br>默认安装后，在apache的配置文件中会自动加入以下两行。<br>LoadModule dav_svn_module "C:/Program Files/Subversion/bin/mod_dav_svn.so"<br>LoadModule authz_svn_module "C:/Program Files/Subversion/bin/mod_authz_svn.so"<br>把这行的注释去掉<br>LoadModule dav_fs_module modules/mod_dav_fs.so<br><br>注:<br>安装zip版的subversion中,由于只是解压到某目录下，故解完后在apache的配置文件中自动添加文中的两行,另外还需加上Subversion的系统环境变量,如何设置,请参考下文Perl的环境变量配置。<br>但当安装&#8220;exe&#8221;版本subversion时，可自动添加，并成功安装。<br><br>拷贝C:\Program Files\Subversion\bin下的libdb44.dll到这个目录下C:\Program Files\Apache Group\Apache2\bin<br>打开apache的配置文件在末尾处加入以下参数：<br>&lt;Location /svn&gt;<br>DAV svn<br>SVNPath d:\svndata\test<br>AuthType Basic<br>AuthName "Windy SVN"<br>AuthUserFile d:\svndata\test\passwd<br>Require valid-user<br>&lt;/Location&gt;<br>保存。(在这里<span class=t_tag onclick=tagshow(event) href="tag.php?name=%E6%9D%83%E9%99%90">权限</span>文件我不多讲了，大家多做实验就明白了)<br><br>建立仓库<br>打开CMD命令行界面，"开始" -&gt; "运行" -&gt; "cmd" -&gt; "回车"<br>C:\Documents and Settings\windy&gt; d:&nbsp; &nbsp;//进入D盘(因为我们要在D盘下创建仓库)<br>D:\&gt; md svndata&nbsp; &nbsp;//创建一个名叫svndata的目录<br>D:\&gt; c:&nbsp; &nbsp;//进入C盘<br>C:\Documents and Settings\windy&gt; cd\&nbsp; &nbsp;//退到C盘根目录<br>C:\Documents and Settings\windy&gt; cd C:\Program Files\Subversion\bin&nbsp;&nbsp;//进入subversion/bin目录<br>C:\Program Files\Subversion\bin&gt; svnadmin create d:\svndata\test&nbsp; &nbsp;//用svnadmin命令创建名为test的仓库(这条命令成功后，在test下会出现很多文件夹和文件)<br>C:\Program Files\Subversion\bin&gt; cd C:\Program Files\Apache Group\Apache2\bin&nbsp; &nbsp;//进入apache\bin目录<br>C:\Program Files\Apache Group\Apache2\bin&gt; htpasswd -cm d:\svndata\test\passwd user1&nbsp; &nbsp;//用htpasswd命令创建第一个用户(user1)，同时生成密码认证文件，c参数为create,m参数为MD5加密方式<br>New password: ******<br>Re-type new password: ******<br>Adding password for user user1&nbsp; &nbsp;//加入用户成功<br>C:\Program Files\Apache Group\Apache2\bin&gt; htpasswd -m d:\svndata\test\passwd user2&nbsp; &nbsp;//用htpasswd命令创建第二个用户(user2),注意如果在这时加入c参数会覆盖掉之前创建的用户及文件。<br>New password: ******<br>Re-type new password: ******<br>Adding password for user user2&nbsp; &nbsp;//加入用户成功<br><br>重新启动apache，进行测试。<br>用IE打开<a href="http://localhost/svn" target=_blank><u><font color=#0000ff>http://localhost/svn</font></u></a>，这时应该可以看到<br>Revision 0: /<br>--------------------------------------------------------------------------------<br>Powered by Subversion version 1.4.0 (r21228).&nbsp; &nbsp; //说明我们已经配置成功了<br><br><strong>3. 配置邮件通知</strong><br>下载所需要的软件包<br>--在这里下载<a href="http://downloads.activestate.com/ActivePerl/Windows/5.8/ActivePerl-5.8.8.819-MSWin32-x86-267479.msi" target=_blank><u><font color=#0000ff>http://downloads.activestate.com ... in32-x86-267479.msi</font></u></a>到D盘根目录下。<br>--下载<a href="http://download.microsoft.com/download/vc15/patch/1.52/w95/en-us/nmake15.exe" target=_blank><u><font color=#0000ff>http://download.microsoft.com/do ... 5/en-us/nmake15.exe</font></u></a>到D盘根目录下。<br>--下载<a href="http://search.cpan.org/CPAN/authors/id/K/KW/KWILLIAMS/Module-Build-0.2805.tar.gz" target=_blank><u><font color=#0000ff>http://search.cpan.org/CPAN/auth ... Build-0.2805.tar.gz</font></u></a>到D盘根目录下，将Module-Build-0.2805.tar.gz解压到D盘。<br>--下载<a href="http://search.cpan.org/CPAN/authors/id/G/GB/GBARR/Authen-SASL-2.10.tar.gz" target=_blank><u><font color=#0000ff>http://search.cpan.org/CPAN/auth ... en-SASL-2.10.tar.gz</font></u></a>到D盘根目录下，将Authen-SASL-2.10.tar.gz解压到D盘。<br>--下载<a href="http://search.cpan.org/CPAN/authors/id/A/AP/APLEINER/Net-SMTP_auth-0.08.tar.gz" target=_blank><u><font color=#0000ff>http://search.cpan.org/CPAN/auth ... TP_auth-0.08.tar.gz</font></u></a>到D盘根目录下，将Net-SMTP_auth-0.08.tar.gz解压到D盘。<br>--下载<a href="http://search.cpan.org/CPAN/authors/id/D/DW/DWHEELER/SVN-Notify-2.64.tar.gz" target=_blank><u><font color=#0000ff>http://search.cpan.org/CPAN/auth ... -Notify-2.64.tar.gz</font></u></a>到D盘根目录下，将SVN-Notify-2.64.tar.gz解压到D盘。<br><br>开始安装Perl以及模块<br>--安装Active Perl，一路默认安装，默认路径为C:\Perl<br>--测试perl是否正常工作(这步很关键)<br>&nbsp;&nbsp;打开CMD命令行界面，"开始" -&gt; "运行" -&gt; "cmd" -&gt; "回车"<br>&nbsp; &nbsp;C:\Documents and Settings\windy&gt; perl&nbsp; &nbsp;//如果没有报错，说明已经正常工作，因为安装perl时，安装程序会自动设置好环境perl(如果在系统环境变量中没有自动添加，需手动添加perl变量环境)，具体做法是：<br>&nbsp;&nbsp;"回到桌面" -&gt; "鼠标右键我的电脑" -&gt; "属性" -&gt; "高级" -&gt; "环境变量" -&gt; "系统变量中Path最前面中添加C:\Perl\bin\;" -&gt;"完成"。&nbsp; &nbsp;//测试，如果报错，请重新启动电脑后进行测试。<br>--将nmake15.exe改名为nmake.exe后拷贝到c:\windows\system32目录下。<br>--测试nmake是否是否正常工作(这步很关键)<br>&nbsp;&nbsp;打开CMD命令行界面，"开始" -&gt; "运行" -&gt; "cmd" -&gt; "回车"<br>&nbsp; &nbsp;C:\Documents and Settings\windy&gt; nmake&nbsp; &nbsp;<br>&nbsp;&nbsp;Microsoft (R) Program Maintenance Utility&nbsp; &nbsp;Version 1.50<br>&nbsp;&nbsp;Copyright (c) Microsoft Corp 1988-94. All rights reserved.&nbsp; &nbsp;//说明nmake已经正常工作<br>--安装Module-Build模块<br>&nbsp;&nbsp;打开CMD命令行界面，"开始" -&gt; "运行" -&gt; "cmd" -&gt; "回车"<br>&nbsp;&nbsp;C:\Documents and Settings\windy&gt; d:<br>&nbsp;&nbsp;D:\&gt; cd Module-Build-0.2805<br>&nbsp;&nbsp;D:\Module-Build-0.2805&gt; perl Build.PL&nbsp; &nbsp;//收集系统环境变量<br>&nbsp;&nbsp;D:\Module-Build-0.2805&gt; Build&nbsp; &nbsp;//进行编译<br>&nbsp;&nbsp;D:\Module-Build-0.2805&gt; Build test&nbsp; &nbsp;//测试<br>&nbsp;&nbsp;D:\Module-Build-0.2805&gt; Build install&nbsp; &nbsp;//编译后安装&nbsp;&nbsp;<br>--安装Perl模块Authen::SASL，进入Authen-SASL-2.10目录，首先开打Makefile.PL<br>&nbsp;&nbsp;打开CMD命令行界面，"开始" -&gt; "运行" -&gt; "cmd" -&gt; "回车"<br>&nbsp;&nbsp;C:\Documents and Settings\windy&gt; d:<br>&nbsp;&nbsp;D:\&gt; cd Authen-SASL-2.10<br>&nbsp;&nbsp;D:\Authen-SASL-2.10&gt; perl Makefile.PL&nbsp; &nbsp;//收集系统环境变量<br>&nbsp;&nbsp;出现选择安装提示，y和n先后安装一次<br>&nbsp;&nbsp;D:\Authen-SASL-2.10&gt; nmake&nbsp; &nbsp;//进行编译<br>&nbsp;&nbsp;D:\Authen-SASL-2.10&gt; nmake test&nbsp;&nbsp;//进行测试<br>&nbsp;&nbsp;D:\Authen-SASL-2.10&gt; nmake install&nbsp; &nbsp;//编译后安装<br>--安装Perl模块Net::SMTP_auth<br>&nbsp;&nbsp;打开CMD命令行界面，"开始" -&gt; "运行" -&gt; "cmd" -&gt; "回车"<br>&nbsp;&nbsp;C:\Documents and Settings\windy&gt; d:<br>&nbsp;&nbsp;D:\&gt; cd Net-SMTP_auth-0.08<br>&nbsp;&nbsp;D:\Net-SMTP_auth-0.08&gt; perl Makefile.PL&nbsp; &nbsp;//收集系统环境变量<br>&nbsp;&nbsp;D:\Net-SMTP_auth-0.08&gt; nmake&nbsp; &nbsp;//进行编译<br>&nbsp;&nbsp;D:\Net-SMTP_auth-0.08&gt; nmake test&nbsp; &nbsp;//测试<br>&nbsp;&nbsp;D:\Net-SMTP_auth-0.08&gt; nmake install&nbsp; &nbsp;//编译后安装<br>--安装Perl模块SVN::Notify<br>&nbsp;&nbsp;打开CMD命令行界面，"开始" -&gt; "运行" -&gt; "cmd" -&gt; "回车"<br>&nbsp;&nbsp;C:\Documents and Settings\windy&gt; d:<br>&nbsp;&nbsp;D:\&gt; cd SVN-Notify-2.64<br>&nbsp;&nbsp;D:\SVN-Notify-2.64&gt; perl Build.PL&nbsp; &nbsp;//收集系统环境变量<br>&nbsp;&nbsp;D:\SVN-Notify-2.64&gt; Build&nbsp; &nbsp;//进行编译<br>&nbsp;&nbsp;D:\SVN-Notify-2.64&gt; Build test&nbsp; &nbsp;//测试<br>&nbsp;&nbsp;D:\SVN-Notify-2.64&gt; Build installl&nbsp; &nbsp;//编译后安装&nbsp;&nbsp;<br>--安装完毕。<br><br>设置邮件通知<br>--拷贝post-commit.tmpl为post-commit.bat<br>--删除末尾参数，增加下面参数：<br>set REPOS=%1<br>set REV=%2<br>SET PATH=C:\PERL\BIN;<br>SET OS=Windows_NT<br>SET SystemRoot=C:\WINDOWS<br>svnnotify --repos-path %REPOS% -r %REV% --to <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#119;&#105;&#110;&#100;&#121;&#64;&#120;&#120;&#120;&#46;&#99;&#111;&#109;"><u><font color=#0000ff>windy@xxx.com</font></u></a> --smtp smtp.xxx.com -H HTML::ColorDiff -d --subject-prefix [Windy SVN]<br>//--to <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#119;&#105;&#110;&#100;&#121;&#64;&#120;&#120;&#120;&#46;&#99;&#111;&#109;"><u><font color=#0000ff>windy@xxx.com</font></u></a>为要通知的邮件地址,我们一般会做个邮件组，这个组内包含了这个项目的所有人,--smtp mail.xxx.com为你的内部邮件<span class=t_tag onclick=tagshow(event) href="tag.php?name=%E6%9C%8D%E5%8A%A1%E5%99%A8">服务器</span>地址，必须使用域名，要内部DNS能够解析到，可能需要在内部DNS<span class=t_tag onclick=tagshow(event) href="tag.php?name=%E6%9C%8D%E5%8A%A1%E5%99%A8">服务器</span>上手动添加主机记录,[Windy SVN]必须有SVN字段，否则将收不到邮件，注重格式，此脚本有bugzilla和JIRA系统进行整合的参数。<br><br>关于详细参数解释：<br>svnnotify 邮件通知的命令<br>--repos-path %REPOS% 后跟仓库的路径<br>-r %REV% 后跟版本号<br>--to 后跟邮件地址<br>--smtp 后跟邮件服务器的地址<br>--H HTML::ColorDiff 用颜色区分开修改过的代码<br>--subject-prefix [Windy SVN] 邮件标题前缀，可以把Windy自段定义成自已项目的名称<br><br>完成所有设置。<br>
<img src ="http://www.cnitblog.com/stomic/aggbug/42433.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/stomic/" target="_blank">大话人生</a> 2008-04-16 14:01 <a href="http://www.cnitblog.com/stomic/archive/2008/04/16/42433.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>让SVN作为windows系统服务自动运行</title><link>http://www.cnitblog.com/stomic/archive/2008/04/16/42428.html</link><dc:creator>大话人生</dc:creator><author>大话人生</author><pubDate>Wed, 16 Apr 2008 03:26:00 GMT</pubDate><guid>http://www.cnitblog.com/stomic/archive/2008/04/16/42428.html</guid><wfw:comment>http://www.cnitblog.com/stomic/comments/42428.html</wfw:comment><comments>http://www.cnitblog.com/stomic/archive/2008/04/16/42428.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/stomic/comments/commentRss/42428.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/stomic/services/trackbacks/42428.html</trackback:ping><description><![CDATA[<a onclick="javascript:tagshow(event, '%B7%BD%B7%A8');" href="javascript:;" target=_self><u><strong><font color=#000066>方法</font></strong></u></a>一：<br><br>SVNService(将svn作为<a onclick="javascript:tagshow(event, 'windows');" href="javascript:;" target=_self><u><strong><font color=#000066>windows</font></strong></u></a>服务运行的工具)<br><br>SVN Service Wrapper for Windows<br>This is my Win32 Service wrapper for SVN. Source is included, and its in the public domain. No need to copyright this stuff.<br><br>Usage instructions:<br><br>SVNService -? to display this list<br>SVNService -install &lt;svnserve parameters&gt; to install the service<br>SVNService -setup &lt;svnserve parameters&gt; to change command line parameters for svnserve<br>SVNService -remove to remove the service<br>SVNService -debug to run as a console app for debugging<br><br>将svnservice.exe放在<a onclick="javascript:tagshow(event, 'subversion');" href="javascript:;" target=_self><u><strong><font color=#000066>subversion</font></strong></u></a>的bin目录下<br><br>Example:<br>比如，你的所有项目都在e:\svnrepo下，你可以如下<br><a onclick="javascript:tagshow(event, '%B0%B2%D7%B0');" href="javascript:;" target=_self><u><strong><font color=#000066>安装</font></strong></u></a>时用 SVNService -install -d -r e:\svnrepo<br>更改时用 SVNService -setup -d -r e:\otherplace\svnrepo<br>如果访问其中的一个项目e:\svnrepo\project1，可以指定路径<br><br>svn://localhost/project1 (注：作为url时用/)<br><br>第一次安装完后要到服务中手动启动它，<br>或者到服务中将它设为自动启动，让每次机器启动时自动启动这个服务。<br><br>方法二：<br><br>Subversion 从1.4版本开始，可以以windows系统服务的形式在开机时自动运行。但Subversion安装程序还不能把自己安装成windows服务，需要我们自己进行手动安装，方法如下： 打开一个DOS命令窗口，执行如下命令：　　<br><br>sc create svnserve binPath= "\"C:\Program Files\Subversion\bin\svnserve.exe\" --service --root e:\svn" displayname= "Subversion Repository" depend= Tcpip start= auto 　　<br><br>其中，sc是windows自带的服务配置程序，参数binPath表示svnserve可执行文件的安装路径，由于路径中的"Program Files"带有空格，因此整个路径需要用双引号引起来。而双引号本身是个特殊字符，需要进行转移，因此在路径前后的两个双引号都需要写成\"<br><br>--service参数表示以windows服务的形式运行，--root指明svn repository的位置，service参数与root参数都作为binPath的一部分，因此与svnserve.exe的路径一起被包含在一对双引号当中，而这对双引号不需要进行转义。<br><br>displayname表示在windows服务列表中显示的名字， depend =Tcpip 表示svnserve服务的运行需要tcpip服务，start=auto表示开机后自动运行。　　<br><br>安装服务后，svnserve要等下次开机时才会自动运行。　　<br><br>若要卸载svn服务，则执行 sc delete svnserve 即可。 <br>
<img src ="http://www.cnitblog.com/stomic/aggbug/42428.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/stomic/" target="_blank">大话人生</a> 2008-04-16 11:26 <a href="http://www.cnitblog.com/stomic/archive/2008/04/16/42428.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>svn 命令简要HOWTO</title><link>http://www.cnitblog.com/stomic/archive/2008/04/16/42407.html</link><dc:creator>大话人生</dc:creator><author>大话人生</author><pubDate>Tue, 15 Apr 2008 16:02:00 GMT</pubDate><guid>http://www.cnitblog.com/stomic/archive/2008/04/16/42407.html</guid><wfw:comment>http://www.cnitblog.com/stomic/comments/42407.html</wfw:comment><comments>http://www.cnitblog.com/stomic/archive/2008/04/16/42407.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/stomic/comments/commentRss/42407.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/stomic/services/trackbacks/42407.html</trackback:ping><description><![CDATA[常用的svn命令的一个简要介绍，很有用的： <br><strong><u>CREATE REPOSITORY</u></strong>
<pre>$ svnadmin create /usr/local/svn/newrepos<br></pre>
<p><strong><u>IMPORT MODULE </u></strong></p>
<pre>$ svn import mytree file:///usr/local/svn/newrepos/fooproject<br>Adding mytree/foo.c<br>Adding mytree/bar.c<br>Adding mytree/subdir<br>Adding mytree/subdir/quux.h<br>Committed revision 1.<br></pre>
<p><strong><u>START STANDALONE SVN SERVER </u></strong></p>
<pre>svnserve.exe -d -r d:/temp/repos<br></pre>
<p><strong><u>STARTING SVN UNDER APACHE </u></strong></p>
<pre><location></location><br>  DAV svn<br>  SVNPath d:/Data/SVN<br>  AuthType Basic<br>  AuthName "Subversion repository"<br>  AuthUserFile d:/Data/SVN/svn-auth-file<br>  Require valid-user<br><br></pre>
Would be available using:
<pre>svn co http://ip:port/path/to/repo/<br></pre>
<p><strong><u>ENABLING SIMPLE AUTHORIZATION</u></strong> </p>
<p>1) create passw file: </p>
<pre>htpasswd -cm d:/Data/svn-auth-file<br></pre>
add pass:
<pre>htpasswd -m d:/Data/svn-auth-file<br></pre>
<p>2) create svn-policy-file file: </p>
<pre>[groups]<br>project1-developers = anton, mike<br>project2 = anton, mike, peter<br>[project1:/]<br>@project1-developers = rw<br>[project2:/]<br>@project2-developers = rw<br></pre>
<p>3) httpd.conf: </p>
<pre><location></location><br>  DAV svn<br>  SVNPath d:/Data/SVN<br>  AuthType Basic<br>  AuthName "Subversion repository"<br>  AuthUserFile d:/Data/svn-auth-file<br>  Require valid-user<br>  AuthzSVNAccessFile d:/Data/svn-policy-file<br><br></pre>
<p><strong><u>ENABLING SVN TRAFFIC COMPRESSION </u></strong></p>
<p>It is required to invoke mode_deflate in httpd.conf: </p>
<pre><ifmodule></ifmodule>DeflateBufferSize 8096<br>DeflateCompressionLevel 9<br><br>...<br><location></location><br>  SetOutputFilter DEFLATE<br>  SetInputFilter DEFLATE<br>  DAV svn<br>  SVNPath d:/temp/repos<br>  AuthType Basic<br>  AuthName "Subversion repository"<br>  AuthUserFile d:/temp/svn-auth-file<br>  Require valid-user<br><br></pre>
<p><strong><u>EXTRACTING ONE PROJECT FROM MULTIPROJECT REPOSITORY</u></strong> </p>
<p>1) Dumping repos: </p>
<pre>svnadmin dump d:datasvn &gt; repo-dump<br>or svnadmin dump myrepos --revision 100:200 &gt; revs-100-200.dumpfile<br></pre>
<p>2) taking 1 project from repo: </p>
<pre>type repo-dump | svndumpfilter include project1 &gt; project1-dump<br></pre>
<p>3) removing root dir: </p>
<pre>Node-path: project1<br>Node-action: add<br>Node-kind: dir<br>Content-length: 0<br></pre>
<p>Replace all "Node-path: project1/" strings with "Node-path: " </p>
<p>4) creating repo: </p>
<pre>svnadmin create d:datasvnproject1<br></pre>
<p>5) restoring: </p>
<pre>svnadmin load d:datasvnproject1 &lt; project1-dump<br></pre>
<p>6) browsing </p>
<pre>svnlook tree d:datasvn<br></pre>
<p>7) Configuring Apache: </p>
<pre><location></location><br>  SetOutputFilter DEFLATE<br>  SetInputFilter DEFLATE<br>  DAV svn<br>  # any "/svn/foo" URL will map to a repository /usr/local/svn/foo<br>  SVNParentPath d:/Data/SVN<br>  AuthType Basic<br>  AuthName "Subversion repository"<br>  AuthUserFile d:/Data/svn-auth-file<br>  Require valid-user<br><br></pre>
8) Switch all working copies to a new repository:
<pre>[to a new branch] svn switch http://newIP:newPort/path/to/repo<br>[to a new URL] svn switch --relocate http://oldIP:oldPort/path/to/repo http://newIP:newPort/path/to/repo<br></pre>
<p><strong><u>BERKLEY DB recovery</u></strong> </p>
<p>1) download appropriate bdb release from berkley site </p>
<p>2) build win tools usinn VC 6.0+ </p>
<p>3) run db_recover -vec -h d:datasvnproject1 </p>
<p>4) move _db files from d:datasvnbroker into d:datasvnproject1db folder </p>
<p>5) if fail problem persists, after 4th step do backup/restore svn repo: </p>
<pre> <br> svnadmin dump d:datasvnproject1 &gt; project1.timestamp.dump<br> <manual></manual><br> svnadmin create d:datasvnproject1<br> svnadmin load d:datasvnproject1 &lt; project1.timestamp.dump</pre>
<img src ="http://www.cnitblog.com/stomic/aggbug/42407.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/stomic/" target="_blank">大话人生</a> 2008-04-16 00:02 <a href="http://www.cnitblog.com/stomic/archive/2008/04/16/42407.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在Microsoft Windows中使用Apache</title><link>http://www.cnitblog.com/stomic/archive/2008/04/15/42403.html</link><dc:creator>大话人生</dc:creator><author>大话人生</author><pubDate>Tue, 15 Apr 2008 13:55:00 GMT</pubDate><guid>http://www.cnitblog.com/stomic/archive/2008/04/15/42403.html</guid><wfw:comment>http://www.cnitblog.com/stomic/comments/42403.html</wfw:comment><comments>http://www.cnitblog.com/stomic/archive/2008/04/15/42403.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/stomic/comments/commentRss/42403.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/stomic/services/trackbacks/42403.html</trackback:ping><description><![CDATA[<p>此文档解释了如何在Microsoft Windows平台上安装、配置和运行Apache 2.0。 如果你发现了bug，或者希望以其他方式作出贡献， 请使用我们的<a href="http://httpd.apache.org/bug_report.html"><u><font color=#0000ff>bug报告页面</font></u></a>。</p>
<p>本文档的大多数内容假定你是从一个二进制发布版安装Apache到Windows上。 如果你想自己编译Apache(可能有助于开发和跟踪bugs)，参看<a href="http://www.uplinux.com/download/doc/apache/ApacheManual/platform/win_compiling.html"><u><font color=#0000ff>编译Windows下的Apache</font></u></a>。</p>
<p><strong>现在，对Windows 9x的支持是不完善的。 当前Apache 2.0并不期望在Windows 9x平台上运行。</strong> 如果你有兴趣在那方面给于帮助，请看开发者站点上的<a href="http://dev.apache.org/"><u><font color=#0000ff>如何加入</font></u></a>主题的信息。 将来可能会因为某些原因提供这方面的支持， 我们欢迎提供使Apache能够运行在Windows 9x上的补丁。</p>
<p><strong>本文档使用到的缩写及其意义解释包括：</strong></p>
<ul>
    <li><strong>Windows NT:</strong> 指所有版本的基于NT核心的Microsoft Windows操作系统， 包括Windows NT, Windows 2000, Windows XP and Windows.NET Server 2003及后续版本。
    <li><strong>Windows 9x:</strong> 指所有版本的定位于家庭使用的Microsoft Windows操作系统， 包括Windows 95, Windows 98 and Windows ME。 </li>
    <li>
    <div class=section>
    <h2><a id=req name=req>对操作系统的要求</a></h2>
    <p>Apache 2.0被设计为在Windows NT 4.0和Windows 2000上运行。 它的二进制安装程序只能在x86族的处理器上运行，比如Intel芯片。 Apache可能也能够运行在Windows 9x上，但是并没有经过测试， 也不建议在实际工作的系统上这样使用。 任何情况下都必须确保TCP/IP网络协议已经安装。</p>
    <p>如果在Windows 95上运行，必须安装"Winsock2"升级补丁。 "Winsock2" for Windows 95可以在<a href="http://www.microsoft.com/windows95/downloads/"><u><font color=#0000ff> 这里</font></u></a>下载。</p>
    <p>如果在NT 4.0上运行，建议安装Service Pack 6， 因为Service Pack 4有众所周知的TCP/IP和Winsock完整性的问题， 在以后的Service Pack中解决了这些问题。</p>
    </div>
    <div class=top><a href="http://www.uplinux.com/download/doc/apache/ApacheManual/platform/windows.html#page-header"><img alt=top src="http://www.uplinux.com/download/doc/apache/ApacheManual/images/up.gif"></a></div>
    <div class=section>
    <h2><a id=down name=down>下载 Apache for Windows</a></h2>
    <p>关于Apache最新版本的有关信息可以在位于<a href="http://httpd.apache.org/"><u><font color=#0000ff>http://httpd.apache.org/</font></u></a> 的Apache web服务器上找到。那里会列出当前发行版本、 所有最近的alpha和beta测试发行版本以及镜像web站点和匿名ftp服务器的信息。</p>
    <p>你应该下载带有<code>.msi</code>扩展名的Apache for Windows版本。 这是一个单一的Microsoft Installer文件，包含了Apache，可以立即安装并运行。 还有一个单独的<code>.zip</code>文件<em>只</em>打包了源码， 可以用Microsoft Visual C++ (Visual Studio)工具来编译。</p>
    </div>
    <div class=top><a href="http://www.uplinux.com/download/doc/apache/ApacheManual/platform/windows.html#page-header"><img alt=top src="http://www.uplinux.com/download/doc/apache/ApacheManual/images/up.gif"></a></div>
    <div class=section>
    <h2><a id=inst name=inst>安装 Apache for Windows</a></h2>
    <p>Apache的安装需要有Microsoft Installer 1.2或更高版本。 在Windows 9x中，你可以从<a href="http://www.microsoft.com/downloads/release.asp?ReleaseID=32831"><u><font color=#0000ff>这里</font></u></a> 升级Microsoft Installer到2.0，在Windows NT 4.0和2000中，2.0的升级版在<a href="http://www.microsoft.com/downloads/release.asp?ReleaseID=32832"><u><font color=#0000ff>这里</font></u></a>. Windows XP不需要这个升级。</p>
    <p>注意，使用这个安装包不能在同一个机器上安装两套Apache 2.0。 但是，在同一个机器上，安装一个1.3系列<strong>和</strong>一个2.0系列的Apache则没有问题。 如果你需要在同一个机器上安装两套不同的2.0版本， 则必须<a href="http://www.uplinux.com/download/doc/apache/ApacheManual/platform/win_compiling.html"><u><font color=#0000ff>用代码编译和安装Apache</font></u></a>.</p>
    <p>运行已下载的上述Apache <code>.msi</code>文件。安装程序会要求提供下列信息：</p>
    <ul>
        <li>安装Apache的文件夹(缺省是 <code>\Program Files\Apache Group\Apache</code>， 虽然你可以把它指定为任何其他文件夹)
        <li>开始菜单上的名称(缺省是"Apache Web Server")
        <li>安装类型。选择]"Typical"选项会安装除源码以外的所有内容。 选择"Minimum"选项不安装说明手册和源码。如果希望安装源码请选择"Custom"安装方式。 </li>
    </ul>
    <p>安装期间，Apache将会配置你所选择安装目录下的<code>conf</code>文件夹中的文件。 但是如果那个目录下已有同名文件存在，原有文件将不会被覆盖， 而新的相应的文件将会被加上<code>.default</code>扩展名。 所以，举例来说，如果<code>conf\httpd.conf</code>已经存在，那么不会对它做任何改变， 而新版本http.conf的内容将会被写入文件<code>conf\httpd.conf.default</code>。 安装完成以后你应该检查<code>.default</code>文件中的内容看看有没有不同， 如果必要，更新你原有的配置文件。</p>
    <p>而且，如果你已经有一个名为<code>htdocs\index.html</code>的文件，它也不会被覆盖掉 (也不会安装<code>index.html.default</code>文件)。 这意味着你在一个旧版本Apache上安装新版本是安全的 (但是你必须在安装之前首先停掉原有服务器然后在安装完成后再启动服务器)。</p>
    <p>安装Apache以后，要求你应该编辑<code>conf</code>目录下的配置文件。这些 文件已在安装期间被配置以便Apache能够从安装目录运行，文档目录被配置为安装 目录下的子目录<code>htdocs</code>。在你开始真正使用之前还有很多选项需要设 置。但是为了尽快开始，可以使用安装时自动配置的配置文件。</p>
    </div>
    <div class=top><a href="http://www.uplinux.com/download/doc/apache/ApacheManual/platform/windows.html#page-header"><img alt=top src="http://www.uplinux.com/download/doc/apache/ApacheManual/images/up.gif"></a></div>
    <div class=section>
    <h2><a id=use name=use>配置 Apache for Windows</a></h2>
    <p>Apache使用<code>conf</code>目录下的文件进行配置，与Unix系统下的版本一样， 但是Windows版本有几个不同的指令，可阅读<a href="http://www.uplinux.com/download/doc/apache/ApacheManual/"><u><font color=#0000ff>Apache 文档</font></u></a>察看全部可用指令。</p>
    <p>Apache for Windows主要的不同点是：</p>
    <ul>
        <li>
        <p>因为Apache for Windows是多线程的，它并不像Unix版本那样为每个请求使用一个单独的进程。 而是通常运行两个Apache进程：一个父进程，和一个处理请求的子进程。 在子进程内部由单独的线程来处理每个请求。</p>
        <p>因此"process"-管理指令族是不同的：</p>
        <p><code class=directive><a href="http://www.uplinux.com/download/doc/apache/ApacheManual/mod/mpm_common.html#maxrequestsperchild"><u><font color=#0000ff>MaxRequestsPerChild</font></u></a></code> - 就像在Unix版本中的相同指令，这条指令控制一个进程退出前将为多少个请求提供服务。 然而，与Unix不同的是，一个进程将即时为所有请求而不是只为一个请求服务， 因此如果设置这条指令，建议将它设为一个很大的值。 缺省的设置，<code>MaxRequestsPerChild 0</code>，不会引起进程总是退出。</p>
        <div class=warning><strong>警告： 启动新的子进程时将会重新读入服务器配置文件。如果你修改了<code>httpd.conf</code>， 新的子进程将有可能不能启动或者可能得到预期之外的结果。</strong></div>
        <p><code class=directive><a href="http://www.uplinux.com/download/doc/apache/ApacheManual/mod/mpm_common.html#threadsperchild"><u><font color=#0000ff>ThreadsPerChild</font></u></a></code> - 这是一条新的指令，用来告诉服务器应该使用多少个线程。 指明了服务器可以立刻处理的连接的最大数量； 如果你的站点有大量的点击，确认并为你的站点设置这条足够大的值。 缺省值是<code>ThreadsPerChild 50</code>。</p>
        <li>
        <p>接收文件名作为参数的指令必须使用Windows文件名取代Unix文件名。 但是，因为Apache内部使用Unix风格的名字，你必须使用正斜杠而不是反斜杠。 可以使用盘符；如果省略，将假定使用Apache执行文件所在盘符。</p>
        <li>
        <p>Apache for Windows具有运行时装入模块的能力，不需要重新编译。 如果Apach是e在正常情况下编译，它会在<code>\Apache\modules</code>目录下安装许多可选模块。 要激活它们或者其他模块，必须使用新的<code class=directive><a href="http://www.uplinux.com/download/doc/apache/ApacheManual/mod/mod_so.html#loadmodule"><u><font color=#0000ff>LoadModule</font></u></a></code>指令。 举例来说，要激活状态模块，使用下列指令(除了<code>access.conf</code>中的状态激活指令以外):</p>
        <div class=example>
        <p><code>LoadModule status_module modules/mod_status.so </code></p>
        </div>
        <p>也可使用<a href="http://www.uplinux.com/download/doc/apache/ApacheManual/mod/mod_so.html#creating"><u><font color=#0000ff>创建可装载模块</font></u></a>中的信息。</p>
        <li>
        <p>Apache也可以装载ISAPI扩展(<em>i.e.</em>, Internet Server Applications)，例如Microsoft IIS服务器和其他一些Windows服务器所使用的。 <a href="http://www.uplinux.com/download/doc/apache/ApacheManual/mod/mod_isapi.html"><u><font color=#0000ff>这里有更多相关信息。</font></u></a>注意Apache<em>不能</em>装载ISAPI 过滤器。</p>
        <li>
        <p>当运行CGI脚本时，Apache查找脚本解释器使用的方法是由 <code class=directive><a href="http://www.uplinux.com/download/doc/apache/ApacheManual/mod/core.html#scriptinterpretersource"><u><font color=#0000ff>ScriptInterpreterSource</font></u></a></code> 指令配置的。</p>
        <li>
        <p>由于在Windows下管理具有像<code>.htaccess</code>这样名字的文件经常是很困难的， 你会发现在配置文件中使用<code class=directive><a href="http://www.uplinux.com/download/doc/apache/ApacheManual/mod/core.html#accessfilename"><u><font color=#0000ff>AccessFilename</font></u></a></code> 指令改变使用的配置文件的名字是很有用。</p>
        </li>
    </ul>
    </div>
    <div class=top><a href="http://www.uplinux.com/download/doc/apache/ApacheManual/platform/windows.html#page-header"><img alt=top src="http://www.uplinux.com/download/doc/apache/ApacheManual/images/up.gif"></a></div>
    <div class=section>
    <h2><a id=service name=service>以服务方式运行Apache for Windows</a></h2>
    <div class=note><strong>用于指定服务名的<code>-n</code>选项只在Apache 1.3.7 及以后的版本中可用。 </strong>早期版本只支持缺省服务名"Apache"。</div>
    <p>你可以像下面这样将Apache安装为Windows NT服务：</p>
    <div class=example>
    <p><code>apache -i -n "服务名" </code></p>
    </div>
    <p>要安装一个使用特定配置的服务，安装时指定配置文件：</p>
    <div class=example>
    <p><code>apache -i -n "服务名" -f "\my server\conf\my.conf" </code></p>
    </div>
    <p>要移除一个Apache服务，使用:</p>
    <div class=example>
    <p><code>apache -u -n "服务名" </code></p>
    </div>
    <p>如果没有指定服务名，缺省地，将使用"Apache"。</p>
    <p>一旦服务被安装，你可以使用<code>-n</code>选项和其他选项一起访问该服务的配置文件。例如：</p>
    <p>测试一个服务的配置文件：</p>
    <div class=example>
    <p><code>apache -n "服务名" -t </code></p>
    </div>
    <p>启动一个使用某服务配置文件的控制台Apache：</p>
    <div class=example>
    <p><code>apache -n "服务名" </code></p>
    </div>
    </div>
    <div class=top><a href="http://www.uplinux.com/download/doc/apache/ApacheManual/platform/windows.html#page-header"><img alt=top src="http://www.uplinux.com/download/doc/apache/ApacheManual/images/up.gif"></a></div>
    <div class=section>
    <h2><a id=depends name=depends>关于服务依存关系的重要提示：</a></h2>
    <p>对于Apache发行版1.3.13更早的版本，成功运行已安装服务所要求的依存关系并没有配置。 安装了一个早期版本Apache的服务以后， 你还必须做以下工作：</p>
    <div class=example>
    <p><code>运行 regedt32<br>从菜单选择窗口 - "HKEY_LOCAL_MACHINE on Local Machine"<br>双击打开 SYSTEM, 然后打开 the CurrentControlSet <br>滚动到Apache服务名并点击<br>从菜单选择 Edit - Add Value... <br>用下列值填充Add Value对话框<br>数值名称: DependOnGroup <br>数据类型: REG_MULTI_SZ <br>点击确定<br>保留多字符串编辑器为空并点击确定<br>Select Edit - 从菜单选择 Edit - Add Value... <br>用下列值填充Add Value对话框<br>数值名称: DependOnService <br>数据类型: REG_MULTI_SZ <br>点击确定<br>在多字符串编辑器中输入下列列表(每行一条)<br>Tcpip <br>Afd <br>点击确定<br></code></p>
    </div>
    <p>如果你从第三方模块、ISAPI或者其他像ActiveState Perl那样的附加脚本技术使用了COM或者DCOM，你可能还需要在DependOnService列表中加入Rpcss条目。为了避免不必要地暴露TCP端口135，Apache安装时没有创建那个条目。如上述步骤在找到或是创建数值名称DependOnService，双击它并加入Rpcss条目到列表。</p>
    </div>
    <div class=top><a href="http://www.uplinux.com/download/doc/apache/ApacheManual/platform/windows.html#page-header"><img alt=top src="http://www.uplinux.com/download/doc/apache/ApacheManual/images/up.gif"></a></div>
    <div class=section>
    <h2><a id=account name=account>运行Apache服务的用户帐号(NT/2000)</a></h2>
    <p>当Apache第一次被安装为服务(例如使用<code>-i</code>选项)，它会以用户"System"(本地系统账号)运行。 如果web服务器的所有资源都在本地系统上，这样做会问题比较少，但是将会具有很大的安全权限来影响本地机器！</p>
    <div class=note>本地系统账号是一个很有特权的本地账号，因此你不应该用它运行任何共享软件应用程序。 但是，它没有网络权限，不能通过任何NT安全机制离开本地机器，包括文件系统、命名管道、DCOM或secure RPC。</div>
    <p><strong>永远不要把网络权限授予SYSTEM账号！</strong>创建一个新的用户帐号来代替它， 给这个用户授予合适的权限，并使用"Log On As:"选项。选择开始菜单 -&gt; 设置 -&gt; 控制面板 -&gt; 服务 -&gt; apache服务 ...并点击"启动服务"来访问该设置</p>
    <div class=note>一个运行在本地系统账号背景中的服务继承了SCM(服务控制管理器)的安全背景，与任何已登录账号都没有关联，也没有用于验证的任何证书(域名、用户名和密码)。</div>
    <p>SYSTEM账号没有网络权限，因此对于服务一个Apache的共享安装实例或者共享页都是不可见的。如果你打算使用<em>任何</em>网络资源，下面的步骤应该有所帮助：</p>
    <ul>
        <li>在控制面板的服务对话框中选择Apache并点击启动服务。
        <li>证实服务的账号是正确的。你可能希望为Apache服务创建一个账号。
        <li>重新输入密码和确认密码。
        <li>转到域的用户管理。
        <li>从标题栏菜单点击策略，选择用户权限。
        <li>选择高级用户权限选项。
        <li>在下拉列表中，确认以下权限已授予选择的账号：
        <ul>
            <li>作为操作系统一部分运行
            <li>备份文件和目录
            <li>作为服务登录
            <li>还原文件和目录 </li>
        </ul>
        <li>确认选择的账号是user组的成员。
        <li>确认选择的账号获得了访问所有<code>文档</code>和<code>脚本</code>目录的权力(最少需要读取和浏览访问)。
        <li>确认选择的账号对Apache<code>日志</code>目录有读/写/删除访问权限！ </li>
    </ul>
    <p>如果你允许使用这个帐号登录为一个用户，你就可以自己登录上去测试执行脚本、读取web页的权限，还可以用控制台窗口启动Apache。如果这样工作正常，你又执行了上述的操作，那么Apache就能够正常地作为服务运行了。</p>
    <div class=note><strong>错误代码2186</strong>是一个很好的提示，说明你需要检查"log On As"选项，因为服务器不能访问必要的网络资源。 </div>
    </div>
    <div class=top><a href="http://www.uplinux.com/download/doc/apache/ApacheManual/platform/windows.html#page-header"><img alt=top src="http://www.uplinux.com/download/doc/apache/ApacheManual/images/up.gif"></a></div>
    <div class=section>
    <h2><a id=trouble name=trouble>Apache for Windows作为服务运行的故障分析</a></h2>
    <p>当启动Apache为服务的时候你可能会遇到一个来自Windows服务管理器的错误信息。 例如，如果你想使用控制面板中的服务小程序启动Apache，可能会得到下面这条信息：</p>
    <div class=example>
    <p><code>Could not start the apache service on \\COMPUTER <br>Error 1067; The process terminated unexpectedly. </code></p>
    </div>
    <p>启动Apache时一出现问题你就会得到这个错误信息。为了弄清是什么引起了错误， 你应该遵循<a href="http://www.uplinux.com/download/doc/apache/ApacheManual/platform/windows.html#cmdline"><u><font color=#0000ff>从命令行运行Running Apache for Windows</font></u></a>中的建议。</p>
    <p>还有，如果Apache作为服务运行，Apache 1.3.13 目前在Windows NT/2000下把启动错误记录在应用程序事件日志里。 运行事件察看器并选择应用程序日志检查相应纪录。</p>
    <div class=note><strong>即使没有错误信息弹出警告你发生了错误，也应该用事件查看器检查应用程序日志以防有错误发生。</strong></div>
    </div>
    <div class=top><a href="http://www.uplinux.com/download/doc/apache/ApacheManual/platform/windows.html#page-header"><img alt=top src="http://www.uplinux.com/download/doc/apache/ApacheManual/images/up.gif"></a></div>
    <div class=section>
    <h2><a id=cmdline name=cmdline>从命令行运行Apache</a></h2>
    <p>要了解从命令行控制Apache服务的细节，请参照<a href="http://www.uplinux.com/download/doc/apache/ApacheManual/platform/windows.html#cmdline"><u><font color=#0000ff>控制台命令行</font></u></a>部分。</p>
    </div>
    <div class=top><a href="http://www.uplinux.com/download/doc/apache/ApacheManual/platform/windows.html#page-header"><img alt=top src="http://www.uplinux.com/download/doc/apache/ApacheManual/images/up.gif"></a></div>
    <div class=section>
    <h2><a id=signal name=signal>控制服务方式的Apache</a></h2>
    <p>可以以服务方式安装并运行Apache的多个实例。像下面这样启动、重启及关闭/停止Apache服务：</p>
    <div class=example>
    <p><code>apache -n "服务名" -k start <br>apache -n "服务名" -k restart <br>apache -n "服务名" -k shutdown <br>apache -n "服务名" -k stop </code></p>
    </div>
    <p>对于缺省的"Apache"服务，选项<code>-n</code>仍然需要，因为如果命令中使用<code>-k</code>选项而没有<code>-n</code> 选项的话，命令会作用在运行于控制台窗口的Apache上。引号只是在服务名含有空格时才是必要的。</p>
    <div class=note><strong>注意<code>-k shutdown</code>的别名<code>-k stop</code>只是到了1.3.13版本才被引入。 </strong>早期版本的Apache只认识<code>-k shutdown</code>选项。先于1.3.3版本的Apache不认识<em>任何</em><code>-k</code>选项！</div>
    <p>此外，你可以使用NT本机命令<code>NET</code>来启动和停止Apache服务，像这样：</p>
    <div class=example>
    <p><code>NET START "服务名" <br>NET STOP "服务名" </code></p>
    </div>
    <p>同样，引号只是在服务名含有空格时才是必需的。</p>
    </div>
    <div class=top><a href="http://www.uplinux.com/download/doc/apache/ApacheManual/platform/windows.html#page-header"><img alt=top src="http://www.uplinux.com/download/doc/apache/ApacheManual/images/up.gif"></a></div>
    <div class=section>
    <h2><a id=win95svc name=win95svc>高度试验性的Windows 95/98 服务</a></h2>
    <div class=note><strong>只有Apache 1.3.13 及以后版本才有Windows 95 and 98 下的服务选项。</strong>早期版本的Apache在Windows 95/98 下只支持控制台窗口方式运行。</div>
    <p>对于让Apache在Windows 95/98 下以类似Windows NT/2000服务的方式运行有一些支持。都是<em>高度试验性</em>的, 即使能够工作，Apache软件基金会将不会证实其可靠性和未来的支持。继续进行你自己的冒险吧！</p>
    <p>一旦你确认Apache在<a href="http://www.uplinux.com/download/doc/apache/ApacheManual/platform/windows.html#cmdline"><u><font color=#0000ff>命令行提示符</font></u></a>下正确工作，你就可以像在Windows NT/2000版本下那样用同样的命令安装、控制和卸载Apache服务。</p>
    <p>但是，其中有相当大的区别你需要注意：</p>
    <p>如果你输入下列命令，Apache会尝试启动，如果成功他将在后台运行：</p>
    <div class=example>
    <p><code>Apache -n "服务名" -k start </code></p>
    </div>
    <p>例如，通过桌面的快捷方式运行，如果服务启动成功一个控制台窗口会快速闪过并立刻消失。 如果启动时Apache检测到比如<code>httpd.conf</code>文件中有不正确的设置这样的问题，则控制台窗口会保持可见。 这样将显示一个有助于追踪错误原因的错误信息。</p>
    <p>Windows 95/98 不支持<code>NET START</code>或者<code>NET STOP</code>命令，因此你在命令中必须使用Apache的服务控制选项。 你可能希望为每个命令设置一个快捷方式以便你能够只需要从开始菜单或者桌面一点就能执行所需的操作。</p>
    <p>Apache和Windows 95/98 没有提供让Apache服务以特定的具有网络权限的用户身份运行的支持。 实际上，Windows 95/98 在本地机器上根本没有提供安全性。这就是Apache软件基金会从不支持使用Windows 95/98 作为公用httpd服务器的原因。这个便利存在的唯一目的是协助用户开发web内容和学习Apache服务器，或者也许在一个安全的、私有的网络上充当intranet服务器。</p>
    </div>
    <div class=top><a href="http://www.uplinux.com/download/doc/apache/ApacheManual/platform/windows.html#page-header"><img alt=top src="http://www.uplinux.com/download/doc/apache/ApacheManual/images/up.gif"></a></div>
    <div class=section>
    <h2><a id=test name=test>安装的测试</a></h2>
    <p>启动Apache运行以后(不管是控制台窗口还是作为服务)， 它会在80端口上进行监听(除非你改变了配置文件中的<code class=directive><a href="http://www.uplinux.com/download/doc/apache/ApacheManual/mod/mpm_common.html#listen"><u><font color=#0000ff>Listen</font></u></a></code>指令。 要连接到服务器访问默认页面，启动一个浏览器并输入下列URL:</p>
    <div class=example>
    <p><code>http://localhost/ </code></p>
    </div>
    <p>应该出现一个欢迎页面作为应答，并且页面上有到Apache用户手册的链接。 如果什么都没有发生或是得到了一个错误，检查<code>logs</code>文件夹中的 <code>error_log</code>文件。如果你的主机没有联网，你也许需要输入这样的URL:</p>
    <div class=example>
    <p><code>http://127.0.0.1/ </code></p>
    </div>
    <p>一旦你的基本配置可以工作了，你应该编辑<code>conf</code>目录下的文件来恰当地配置Apache。 此外，如果你改变了作为NT服务运行的Apache的配置， 你应该首先尝试从命令行启动来保证能够无错地启动Apache服务。</p>
    <p>因为Apache <em>不能</em> 与其他TCP/IP应用程序共享同一个端口， 你可能需要先停止或者卸载某些特定的服务。这包括(但不限于) 别的web服务器和BlackIce那样的防火墙。如果你只能在禁止其他服务的情况下启动Apache， 那么需要重新配置Apache或者其他程序使它们不监听同一个TCP/IP端口。</p>
    </div>
    </li>
</ul>
<img src ="http://www.cnitblog.com/stomic/aggbug/42403.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/stomic/" target="_blank">大话人生</a> 2008-04-15 21:55 <a href="http://www.cnitblog.com/stomic/archive/2008/04/15/42403.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用 Apache 和 Subversion 搭建安全的版本控制环境</title><link>http://www.cnitblog.com/stomic/archive/2008/04/15/42395.html</link><dc:creator>大话人生</dc:creator><author>大话人生</author><pubDate>Tue, 15 Apr 2008 07:56:00 GMT</pubDate><guid>http://www.cnitblog.com/stomic/archive/2008/04/15/42395.html</guid><wfw:comment>http://www.cnitblog.com/stomic/comments/42395.html</wfw:comment><comments>http://www.cnitblog.com/stomic/archive/2008/04/15/42395.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/stomic/comments/commentRss/42395.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/stomic/services/trackbacks/42395.html</trackback:ping><description><![CDATA[<blockquote>
<p>作为新一代的开源版本控制工具，Subversion 以其目录版本化、原子提交、版本化的元数据、更加有效的分支和标签等优良特性，正逐渐受到开源软件社区的重视，并有望取代 CVS，成为开源软件开发中版本控制的首选系统。在服务器端，Subversion 最大的独特之处，在于它可以通过一个扩展模块与 Apache 的 HTTP 服务器相结合，实现很多高级的管理功能和安全特性。与 CVS 相比，Subversion 实现了更加先进和安全的用户认证功能。在 Apache 的支持下，用户可以通过 HTTP 协议访问版本库，管理员可以对用户访问 HTTP 的权限做出具体的设置，同时 Subversion 还可以获得 SSL 传输加密，用户数据加密，以及目录级的访问控制等特性。</p>
<p>本文将在服务器端配置工作的角度，结合作者在实际开发工作当中的配置实例，介绍 Subversion 服务器端的基本配置和管理，以及如何将 Subversion 与 Apache 结合，实现一些高级管理功能。</p>
</blockquote><!--start RESERVED FOR FUTURE USE INCLUDE FILES--><!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters --><!--end RESERVED FOR FUTURE USE INCLUDE FILES-->
<p><a name=N10073><span class=atitle>Subversion 简介</span></a></p>
<p>在开源软件的开发过程当中，由于开发方式自由和开发人员分散这些特性，版本控制问题一直是关系到项目成败的重要问题。没有版本控制系统的支持，开源软件的开发过程就是混乱和不可控制的。</p>
<p>长期以来，CVS 作为一种普遍采用的开源版本控制工具，在很多的开源软件项目当中充当了重要的角色。在 Eclipse 当中，更是把 CVS 作为一个默认的插件，与 Ant，JUnit 等工具并列在一起，成为 Eclipse 软件开发的基本工具。近年来，随着开源社区的发展，一种功能更加强大的开源版本控制工具逐渐进入了人们的视野，那就是 Subversion，凭借着更为优秀的特性，Subversion 正在逐步取代 CVS，成为新一代的开源版本控制工具。</p>
<p>相比 CVS，Subversion 中的目录、文件以及改名等元数据都是被版本化的，例如文件的改名、拷贝等等操作；而且，在 Subversion 中，提交操作是不可分割的，修订版本号是基于每次提交操作而非文件；另外，Subversion 可以独立运行，有着轻量级的分支（Branching）与标签（Tagging）操作，版本库可以采用数据库（Berkeley DB）或者是使用特定格式的文件进行存储，对二进制文件进行处理更为有效；最后，Subversion 工具以及相关插件都有着很好的国际化支持，可以支持包括简体中文在内的多种语言版本，方便全球各地的开发人员。这些优秀的新特性，使得 Subversion 成为开源社区目前的最佳选择。</p>
<p>对于普通用户，即应用程序开发者而言，尤其是对 Eclipse 的用户而言，Subversion 的使用十分的简单。通过官方提供的 Eclipse 插件 Subclipse，用户可以在 Eclipse 里面很方便的使用 Subversion 客户端的各项基本功能。具体的客户端设置和使用方法，请参考 <a href="http://www.ibm.com/developerworks/cn/java/j-lo-apache-subversion/#resources" cmImpressionSent="1"><font color=#5c81a7>Subversion 官方网站</font></a>和 <a href="http://www.ibm.com/developerworks/cn/java/j-lo-apache-subversion/#resources" cmImpressionSent="1"><font color=#5c81a7>Subclipse 官方网站</font></a>。简单说来，在 Eclipse 中使用 Subversion 插件的基本功能，如更新、提交、同步、分支等等，基本上同使用 Eclipse 自带的 CVS 插件一模一样，这样，用户就可以从 CVS 方便的转移到 Subversion。</p>
<p>目前，Subversion 已经升级到 1.3.2 版本，相关下载、特性说明和详细使用手册可以在 <a href="http://subversion.tigris.org/" cmImpressionSent="1"><font color=#5c81a7>Subversion 主页</font></a>上找到。</p>
<p><a name=N10095><span class=atitle>简单的版本库管理</span></a></p>
<p>有了简单易用的客户端，大部分的用户都可以轻松使用 Subversion 了，不过，作为服务器端的管理人员，还必须进一步了解服务器端的基本配置管理，才可以充分利用 Subversion 的各项优秀特性。</p>
<p><a name=N1009F><span class=smalltitle><strong><font face=Arial>版本库创建</font></strong></span></a></p>
<p>Subversion 的版本库（repository），就是位于服务器端，统一管理和储存数据的地方。本文中，我们以 Linux 为例，介绍在服务器端配置和管理 Subversion 版本库的基本方法。</p>
<p>要创建一个版本库，首先要确定采用哪种数据存储方式。在 Subversion 中，版本库的数据存储有两种方式，一种是在 Berkeley DB 数据库中存放数据；另一种是使用普通文件，采用自定义的格式来储存，称为 FSFS。</p>
<p>两种存放方式各有优缺点，读者可以参考 <a href="http://svnbook.org/" cmImpressionSent="1"><font color=#5c81a7>http://svnbook.org/</font></a> 上面的文档来了解两者详细的比较和区别，这里，我们仅引用上述文档当中的简单对照表，给出一个简明的比较。</p>
<br><a name=table1><strong>表1 两种版本库数据存储对照表</strong></a><br>
<table class=data-table-1 cellSpacing=0 cellPadding=0 width="80%" border=0>
    <tbody>
        <tr>
            <th>特性</th>
            <th>Berkeley DB</th>
            <th>FSFS</th>
        </tr>
        <tr>
            <td class=tb-row>对操作中断的敏感</td>
            <td>很敏感；系统崩溃或者权限问题会导致数据库&#8220;塞住&#8221;，需要定期进行恢复。</td>
            <td>不敏感</td>
        </tr>
        <tr class=alt-row>
            <td class=tb-row>可只读加载</td>
            <td>不能</td>
            <td>可以</td>
        </tr>
        <tr class=tb-row>
            <td class=tb-row>存储平台无关</td>
            <td>不能</td>
            <td>可以</td>
        </tr>
        <tr class=alt-row>
            <td class=tb-row>可从网络文件系统访问</td>
            <td>不能</td>
            <td>可以</td>
        </tr>
        <tr class=tb-row>
            <td class=tb-row>版本库大小</td>
            <td>稍大</td>
            <td>稍小</td>
        </tr>
        <tr class=alt-row>
            <td class=tb-row>扩展性：修订版本树数量</td>
            <td>无限制</td>
            <td>某些本地文件系统在处理单一目录包含上千个条目时会出现问题。</td>
        </tr>
        <tr class=tb-row>
            <td class=tb-row>扩展性：文件较多的目录</td>
            <td>较慢</td>
            <td>较慢</td>
        </tr>
        <tr class=alt-row>
            <td class=tb-row>检出最新代码的速度</td>
            <td>较快</td>
            <td>可以</td>
        </tr>
        <tr class=tb-row>
            <td class=tb-row>大量提交的速度</td>
            <td>较慢，但时间被分配在整个提交操作中</td>
            <td>较快，但最后较长的延时可能会导致客户端操作超时</td>
        </tr>
        <tr class=alt-row>
            <td class=tb-row>组访问权处理</td>
            <td>对于用户的 umask 设置十分敏感，最好只由一个用户访问。</td>
            <td>对 umask 设置不敏感</td>
        </tr>
        <tr class=tb-row>
            <td class=tb-row>功能成熟时间</td>
            <td>2001 年</td>
            <td>2004 年</td>
        </tr>
    </tbody>
</table>
<p>确定了具体的数据存储类型，只要在命令行当中执行 <code>svnadmin</code> 命令就可以创建一个 Subversion 版本库，命令如下</p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode># 创建文件夹
            $ mkdir /etc/svn/
            $ mkdir /etc/svn/repos
            # 运行创建版本库的命令，指定数据存储为 FSFS，如果要指定为 Berkeley DB，则将 fsfs 替换为 bdb
            $ svnadmin create --fs-type fsfs /etc/svn/repos
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>如果一切正常，命令执行后不会有任何反馈信息而迅速返回，这样，一个新的版本库就被创建出来了。我们来查看一下生成的版本库结构：</p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>$ ls -l /etc/svn/repos
            总用量 56
            drwxrwxr-x  2 robert robert 4096  8月 27 17:27 conf
            drwxrwxr-x  2 robert robert 4096  8月 27 17:27 dav
            drwxrwsr-x  5 robert robert 4096  8月 27 17:27 db
            -r--r--r--  1 robert robert    2  8月 27 17:27 format
            drwxrwxr-x  2 robert robert 4096  8月 27 17:27 hooks
            drwxrwxr-x  2 robert robert 4096  8月 27 17:27 locks
            -rw-rw-r--  1 robert robert  229  8月 27 17:27 README.txt
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>其中，conf 目录下存放了版本库的配置文件，包括用户访问控制和权限控制等内容，文件本身的注释说明十分详细，读者可以根据注释自行配置；dav 目录是提供给 Apache 相关模块的目录，目前为空；db 目录下存放着 Subversion 所要管理的所有受版本控制的数据，不同的存储方式（Berkeley DB 或者 FSFS）下有着不同的目录结构，不过我们一般不用直接修改和查看这个目录下的内容，Subversion 的命令可以安全的操作这个目录；另外，hooks 目录存放着钩子脚本及其模版（一种版本库事件触发程序），locks 目录存放着 Subversion 版本库锁定数据，format 文件记录了版本库的布局版本号。</p>
<p><a name=N1017C><span class=smalltitle><strong><font face=Arial>项目添加</font></strong></span></a></p>
<p>有了新建的版本库，就可以往里面添加项目了。不过，管理员必须考虑的问题是，应该将每一个项目分别放在不同的版本库里面，还是应该将它们放在统一的版本库里面。统一的版本库可以让管理员更加容易的升级和备份，不过，由于访问权限控制是针对整个版本库的，所以，统一的版本库也为不同项目配置不同的访问权限带来了麻烦。所以，管理员应该根据实际情况权衡考虑。</p>
<p>我们以统一的版本库为例，添加两个项目 project_luni 和 project_test。要做到这个，最好的办法就是用 <code>svn import</code> 命令导入已有的目录树。</p>
<p>首先，我们在一个临时目录下，根据 Subversion 版本控制的一般布局结构，创建出两个项目的主要目录树，如下：</p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>/etc/svn/tmp
            |
            ――project_luni
            |	|
            |	――branches
            |	|
            |	――tags
            |	|
            |	――trunk
            |
            ――project_test
            |
            ――branches
            |
            ――tags
            |
            ――trunk
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>然后，用 <code>svn import</code> 命令来进行项目的导入：</p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>$ svn import /etc/svn/tmp/ file:///etc/svn/repos/ --message "init"
            新增           /etc/svn/tmp/project_test
            新增           /etc/svn/tmp/project_test/trunk
            新增           /etc/svn/tmp/project_test/branches
            新增           /etc/svn/tmp/project_test/tags
            新增           /etc/svn/tmp/project_luni
            新增           /etc/svn/tmp/project_luni/trunk
            新增           /etc/svn/tmp/project_luni/branches
            新增           /etc/svn/tmp/project_luni/tags
            提交后的修订版为 1。
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p><a name=N101A1><span class=smalltitle><strong><font face=Arial>版本库查看</font></strong></span></a></p>
<p>作为版本库管理员，我们经常需要查看 Subversion 版本库的状况，这就需要一些&#8220;只读&#8221;的查看工具。</p>
<p>在上述项目导入完成以后，我们可以用 <code>svn list</code> 确认导入的项目是否正确：</p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>$ svn list --verbose file:///etc/svn/repos/
            1 robert                 8月 27 18:24 project_luni/
            1 robert                 8月 27 18:24 project_test/
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>另外，如果要查看最新修订版本的信息，可以使用 <code>svnlook info</code> 命令：</p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>$ svnlook info /etc/svn/repos/
            robert
            2006-08-27 18:24:27 +0800 (日, 27  8月 2006)
            0
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>命令输出了这个版本库的最新修订版本信息，包括作者、时间、日志字数和日志内容等。除开最新修订版以外，我们还可以在命令后面接上 <code>&#8220;--revision 版本号&#8221;</code> 来指定某一个修订版的显示。</p>
<p>另外，我们还可以用如下命令来显示版本库的具体树形结构，后面的 <code>&#8220;--show-ids&#8221; </code>选项指定显示每一个显示元素的修改版本 ID。</p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>$ svnlook tree /etc/svn/repos/ --show-ids
            / &lt;0.0.r1/1007&gt;
            project_test/ &lt;1.0.r1/333&gt;
            trunk/ &lt;2.0.r1/0&gt;
            branches/ &lt;3.0.r1/74&gt;
            tags/ &lt;4.0.r1/152&gt;
            project_luni/ &lt;5.0.r1/793&gt;
            trunk/ &lt;6.0.r1/454&gt;
            branches/ &lt;7.0.r1/530&gt;
            tags/ &lt;8.0.r1/609&gt;
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p><a name=N101D6><span class=smalltitle><strong><font face=Arial>其他</font></strong></span></a></p>
<p>这里有一个需要新手，尤其是习惯了 Subversion 客户端命令 <code>&#8220;svn&#8221; </code>的用户注意的问题，那就是，<code>&#8220;svnadmin&#8221; </code>和 <code>&#8220;svnlook&#8221;</code> 都被认为是服务器端的管理工具，只被用于版本库所在的机器，用来检查和维护版本库，不能通过网络来执行任务。所以，试图将 URL 甚至本地 file 路径传递给这两个程序，都是错误的。</p>
<p>Subversion 还有很多管理工具可供管理员应用，需要了解这项工具的使用方法，读者们可以用 <code>svn help</code>, <code>svnadmin help</code>, <code>svnlook help</code> 等等命令查看帮助信息，另外，<a href="http://www.ibm.com/developerworks/cn/java/j-lo-apache-subversion/#resources" cmImpressionSent="1"><font color=#5c81a7>Subversion 参考手册</font></a>提供了更为全面和详细的使用介绍。</p>
<p><a name=N101FF><span class=atitle>基本的服务器配置</span></a></p>
<p>Subversion 设计了一个抽象的网络层，版本库建立完毕之后，可以通过各种服务器向外公布。svnserve 是 Subversion 自带的一个小型的服务器，它使用独立的协议与客户端。我们可以通过</p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>svnserve &#8211;i
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>作为 inetd 启动或者</p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>svnserve &#8211;d
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>作为守护进程启动一个服务。服务器启动后，客户端即可以通过绝对路径访问。如上例可以访问 <code>svn://服务器IP/etc/svn/repos</code>。同时可以指定一些选项，常用的如 <code>-r</code>，用来指定版本库的根路径，例如假设版本库位于 /etc/svn/repos：
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>svnserve &#8211;d -r /etc/svn
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>则客户端可以通过如下 URL 访问服务器：<code>svn://服务器IP/repos</code>， 这样可以有效的避免暴露本地路径。另外如 <code>--listen-port</code>，<code>--listen-host </code>可以指定绑定的地址和端口，<code>-R</code> 可以强制设定为 Read-Only 模式。如果在 Windows 操作系统下，可以将版本库设定在 C 分区，如 <code>c:\svnroot\repos</code> 可以通过 <code>svn://服务器IP/svnroot/repos访问</code>，如果在其他分区，就必须要通过 <code>-r</code> 选项来指定 root 位置。</p>
<p>svnserve 可以通过配置 svnserve.conf 来进行一些简单的访问权限控制。你可以在版本库的 conf 子文件夹下发现这个文件。文件的初始内容大致如下：</p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>[general]
            # anon-access = read
            # auth-access = write
            password-db = passwd
            # authz-db = authz
            # realm = My First Repository
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>其中 <code>anon-access </code>表示匿名用户的权限，<code>auth-access</code> 表示认证用户的权限设置，<code>password-db</code> 指向保存用户帐号密码的文件的位置，可以使用相对路径。svnserve 只能对全局提供简单的访问控制，如果想要更加灵活的方式，可以使用 Apache Http Server 作为向外公布版本库的方式。</p>
<p><a name=N10259><span class=atitle>与 Apache Http Server 的结合</span></a></p>
<p>通过 Http 协议访问版本库是 Subversion 的亮点之一。使用 Http 协议意味着只需要打开浏览器，输入 URL 即可轻松的浏览整个版本库。灵活通常带来复杂性，Http 方式相对于 svnserve 方式来说需要更多的配置。</p>
<p>由于 Subversion 需要版本化的控制，因此标准的 Http 协议不能满足需求。要让 Apache 与 Subversion 协同工作，需要使用 WebDAV（Web 分布式创作和版本控制）。WebDAV 是 HTTP 1.1 的扩展，关于 WebDAV 的规范和工作原理，可以参考 <a href="http://www.ibm.com/developerworks/cn/java/j-lo-apache-subversion/#resources" cmImpressionSent="1"><font color=#5c81a7>IETF RFC 2518</font></a>。</p>
<p>为了使 Subversion 与 dav 模块通信，需要安装 mod_dav_svn 插件，可以在 Subversion 的安装目录中找到。将其拷贝到 Apache 安装目录的 modules 文件夹下。接下来就是配置 Apache 的 httpd.conf 文件，让 Apache 在启动的时候加载上述模块。</p>
<p>需要添加的内容如下：</p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>LoadModule dav_module modules/mod_dav.so
            LoadModule dav_svn_module modules/mod_dav_svn.so
            &lt;Location /repos&gt;
            DAV svn
            SVNPath /etc/svn/repos
            &lt;/Location&gt;
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>首先需要启用 dav_module，然后加载 dav_svn_module。Location 标签指出访问的 URL 以及在服务器上的实际位置。配置完毕后重新启动 Apache，打开浏览器，输入 <code>http://服务器IP/repos</code> 将会看到如下画面：</p>
<br><a name=fig1><strong>图1. 一个初始版本库</strong></a><br><img alt=初始版本库 src="http://www.ibm.com/developerworks/cn/java/j-lo-apache-subversion/img/svn.jpg"> <br>
<p>这表示 Apache 的 dav_svn 模块已经可以正常工作了。用户可以使用任何一种 Subversion 的客户端通过 Http 协议访问你的版本库。</p>
<p>如果想要指定多个版本库，可以用多个 Location 标签，也可以使用 SVNParentPath 代替 SVNPath，例如在 <code>/etc/svn</code> 下有多个版本库 repos1，repos2 等等，用如下方式指定：</p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>&lt;Location /repos&gt;
            DAV svn
            SVNParentPath /etc/svn
            &lt;/Location&gt;
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>"SVNParentPath /etc/svn" 表示 /etc/svn 下的每个子目录都是一个版本库。可以通过 <code>http://服务器IP/repos/repos1</code>，<code>http://服务器IP/repos/repos2</code> 来访问。</p>
<p>现在你的版本库任何人都可以访问，并且有完全的写操作权限。也就是说任何人都可以匿名读取，修改，提交，以及删除版本库中的内容。显然大部分场合这是不符合需求的。那么如何进行权限设置呢，Apache 提供了基本的权限设置：</p>
<p>首先需要创建一个用户文件。Apache 提供了一个工具 htpasswd，用于生成用户文件，可以在 Apache 的安装目录下找到。具体使用方法如下：</p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>htpasswd etc/svn/passwordfile username
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>如果 passwordfile 不存在，可以加上 <code>-c</code> 选项让 htpasswd 新建一个。创建好的文件内容是用户名加上密码的 MD5 密文。</p>
<p>接下来修改 httpd.conf，在 Location 标签中加入如下内容：</p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>AuthType Basic
            AuthName "svn repos"
            AuthUserFile /etc/svn/passwordfile
            Require valid-user
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>重新启动 Apache， 打开浏览器访问版本库。Apache 会提示你输入用户名和密码来认证登陆了，现在只有 passwordfile 文件中设定的用户才可以访问版本库。也可以配置只有特定用户可以访问，替换上述 "Require valid-user" 为 "Require user tony robert" 将只有 tony 和 robert 可以访问该版本库。</p>
<p>有的时候也许不需要这样严格的访问控制，例如大多数开源项目允许匿名的读取操作，而只有认证用户才允许写操作。为了实现更为细致的权限认证，可以使用 Limit 和 LimitExcept 标签。例如：</p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>&lt;LimitExcept GET PROPFIND OPTIONS REPORT&gt;
            require valid-user
            &lt;/LimitExcept&gt;
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>如上配置将使匿名用户有读取权限，而限制只有 passwordfile 中配置的用户可以使用写操作。如果这还不能满足你的要求，可以使用 Apache 的 mod_authz_svn 模块对每个目录进行认证操作。</p>
<p><a name=N102CB><span class=smalltitle><strong><font face=Arial>用 mod_authz_svn 进行目录访问控制</font></strong></span></a></p>
<p>首先需要让 Apache 将 mod_authz_svn 模块加载进来。在 Subversion 的安装目录中找到 mod_auth_svn 模块，将其拷贝到 Apache 安装目录的 modules 子目录下。修改 httpd.conf 文件，找到</p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>LoadModule dav_svn_module modules/mod_dav_svn.so
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>在其后面加上</p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>LoadModule authz_svn_module modules/mod_authz_svn.so
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>现在可以在 Location 标签中使用 authz 的功能了。一个基本的 authz 配置如下：</p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>&lt;Location /repos&gt;
            DAV svn
            SVNPath /etc/svn/repos
            AuthType Basic
            AuthName "svn repos"
            AuthUserFile /etc/svn/passwd
            AuthzSVNAccessFile /etc/svn/accesspolicy
            Satisfy Any
            Require valid-user
            &lt;/Location&gt;
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>AuthzSVNAccessFile 指向的是 authz 的策略文件，详细的权限控制可以在这个策略文件中指定，如：</p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>#两个分组：committers，developers
            [groups]
            committers = paulex richard
            developers = jimmy michel spark sean \
            steven tony robert
            #在根目录下指定所有的用户有读权限
            [/]
            * = r
            #追加 committers 组用户有读写权限
            @committers = rw
            #在 branches/dev 目录下指定 developers 组的用户有读写权限
            [/branches/dev]
            @developers = rw
            #在 /tags 组下给予用户 tony 读写权限
            [/tags]
            tony = rw
            #禁止所有用户访问 /private 目录
            [/private]
            * =
            #给 committers 组用户读权限
            @committers= r
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>使用 SVNParentPath 代替 SVNPath 来指定多个版本库的父目录时，其中所有的版本库都将按照这个策略文件配置。例如上例中 tony 将对所有版本库里的 /tags 目录具有读写权限。如果要对具体每个版本库配置，用如下的语法：</p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>[groups]
            project1_committers = paulex richard
            project2_committers = jimmy michel spark sean \
            steven tony robert
            [repos1:/]
            * = r
            @ project1_committer = rw
            [repos2:/]
            * = r
            @ project2_committer = rw
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>这样项目1的 committer 组只能对 repos1 版本库下的文件具有写权限而不能修改版本库 repos2，同样项目2的 commiter 也不能修改 repos1 版本库的文件。</p>
<p><a name=N102FD><span class=smalltitle><strong><font face=Arial>用 MySQL 代替文件形式存放密码</font></strong></span></a></p>
<p>到目前为止我们的用户名密码文件还是以文本文件形式存放在文件系统中的，出于安全性的需要或者单点登陆等可扩展性的考虑，文本文件的管理方式都不能满足需求了。通过 Apache 的 module_auth_mysql 模块，我们可以用 MySQL 来保存用户信息。该模块的主页在 <a href="http://modauthmysql.sourceforge.net/" target=_blank cmImpressionSent="1"><font color=#5c81a7>http://modauthmysql.sourceforge.net/</font></a>，你也可以在 <a href="http://modules.apache.org/" target=_blank cmImpressionSent="1"><font color=#5c81a7>http://modules.apache.org/</font></a> 找到它的发行版本。安装方法同上述 Apache 的模块一样，拷贝至 modules 目录并在 httpd.conf 文件中添加如下语句：</p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>LoadModule mysql_auth_module modules/mod_auth_mysql.so
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>相应的 Location 区域改写为：</p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>&lt;Location /repos&gt;
            AuthName "MySQL auth"
            AuthType Basic
            AuthMySQLHost localhost
            AuthMySQLCryptedPasswords Off
            AuthMySQLUser root
            AuthMySQLDB svn
            AuthMySQLUserTable users
            require valid-user
            &lt;/Location&gt;
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>然后在 mysql 中添加名为 svn 的数据库，并建立 users 数据表：</p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>create database svn;
            use svn;
            CREATE TABLE users (
            user_name CHAR(30) NOT NULL,
            user_passwd CHAR(20) NOT NULL,
            user_group CHAR(10),
            PRIMARY KEY (user_name)
            );
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>在 users 表中插入用户信息</p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>insert into users values('username','password','group');
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>重新启动 Apache，在访问版本库的时候 Apache 就会用 mysql 数据表中的用户信息来验证了。 </p>
<p><a name=N10331><span class=smalltitle><strong><font face=Arial>用 SSL 实现安全的网络传输</font></strong></span></a></p>
<p>通过 Apache 的网络链接，版本库中的代码和数据可以在互联网上传输，为了避免数据的明文传输，实现安全的版本控制，需要对数据的传输进行加密。Apache 提供了基于 SSL 的数据传输加密模块 mod_ssl，有了它，用户就可以用 https 协议访问版本库，从而实现数据的加密传输了。SSL 协议及其实现方式，是一个非常复杂的话题，本文只是介绍 Apache 提供的最基本的SSL配置方法，更加详细的介绍内容，请参考 <a href="http://httpd.apache.org/docs-2.0/ssl/" cmImpressionSent="1"><font color=#5c81a7>http://httpd.apache.org/docs-2.0/ssl/</font></a> 上的文档。</p>
<p>开始配置前，我们需要一个实现 Apache 中 SSL 模块的动态程序库，通常名为 mod_ssl.so，及其配置文件，通常名为 ssl.conf。这个实现是跟 Apache 的版本相关的，不匹配的版本是不能用的；而且，并不是每一个 Apache 的版本都自带了相关实现文件，很多情况下，我们需要自己去搜寻相关文件。另外，我们还需要 OpenSSL 软件及其配置文件，来生成加密密钥和数字证书。这里，我们可以使用一些免费网站，如 <a href="http://hunter.campbus.com/" target=_blank cmImpressionSent="1"><font color=#5c81a7>http://hunter.campbus.com/</font></a> 上提供的集成版本的 Apache。</p>
<p>有了相关的工具和文件，我们就可以开始生成 SSL 的证书和密钥了。首先，我们需要找到 openssl 程序及其配置文件 openssl.cnf，运行如下命令来生成 128 位的 RSA 私有密钥文件</p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>my-server.key：
            openssl genrsa -des3 -out my-server.key 1024
            Loading 'screen' into random state - done
            Generating RSA private key, 1024 bit long modulus
            .....++++++
            ........++++++
            e is 65537 (0x10001)
            Enter pass phrase for server.key:********
            Verifying - Enter pass phrase for server.key:********
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>命令运行期间需要用户输入并确认自己的密码。</p>
<p>现在，我们需要 SSL 的认证证书，证书是由 CA（certificate authority） 发放并且认证的。为此，我们可以用如下命令生成一个 CSR(Certificate Signing Request) 文件发给 CA，从而得到 CA 的认证：</p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>openssl req -new -key my-server.key -out my-s erver.csr -config openssl.cnf
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>当然，一般情况下，如果 Subversion 的用户不是太多，安全情况不是很复杂，我们也可以生成一个自签名的认证证书，从而省去了向 CA 申请认证的麻烦。如下命令：</p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>openssl req -new -key my-server.key -x509 -out my-server.crt -config openssl.cnf
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>以上两个命令都需要用户输入那个 key 文件的密码，以及一些网络设置信息，如域名，邮箱等等，这里输入的服务器域名应该与 Apache 配置文件当中的一致。现在，我们可以在 Apache 的 conf 目录下新建一个 ssl 目录，将 my-server.key 和 my-server.crt 文件都移动到 ssl 目录里面。然后修改 ssl.conf 文件，将 SSLCertificateKeyFile 和 SSLCertificateFile 项指向这两个文件。</p>
<p>如果 Apache 的 module 目录里面没有 mod_ssl.so 文件，可以将事先准备好的文件拷贝过去。然后，我们可以设置 Apache 的配置文件 httpd.conf，将 ssl 模块加入其中：</p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>LoadModule ssl_module modules/mod_ssl.so
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>然后，在配置文件的最后，加上如下 SSL 相关配置项：</p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>SSLMutex default
            SSLRandomSeed startup builtin
            SSLSessionCache none
            ErrorLog logs/SSL.log
            LogLevel info
            &lt;VirtualHost svntest.ut.cn.ibm.com:443&gt;
            SSLEngine On
            SSLCertificateFile conf/ssl/my-server.crt
            SSLCertificateKeyFile conf/ssl/my-server.key
            &lt;/VirtualHost&gt;
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>这样，基本的设置工作就完成了。重新启动 Apache 服务器，现在可以用 https 协议代替 http 协议来访问版本库了。如果要限定版本库只能用 https 访问，我们可以在 Apache 配置文件当中 Subversion 部分加上 &#8220;SSLRequireSSL&#8221;。如下：</p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>&lt;Location /repos&gt;
            DAV svn
            SVNPath /etc/svn/repos
            &#8230;&#8230;&#8230;&#8230;.#other items
            SSLRequireSSL
            &lt;/Location&gt;
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p><a name=N1037D><span class=atitle>总结</span></a></p>
<p>Subversion 以其优良的版本控制功能，灵活的网络访问模型，以及与 Apache 服务器联合配置所带来的更强大的管理控制功能，逐渐在开源软件开发的实践当中得到广泛的应用。本文重点介绍了 Subversion 服务器端的配置以及与 Apache 服务器联合配置的基本步骤和简单应用，实现了简单的实例应用。读者如果想要进一步了解相关信息，请参考文章后面列出的相关资料。</p>
<img src ="http://www.cnitblog.com/stomic/aggbug/42395.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/stomic/" target="_blank">大话人生</a> 2008-04-15 15:56 <a href="http://www.cnitblog.com/stomic/archive/2008/04/15/42395.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>IIS配置SMTP服务器，ASP.net发送邮件</title><link>http://www.cnitblog.com/stomic/archive/2008/04/09/42172.html</link><dc:creator>大话人生</dc:creator><author>大话人生</author><pubDate>Wed, 09 Apr 2008 08:10:00 GMT</pubDate><guid>http://www.cnitblog.com/stomic/archive/2008/04/09/42172.html</guid><wfw:comment>http://www.cnitblog.com/stomic/comments/42172.html</wfw:comment><comments>http://www.cnitblog.com/stomic/archive/2008/04/09/42172.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cnitblog.com/stomic/comments/commentRss/42172.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/stomic/services/trackbacks/42172.html</trackback:ping><description><![CDATA[<p>Windows 2000/XP用户</p>
<p>　　安装设置服务端</p>
<p>　　Windows XP和2000本身就拥有构件SMTP服务器的功能，只是一般还没有安装。选择&#8220;控制面板&#8594;添加/删除程序&#8594;添加/删除Windows组件&#8221;，弹出&#8220;Windows组件向导&#8221;对话框，在其中双击&#8220;Internet信息服务(IIS)&#8221;项，就会打开详细选择项，选中&#8220;SMTP Service&#8221;，按&#8220;确定&#8221;，插入Windows XP安装盘进行安装(如图1)。</p>
<p>　　<img onclick=get_larger(this) src="http://img.ddvip.com/2006_11/1163472109_ddvip_4263.jpg"></p>
<p>　　安装好SMTP服务器后，选择&#8220;控制面板&#8594;性能和维护&#8594;管理工具&#8594;Internet信息服务&#8221;打开Internet信息服务设置窗口,在窗口左侧点击本地计算机名，展开本地计算机目录，可以看到有两个分支&#8220;Wed站点&#8221;和&#8220;默认SMTP虚拟服务器&#8221;。在&#8220;默认SMTP虚拟服务器&#8221;上点击鼠标右键选择&#8220;属性&#8221;，打开&#8220;默认SMTP虚拟服务器属性&#8221;窗口。</p>
<p>　　&#8220;常规&#8221;选项卡主要设置IP地址，单击IP地址下拉项选择&#8220;127.0.0.1&#8221;（<span style="COLOR: red">或者是本机IP：172.16.5.87</span>），表示指向本地计算机IP地址，其他项使用默认即可。如果你是局域网接入，拥有固定IP地址，那么IP地址就应该选择相应的地址(如图2)。</p>
<p>　　<img onclick=get_larger(this) src="http://img.ddvip.com/2006_11/1163472111_ddvip_5800.jpg"></p>
<p>　　&#8220;访问&#8221;选项卡中设置访问权限。单击&#8220;身份验证&#8221;，选择&#8220;匿名访问&#8221;，表示任何用户都可以发送，其他两项不用选择；单击&#8220;连接控制&#8221;中的&#8220;连接&#8221;和&#8220;中段限制&#8221;中的&#8220;中断&#8221;，选中&#8220;仅以下列表除外&#8221;，表示可以许接入所有用户的访问。</p>
<p>　　&#8220;邮件&#8221;选项卡中设置邮件传输条件及限制，&#8220;限制邮件大小为&#8221;等四个选项可以使用默认值，无须更改；</p>
<p>　　&#8220;将未传递报告的副本发送到&#8221;可将发送不成功的邮件返回发件人，并且写明不成功的原因；&#8220;死信目录&#8221;设置没有发送成功的邮件被存放的位置。</p>
<p>　　&#8220;传输&#8221;选项中设置邮件传递时间，这里不用修改，使用默认值；&#8220;LDAP路由&#8221;选项用来指定服务器使用的目录服务器标识和属性，这里也不用启动它。</p>
<p>　　&#8220;安全&#8221;选项中设置使用发送服务器的有权用户，默认用户是&#8220;Administrators&#8221;，你可以单击&#8220;添加&#8221;添加使用用户。</p>
<p>　　一切设置好后，你就拥护了自己的邮件发送服务器了！下面我们来看看在Outlook Express和Foxmail中如何设置使用自己的SMTP来发信。</p>
<p>在.net中的web.config文件需要配置成如下代码：<br>&nbsp;&lt;system.net&gt;<br>&nbsp;&nbsp;&lt;mailSettings&gt;<br>&nbsp;&nbsp;&nbsp;&lt;smtp from="<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#106;&#117;&#119;&#97;&#110;&#46;&#121;&#97;&#110;&#103;&#64;&#99;&#108;&#111;&#99;&#104;&#97;&#115;&#101;&#46;&#99;&#111;&#109;">juwan.yang@clochase.com</a>" deliveryMethod="Network"&gt;<br>&nbsp;&nbsp;&nbsp; &lt;network host="172.16.5.87" port="25" defaultCredentials="false" /&gt;&nbsp;<br>&nbsp;&nbsp; &lt;/smtp&gt;<br>&nbsp;&nbsp;&lt;/mailSettings&gt;<br>&nbsp;&lt;/system.net&gt;<br><span style="COLOR: red">此处的host主机IP需要跟SMTP服务器中的IP配置相一致，才能发送出邮件</span><br>　　</p>
<img src ="http://www.cnitblog.com/stomic/aggbug/42172.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/stomic/" target="_blank">大话人生</a> 2008-04-09 16:10 <a href="http://www.cnitblog.com/stomic/archive/2008/04/09/42172.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【Vista之家原创】多图详解 Windows Vista 下安装IIS 7</title><link>http://www.cnitblog.com/stomic/archive/2008/03/20/41265.html</link><dc:creator>大话人生</dc:creator><author>大话人生</author><pubDate>Thu, 20 Mar 2008 13:58:00 GMT</pubDate><guid>http://www.cnitblog.com/stomic/archive/2008/03/20/41265.html</guid><wfw:comment>http://www.cnitblog.com/stomic/comments/41265.html</wfw:comment><comments>http://www.cnitblog.com/stomic/archive/2008/03/20/41265.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/stomic/comments/commentRss/41265.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/stomic/services/trackbacks/41265.html</trackback:ping><description><![CDATA[<p>【<a href="http://www.vista123.com/"><u><font color=#0066cc>Vista之家</font></u></a>原创】多图详解 Windows Vista 下安装IIS 7</p>
<p>首先，咱们来看看IIS 7.0的十大改进：</p>
<p>1.&nbsp;&nbsp;更简便的命令行配置功能<br>2.&nbsp;&nbsp;更强的兼容性<br>3.&nbsp;&nbsp;抛弃MetaBase<br>4.&nbsp;&nbsp;集中管理<br>5.&nbsp;&nbsp;委任配置<br>6.&nbsp; AppCmd 与其它新的管理手段<br>7.&nbsp;&nbsp;失败请求追踪<br>8.&nbsp;&nbsp;请求过滤<br>9.&nbsp; UNC 内容支持<br>10.动态内容输出缓存</p>
<p>那么，到底<a href="http://www.vista123.com/"><u><font color=#0066cc>Windows Vista</font></u></a>的哪些版本支持 IIS7呢？先来看看下图：</p>
<p><img alt="" src="http://img.vista123.com/NewsUploadFiles/20071027_174852_578_u.gif"></p>
<p>首先安装IIS7组件</p>
<p>打开控制面板-&gt;程序-&gt;程序和组件，点击"打开或关闭Windows功能"弹出组件，选项容器，选中"Internet 信息服务"，点击"确定"。确认后Vista会启动安装程序，完成后要重启电脑。</p>
<p><img alt="" src="http://img.vista123.com/NewsUploadFiles/20071027_175133_953_u.jpg"></p>
<p>接下来要把我们安装好的IIS7组件放在控制台中，便于使用。</p>
<p>Win键+R键打开运行窗口，输入mmc 然后回车，或者打开开始程序，在搜索样里输入"mmc"，然后回车,打开一个新的Windows控制台程序。如下所示：</p>
<p><img alt="" src="http://img.vista123.com/NewsUploadFiles/20071027_175414_250_u.jpg"></p>
<p>在新打开的控制台中选择文件，点击"添加/删除管理单元"...</p>
<p><img alt="" src="http://img.vista123.com/NewsUploadFiles/20071027_175602_546_u.jpg"></p>
<p>在打开"添加/删除管理单元"后我们会看到添加的IIS，选中，添加，然后点击确定。</p>
<p><img alt="" src="http://img.vista123.com/NewsUploadFiles/20071027_175705_671_u.jpg"></p>
<p>一个IIS的控制台程序建成了，点关闭窗口时，它会提示保存，命名后确定，如下：</p>
<p><img alt="" src="http://img.vista123.com/NewsUploadFiles/20071027_175841_468_u.jpg"></p>
<p>打开开始菜单里的管理工具,就会出现我们刚建好的&#8220;Internet 信息服务(IIS)管理器&#8221;。</p>
<p><img alt="" src="http://img.vista123.com/NewsUploadFiles/20071027_180235_437_u.jpg"></p>
<p>点击即可,<font color=#ff0000 size=5><strong>本次IIS 7安装成功！</strong></font></p>
<img src ="http://www.cnitblog.com/stomic/aggbug/41265.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/stomic/" target="_blank">大话人生</a> 2008-03-20 21:58 <a href="http://www.cnitblog.com/stomic/archive/2008/03/20/41265.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>（转）需求管理</title><link>http://www.cnitblog.com/stomic/archive/2008/03/19/41187.html</link><dc:creator>大话人生</dc:creator><author>大话人生</author><pubDate>Wed, 19 Mar 2008 12:01:00 GMT</pubDate><guid>http://www.cnitblog.com/stomic/archive/2008/03/19/41187.html</guid><wfw:comment>http://www.cnitblog.com/stomic/comments/41187.html</wfw:comment><comments>http://www.cnitblog.com/stomic/archive/2008/03/19/41187.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/stomic/comments/commentRss/41187.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/stomic/services/trackbacks/41187.html</trackback:ping><description><![CDATA[<center>
<h1>需求管理</h1>
</center>
<p>因业务需要，&#8220;中科永联&#8221;正式更名为&#8220;中程在线&#8221;，欢迎大家浏览新网站&#8220;<a href="http://www.miiceic.org.cn/"><u><font color=#0066cc>中程在线信息产业培训网</font></u></a>&#8221;</p>
<div>
<p align=right><font face=Verdana><font color=#f70938><font face=黑体><a href="http://www.itisedu.com/phrase/200604112229525.html" target=_new><u><font color=#0066cc>中科永联</font></u></a>高级技术培训中心（</font><font face=黑体>www.itisedu.com</font><font face=黑体>）<img src="http://www.itisedu.com/manage/Upload/image/2006328232159531.jpg" border=0></font></font></font></p>
<font face=Verdana>
<p><font face=Verdana>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://www.itisedu.com/phrase/200603282323585.html" target=_new><u><font color=#800080>需求管理</font></u></a>（<a href="http://www.itisedu.com/phrase/200604240852325.html" target=_new><u><font color=#0066cc>Requirement management</font></u></a>）是完整管理<a href="http://www.itisedu.com/phrase/200603061709535.html" target=_new><u><font color=#0066cc>模式</font></u></a>中的一环，同其他特性诸如完整性、一致性等不可分割，彼此相关而成一体。一套<a href="http://www.itisedu.com/phrase/200603101518295.html" target=_new><u><font color=#0066cc>需求</font></u></a>管理应当是已知系统需求的完整体现，每部分解决方案都是对总体需求一定比例的满足（甚至是充分满足），仅仅解决部分需求是没有意义的。对关键需求的疏忽很可能是灾难性的，试想一架飞机的安全设计不过关将会带来什么样的后果。不同的需求组合起来，构成了一套完整的需求模型。用户需求决定了系统设计所要解决的问题，所要带来的结果。可以说，需求管理指明了系统开发所要做和必须做的每一件事，指明了所有设计应该提供的功能和必然受到的制约。</font></p>
<p><font face=Verdana>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 需求管理的过程，从需求获取开始贯于整个项目生命周期，力图实现最终产品同需求的最佳结合。通过对需求管理在项目进程中实施的不同任务进行分析，我们可以看出需求管理所起的作用。</font></p>
<p><font face=Verdana>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 需求管理本就是一个动态的过程，离开了能动的、变化的系统进程而空谈需求管理，无异于纸上谈兵。</font></p>
<p><font face=Verdana>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 需求管理恰如裁缝的量体裁衣，它直接关系到最终产品的成型。仅从字面出发，如果一个产品满足了客户需求，那它无疑就是成功的。需求管理的过程，从<a href="http://www.itisedu.com/phrase/200603062220345.html" target=_new><u><font color=#0066cc>需求分析</font></u></a>开始贯穿整个项目始终，力图实现最终产品同需求性的最佳结合（参见Figure 1）。通过对需求管理在项目进程中实施的不同任务进行分析，我们可以看出需求管理所起的作用。 </font></p>
<p><font face=Verdana>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 需求管理能够确证： </font></p>
<p><font face=Verdana>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ●我们确知客户的需求是什么（质量）； <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ●满足客户需求的最佳解决办法（统一性）；</font></p>
<p align=center><img src="http://www.itisedu.com/manage/Upload/image/200632983112180.jpg" border=0></p>
<p align=left>&nbsp;</p>
</font><font face=Verdana>
<p><font face=Verdana>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 著名学者Crosby对于质量的定义是"同需求保持统一"。从这个意义上说，需求管理正是从质量出发以确定需求。每个人都应当始终明白他们所做的具体任务其意义何在。然而，在一个产品的生命周期里，其需求性是能动的，是处于变化之中的。 </font></p>
<p><font face=Verdana>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 对于系统工程没有严格统一的定义，因此很难找到足够的数据以说明系统工程所起的作用。有些致力于研究需求分析的组织认为，一项开发计划应当至少将8-15%的资源投入到系统工程方面。如果低于这一标准，将很可能导致无法对客户群做出准确把握。如果该项开发计划含有许多创新或实验的成分，那么这一百分比还应当适度提高。 </font></p>
<p><font face=Verdana><strong>一、概述</strong></font></p>
<p><font face=Verdana>定义需求（Define Requirement） </font></p>
<p><font face=Verdana>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在项目进展过程中，如何区分用户需求与需求分析中需求定义呢？</font></p>
<p><font face=Verdana>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当完成用户需求调查后，首先对《用户需求说明书》进行细化，对比较复杂的用户需求进行建模分析，以帮助<a href="http://www.itisedu.com/phrase/200603282233345.html" target=_new><u><font color=#0066cc>软件开发</font></u></a>人员更好地理解需。例如采用<a href="http://www.itisedu.com/phrase/200604032121225.html" target=_new><u><font color=#0066cc>Rational</font></u></a> 的Rose工具进行需求的建模分析。如果使用工具进行建模分析，对需求分析人员的要求比较高。</font></p>
<p><font face=Verdana>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当完成需求的定义及分析后，需要将此过程书面化，要遵循既定的规范将需求形成书面的文档，我们通常称之为《需求分析说明书》。</font></p>
<p><font face=Verdana>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 邀请同行专家和用户（包括客户和最终用户）一起评审《需求规格说明书》，尽最大努力使《需求规格说明书》能够正确无误地反映用户的真实意愿。需求评审之后，开发方和客户方的责任人对《需求规格说明书》作书面承诺。具体的同行评审详见需求评审章节。</font></p>
<p><font face=Verdana>需求确认(Requirement Validate) </font></p>
<p><font face=Verdana>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 需求确认是需求管理过程中的一种常用手段，也是需求控制的五一节之一；确认有两个层面的意思，第一是进行系统需求调查与分析的人员与客户间的一种沟通，通过沟通从而对需求不一致的进行剔除；另外一个层面的意思是指，对于双方达成共同理解或获得用户认可的部分，双方需要进行承诺。</font></p>
<p><font face=Verdana>建立需求状态(Establish Requirement State)</font></p>
<p><font face=Verdana>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 何谓需求状态；顾名思义，状态也就是一种事物或实体在某一个时刻或点所处的情况，此处要讲的需求状态是指用户需求的一种状态变换过程。</font></p>
<p><font face=Verdana>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 为什么要建立需求状态？在整个生命周期中，存在著有几种不同的情况，在需求调查人员或系统分析人员进行需求调查时，客户存在的需求可能有多种，一<a href="http://www.itisedu.com/phrase/200603090857555.html" target=_new><u><font color=#0066cc>类</font></u></a>是客户可以明确且清楚的提出的需求；一类是客户知道需要做些什么，但又不能确定的需求；另一类是客户本身可以得出这类需求，但需求的业务不明确，还需要等待外部信息。还有是客户本身也说不清楚的。</font></p>
<p><font face=Verdana>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 对于这些需求，在开发进展的过程中，存在著以下几种情况:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 有可能要取消的<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 有的因为不明确而可以后延的，同时可能转化为被取消的需求<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 与客户经过沟通或确认的，此处有两种情况，一类是确认双方达成共识，另一种情况是还需要再进一步沟通的。</font></p>
<p><font face=Verdana>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 下面是一个简单的状态例子：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CLOSED：经过确认，双方认可并达成共识；<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OPEN:双方确认，但没有达成共识的需求；<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 待定：客户提出需求，但双方没有经过沟通或确认；</font></p>
<p><font face=Verdana>需求评审(Requirement Review)</font></p>
<p><font face=Verdana>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 对工作产品的评审有两类方式，一类是正式技术评审，也称同行评审，另一类是非正式技术评审。对于任何重要的工作产品，都应该至少执行一次正式技术评审。在进行正式评审前，需要有人员对其要进行评审的工作产品进行把关，确认其是否具备进入评审的初步条件。</font></p>
<p><font face=Verdana>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 需求评审的规程与其它重要工作产品（如系统设计文档、源代码）的评审规程非常相似，主要区别在于评审人员的组成不同。前者由开发方和客户方的代表共同组成，而后者通常来源于开发方内部。</font></p>
<p><font face=Verdana>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 有人问：需求评审究竟评审什么？要细到什么程度？怎么样进行？</font></p>
<p><font face=Verdana>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 严格地讲，应当检查需求文档中的每一个需求，每一行文字，每一张图表。评判需求优劣的主要指标有：正确性、清晰性、无二义性、一致性、必要性、完整性、可实现性、可验证性、可测性。如果有可能，最好可以制定评审的检查表。</font></p>
<p><font face=Verdana>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 需求评审面临的困难及对策如下：</font></p>
<p><font face=Verdana>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 需求评审的一个通病是&#8220;虎头蛇尾&#8221;。需求评审的确乏味，也比较费脑子。刚开始评审时，大家都比较认真，越到后头越马虎。当需求文档很长时，几乎没人能够坚持到最后。会议主持人事先要强调需求评审的重要性：认真评审一小时可能会避免将来数十天的&#8220;返工&#8221;，让大家足够重视。评审组长还要设法避免大家在昏昏沉沉中评审。如果评审时间比较长，建议每隔两小时休息一次。另外，如果系统比较大，也可以细分成不同的部分分别进行，严格控制每一次评审的文档规模及持续时间。</font></p>
<p><font face=Verdana>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 需求评审涉及的人员可能比较多，有些时候让这么多人聚在一起花费比较长的时间开会并不容易（例如有些人可能出差在外，有些人可能事务缠身）。没有必要把所有事情挤在一块做，需求开发是循序渐进的过程，需求评审也可以分段进行。这样每次评审的时间比较短，参加评审的人员也少一些，组织会议就比较容易。对于需求的工作产品《需求规格说明书》，我们可以标明几种文档状态，如草稿状态。评审状态，初始状态等。只有进入评审状态时，我们可以用不同的方式来对文档进行评审。但当其评审状态转化为初始状态时，需要进行严格的正式的同行评审。</font></p>
<p><font face=Verdana>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 开评审会议时经常会&#8220;跑题&#8221;，导致评审效率很低。有时话匣子一打开后关不上，大家越扯越远，结果评审会议变成了聊天会议。主持人应当控制话题，避免大家讨论与主题无关的东西。对于自主研发的产品，由于需求评审人员大部分是开发人员，大家会不知不觉地谈论<a href="http://www.itisedu.com/phrase/200604232134205.html" target=_new><u><font color=#0066cc>软件</font></u></a>&#8220;如何做&#8221;。由于需求是否&#8220;可实现、可验证、可测试&#8221;本来就属于需求评审的范畴，所以强制大家&#8220;只谈做什么，不谈怎么做&#8221;几乎是不可能的。那么，在需求的评审会上，需要允许开发人员谈如何做，但不需太细，适而可止。同时，评审会必须明确一位评审组长，对时间与问题进行控制。</font></p>
<p><font face=Verdana>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 开评审会议时经常会发生争议。适当的争议有利于澄清问题，比什么东西都一致赞成要好。然而当争议变为争吵时就坏事了。争吵不仅对评审工作没有好处，而且会无意中伤害同事们的感情。同时也解决不了问题。所以，在评审会的过程中，我们要尽可能的是在阐述事实与证据，而并不是从你心底要如何地说服别人。</font></p>
<p><font face=Verdana>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 人们在很多时候分不清楚自己究竟是&#8220;坚持真理&#8221;还是&#8220;固执己见&#8221;。毫不妥协或者轻易妥协都不是好办法。我们应当养成良好的习惯：不要一棍子打死异己的观点，尝试着让自己站在他人的立场思考问题，这样你会找到比较满意的答案。试著从不同的角度去看同样的问题。</font></p>
<p><br></p>
<p>
<table cellSpacing=1 cellPadding=7 width="90%" align=center border=1>
    <tbody>
        <tr>
            <td class=hui vAlign=top height=325>
            <div align=center><strong>{项目名称}评审报告_需求<br>基本信息<br></strong>工作产品.版本号<br>名称，标识符，版本，作者，时间<br><br>工作产品标识号<br><br>　<br>评审方式<br><br>第几次评审<br><br>　<br>工作产品存放路径<br><br>　<br>评审地点<br><br>评审时间<br><br>　<br>参与人员<br><br>　<br>评审人员名字<br>工作单位或部门<br>职务职称<br>签字<br><br>　<br>　<br>　<br>　<br>　<br>　<br><strong>问题记录及处理意见<br>问题编号<br>位置<br>问题描述<br>问题<a href="http://www.itisedu.com/phrase/200603051002565.html" target=_new><u><font color=#0066cc>类型</font></u></a><br>严重程度<br></strong><br>Problem A<br><br>　<br>　<br>　<br>　<br>Problem B<br><br>　<br>　<br>　<br>　<br><strong>评审结论<br><br>评审结论<br></strong>[ ] 工作产品合格，&#8220;无需修改&#8221;或者&#8220;需要轻微修改但不必再审核&#8221;。<br>[&#8730;] 工作产品基本合格，需要作少量的修改，之后通评审组长检查即可。<br>[ ] 工作产品不合格，需要作比较大的修改，之后必须重新对其评审。<br><br><strong>签字<br></strong><br>　<br></div>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p></font><font face=Verdana>　<br>&nbsp;<br></p>
<p><font face=Verdana>需求承诺（Requirement Consent） </font></p>
<p><font face=Verdana>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 什么是需求承诺，是指开发方和客户方的责任人对通过了同行评审的需求阶段的工作产品，作出承诺，同时该承诺具有商业合同的同等效果。 需求承诺如下：</font><strong></p>
<p>
<table cellSpacing=1 cellPadding=7 width=568 border=1>
    <tbody>
        <tr>
            <td class=hui vAlign=top><strong>需求承诺</strong><br>XXX项目需求文档_《XXX需求说明书》，版本号：X.X.X,是建立在XXX与XXX双方共同对需求理解的基础之上，同意后续的开发工作根据该工作产品开展。如果需求发生变化，双方将共同遵循项目定义的&#8220;变更控制规程&#8221;执行。需求的变更将导致双方重新协商成本、资源和进度等。<br>甲方签字<br>乙方签字</td>
        </tr>
    </tbody>
</table>
</p>
<p></strong><font face=Verdana>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 不少人会草率地对待需求承诺：不就是在一张纸的最后一行文字下面签字吗，反正已经评审过了，我就签吧。但他将来变更需求时可能会表示不瞒：&#8220;不错，我是签字了，但是我并没有阅读文档。是你们要我在文档上签字的，我是相信你们才这么做的。&#8221;为了避免发生此类纠纷，人们在作出承诺之前务必要认真阅读文档，一定要明白签字意味着什么。</font></p>
<p><font face=Verdana>需求跟踪(Requirement Track)</font></p>
<p><font face=Verdana>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 为什么要进行需求跟踪？在整个开发过程中，进行需求跟踪的目的是为了建立和维护从用户需求开始到测试之间的一致性与完整性。确保所有的实现是以用户需求为基础。对于需求实现是否全部的覆盖。同时确保所有的输出与用户需求的符合性。</font></p>
<p><font face=Verdana>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 需求跟踪有两种方式，正向跟踪与逆向跟踪：</font></p>
<p><font face=Verdana>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 正向跟踪：以用户需求为切入点，检查《用户需求说明书》或《需求规格说明书》中的每个需求是否都能在后继工作产品中找到对应点。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 逆向跟踪：检查设计文档、代码、<a href="http://www.itisedu.com/phrase/200603291707535.html" target=_new><u><font color=#0066cc>测试用例</font></u></a>等工作产品是否都能在《需求规格说明书》中找到出处。<br>正向跟踪和逆向跟踪合称为&#8220;双向跟踪&#8221;。不论采用何种跟踪方式，都要建立与维护《需求跟踪矩阵》。需求跟踪矩阵保存了需求与后续开发过程输出的对应关系。矩阵单元之间可能存在&#8220;一对一&#8221;、&#8220;一对多&#8221;或&#8220;多对多&#8221;的关系。见下表：简单的需求跟踪矩阵示例。</font><br></p>
<p>
<table class=hui cellSpacing=1 cellPadding=7 width=559 border=1>
    <tbody>
        <tr>
            <td vAlign=center width="8%" bgColor=#c0c0c0><strong>需求代号</strong></td>
            <td vAlign=center width="25%" bgColor=#c0c0c0><strong>需求规格说明书V1.0</strong></td>
            <td vAlign=center width="20%" bgColor=#c0c0c0><strong>设计文档V1.2</strong></td>
            <td vAlign=center width="15%" bgColor=#c0c0c0><strong>代码1.0</strong></td>
            <td vAlign=center width="15%" bgColor=#c0c0c0><strong>测试<a href="http://www.itisedu.com/phrase/200604240937105.html" target=_new><u><font color=#0066cc>用例</font></u></a></strong></td>
            <td vAlign=center width="17%" bgColor=#c0c0c0><strong>测试记录</strong></td>
        </tr>
        <tr>
            <td vAlign=top width="8%">R001</td>
            <td vAlign=top width="25%">标题或标识符</td>
            <td vAlign=top width="20%">标题或标识符</td>
            <td vAlign=top width="15%">代码<a href="http://www.itisedu.com/phrase/200602282323195.html" target=_new><u><font color=#0066cc>文件</font></u></a>名称</td>
            <td vAlign=top width="15%">　</td>
            <td vAlign=top width="17%">测试用例标识或名称</td>
        </tr>
        <tr>
            <td vAlign=top width="8%">R002</td>
            <td vAlign=top width="25%">&#8230;</td>
            <td vAlign=top width="20%">&#8230;</td>
            <td vAlign=top width="15%">&#8230;</td>
            <td vAlign=top width="15%">　</td>
            <td vAlign=top width="17%">&#8230;</td>
        </tr>
        <tr>
            <td vAlign=top width="8%">&#8230;</td>
            <td vAlign=top width="25%">&#8230;</td>
            <td vAlign=top width="20%">&#8230;</td>
            <td vAlign=top width="15%">&#8230;</td>
            <td vAlign=top width="15%">　</td>
            <td vAlign=top width="17%">&#8230;</td>
        </tr>
    </tbody>
</table>
</p>
<p>简单的需求跟踪矩阵示例1</font></p>
<font face=Verdana>
<p><font face=Verdana>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 使用需求跟踪矩阵的优点是很容易发现需求与后续工作产品之间的不一致，有助于开发人员及时纠正偏差，避免干冤枉活。</font></p>
<p><font face=Verdana>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 很多人有这样的误解：如果依照&#8220;需求开发－系统设计－编码－测试&#8221;这样的顺序开发产品，由于每一步的输出就是下一步的输入，所以不必担心设计、编程、测试会与需求不一致，因此可以省略需求跟踪。那么，需要指正的是，按照<a href="http://www.itisedu.com/phrase/200603061230195.html" target=_new><u><font color=#0066cc>软件生命周期</font></u></a>严格线性顺序的开发模型并不能保证各个开发阶段的工作产品与需求保持一致。因为开发者是人而不是机器。而且，大多数开发人员也都深有体会。</font></p>
<p><font face=Verdana>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 生活中&#8220;以讹传讹&#8221;的例子，想必大家都很熟悉。学生甲在精工实习时被机器弄破了手指，于是到医院包扎。同学乙路过医院时看到甲的手血迹斑斑，以为甲的手指被机器割断，于是将这个坏<a href="http://www.itisedu.com/phrase/200603090938465.html" target=_new><u><font color=#0066cc>消息</font></u></a>告诉同学丙。丙急忙转告同学丁，说甲的手被机器割断，正躺在医院里。丁十万火急地告诉全班同学，大家陷入悲痛之中，都以为&#8220;甲的胳膊被机器割断了，正躺在医院里，人快不行了。&#8221;</font></p>
<p><font face=Verdana>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 由于人们的表达能力、理解能力不可能完全相同，人与人之间的协作很难达到天衣无缝的境界。而使用需求追溯的本身也是一种传递的过程。</font></p>
<p><font face=Verdana>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 需求追溯本身并不是一件复杂的事，而是我们的本身一种理念在支配著我们。也许就有人认为这本身就是在浪费时间，主要麻烦是，当需求或工作产品发生变更时，开发人员要及时更新需求跟踪矩阵。然而没想到的事，如果后来再花时间来做同样的事的时候，将会付出更多。也时也就丢去了本身做这件事的意义。</font></p>
<p><font face=Verdana>需求变更控制(Requirement Change Control)</font></p>
<p><font face=Verdana>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 需求变更通常会对项目的进度、人力资源产生很大的影响，这是开发商非常畏惧的问题。也是必须面临与需要处理的问题。作为软件项目，特别在外地实施的工程软件项目而言，需求发生若干次变更似乎是不可避免的。需求发生变更的起因主要有：</font></p>
<p><font face=Verdana>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 随著项目生命周期的不断往前推进，人们（包括开发方和客户方）对需求的了解越来越深入。原先的提出的需求可能存在著一定的缺陷，因此要变更需求。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 市场业务需求发生了变化，原先的需求可能跟不上当前的市场业务发展，因此要变更需求。由于市场变化而导致需求发生变更，开发商大可不必为此烦恼，应当高兴才对。倘若市场静如死水，那么开发商吃了&#8220;上一顿&#8221;就没有&#8220;下一顿&#8221;。正因为市场在变化，才会产生更多商机，聪明的开发商才会有活干，有钱赚。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果在项目开发的初始阶段，开发人员和用户没有搞清楚需求或者搞错了需求，到了项目开发后期才将需求纠正过来，导致产品的部分内容需要重新开发。毫无疑问，这种需求变更将使项目付出额外的代价。这种损失是由于双方工作失误造成的，双方应当好好反省，认真学习需求开发和管理的方法，避免再犯相似的错误。</font></p>
<p><font face=Verdana>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 总的而言，人们提出需求变更，本就是出于能够是产品更加符合市场或客户需求，出发点本身是好的。但对于开发小组而言，需求的变更则意味着要需要重新进行估计，调整资源、重新分配任务、修改前期工作产品等，而作为开发商，需要增预算与投资，开发组要为此付出较重的代价。假定每次需求<a href="http://www.itisedu.com/phrase/200604161514015.html" target=_new><u><font color=#0066cc>变更请求</font></u></a>都被接受的话，那么这个项目将会成为一个连环式的工程。</font></p>
<p><font face=Verdana>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 需求变更控制的动机是：</font></p>
<p><font face=Verdana>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果需求变更带来的好处大于坏处，那么允许变更，但必须按照已定义的变更规程执行，以免变更失去控制。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果需求变更带来的坏处大于好处，那么拒绝变更。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当然，好处与坏处并不是主观的，而是通过客观的分析与评价而得出的。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 对于需求的变更，在某一个程度上来说，也就是项目的范围进行了变化。而需求同时又是项目进行的基础。是非常得要的基石。通常对于需求的变更需要客户与开发方共同参与，包括负责人及市场人员。当然，我们需要根据变更的内容来灵活运用。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 需求变更控制过程中最难办的事情是莫过于&#8220;拒绝客户提出的需求变更请求&#8221;。客户会想当然地以为变更需求是他的权利，因为他付钱给开发方。通常情况下开发方是不敢得罪客户的，但是无原则地退让将使开发小组陷入困境。怎么解决这个问题呢，通常情况下，每一类&#8220;游戏&#8221;都有一定的游戏规则，那么我们事先也需要建立&#8220;游戏规则&#8221;。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果事先没有&#8220;游戏规则&#8221;的话，开发方的负责人需要一些社交技巧来减缓矛盾。例如首先承认客户提出的需求变更请求是合理的，再阐述己方的难处，最后建议在开发该产品新版本时修改需求。这种方式比直接拒绝有效得多，既不得罪客户，又为自己争取了余地。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 另外还有一种方法，可以将变更需求先进行记录，并通知给客户，当其需求变化在开发组不能接受的范围时，可以通过市场进行相关的协调。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 需求变更本是正常的，并不可怕，可怕的是需求的变更得不到控制。<br></font></p>
<p></font><font face=Verdana></p>
<p><font face=Verdana><strong>二、为什么需要管理需求？</strong></font></p>
<p><font face=Verdana>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 简单地说,系统开发<a href="http://www.itisedu.com/phrase/200603082251135.html" target=_new><u><font color=#0066cc>团队</font></u></a>之所以管理需求,是因为他们想让项目获得成功.满足项目需求即为成功打下了基础.若无法管理需求,达到目标的几率就会降低. 以下最近收集的证据很有说服力: Standish Group 从 1994 年到 2001 年的 CHAOS Reports 证实,导致项目失败的最重要的原因与需求有关. 2001年,Standish Group 的CHAOS Reports报导了该公司的一项研究,该公司对多个项目作调查后发现,百分之七十四的项目是失败的,既这些项目不能按时按预算完成.其中提到最多的导致项目失败的原因就是"变更用户需求". </font></p>
<font face=Verdana>
<p><br><strong>三、为什么要管理需求？</strong></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 避免失败就是一个很充分的理由.提高项目的成功率和需求管理所带来的其他好处同样也是理由.Standish Group 的 CHAOS 报告进一步证实了与成功项目关系最大的因素是良好的需求管理. </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 什么是需求？</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 理解需求管理的第一步就是对什么是需求管理达成共识.Rational 把需求定义为"(正在构建的)系统必须符合的条件或具备的功能".电气和电子工程师学会使用的定义与此类似. 著名的<a href="http://www.itisedu.com/phrase/200603282310205.html" target=_new><u><font color=#0066cc>需求工程</font></u></a>设计师 Merlin Dorfman 和 Richard H. Thayer 提出了一个包容且更为精练的定义,它特指软件方面 - 但不仅仅限于软件: </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "<a href="http://www.itisedu.com/phrase/200603061756235.html" target=_new><u><font color=#0066cc>软件需求</font></u></a>可定义为: 用户解决某一问题或达到某一目标所需的软件功能. 系统或系统<a href="http://www.itisedu.com/phrase/200604161439595.html" target=_new><u><font color=#0066cc>构件</font></u></a>为了满足合同,规约,标准或其他正式实行的文档而必须满足或具备的软件功能." </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 什么是需求管理</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 由于需求是正在构建的系统必须符合的事务,而且符合某些需求决定了项目的成功或失败,因此找出需求是什么,将它们记下来,进行组织,并在发生变化时对它们进行追踪,这些活动都是有意义的. 换句话说,需求管理就是：一种获取,组织并记录系统需求的系统化方案,以及一个使客户与项目团队对不断变更的系统需求达成并保持一致的过程. </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个定义与 Dorfman 与 Thayer 以及 IEEE 的"软件需求工程"的定义相似.需求工程包括获取,分析,规定,验证和管理软件需求,而"软件需求管理"则是对所有相关活动的规划和控制.这里介绍的以及 IBM Rational提出的需求管理定义包括了所有这些活动.它们的区别主要在于这里选用了"管理"这个词,而不是"工程".管理这个词更合适用来描述所有涉及到的活动,并且它准确地强调了追踪变更以保持涉众与项目团队之间共识的重要性. </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 对那些不熟悉"引出"这个词的人来说,它可定义为团队用来获取或发现涉众请求,确定请求后隐藏的真正需要,以及为满足这些需要对系统提出的一组适当需求. </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 需求管理问题 一个目的在于确保系统符合人们对其期望的流程面临着哪些困难呢 当它真正在实际项目实施时,困难就暴露出来了.图 1 显示了年对开发人员,经理和质量保证人员所做的一次调查结果.该图显示了经历过最常提到的需求相关难题的受访者比例. </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 下面列出了更多与需求有关的问题: </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 需求不总是显而易见的,而且它可来自各个方面. 需求并不总是容易用文字明白无误地表达. 存在不同种类的需求,其详细程度各不相同. 如果不加以控制,需求的数量将难以管理. 需求相互之间以及与流程的其他可交付工件之间以多种方式相关联. 需求有唯一的特征或特征值.例如,它们既非同等重要,处理的难度也不同. 需求涉及众多相关利益责任方,这意味着需求要由跨职能的各组人员来管理. 需求发生变更. 需求可能对时间敏感. 当这些问题与需求管理和处理技能不足以及缺乏易用工具等情况一同出现时,许多团队都对管理好需求不抱希望了.IBM Rational 已经开发出指导团队提高需求管理技能和流程的专业技术,并使用相应的工具使得上述的流程和专业技术得以实现. </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 需求捕获 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 从上述的分析可以看出,需求的捕获是需求管理的基础和前提.在这里,将介绍一种为业界所广泛采用并经验证的需求捕获方法,即<a href="http://www.itisedu.com/phrase/200603101234535.html" target=_new><u><font color=#0066cc>用例模型</font></u></a>. 用例模型是系统既定功能及系统环境的模型,并作为客户和开发人员之间的契约.</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 用例模型用作分析,设计和测试活动的基本输入.用例是贯穿整个系统开发的一条主线.同一个用例模型即为需求<a href="http://www.itisedu.com/phrase/200603110944215.html" target=_new><u><font color=#0066cc>工作流</font></u></a>程的结果,可当作分析设计工作流程以及测试工作流程的输入使用.参与者(Actor)和用例(UseCase)是用例模型中的主要元素. 下图显示了自动取款机系统用例模型的一部分: </p>
<p>客户</p>
<p>查询</p>
<p>提款</p>
<p>转帐</p>
<p>客户身份验证系统时钟</p>
<p><a href="http://www.itisedu.com/phrase/200602271218062.html" target=_new><u><font color=#0066cc>数据库</font></u></a>服务器</p>
<p>(from )系统维护</p>
<p>信函打印机</p>
<p>打印对帐单</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://www.itisedu.com/phrase/200603071221195.html" target=_new><u><font color=#0066cc>用例图</font></u></a>用于显示包含参与者和用例的用例模型示例.系统建模有许多种方法,每种建模方法可以满足不同的目的.然而,用例模型最重要的作用是将系统行为传达给客户或最终用户.可能与该系统交互的用户和任何其他系统都是参与者.由于参与者代表了系统用户,它们协助界定系统并提供十分明确的系统用途说明.编写用例依据参与者的需求来进行.这样就确保该系统成为用户期望得到的系统. </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 参与者和用例都是通过将客户需求及潜在用户当作重要的信息查找到的.找到这些用例和参与者后,应对它们作简要说明.在详细说明这些用例之前,客户应<a href="http://www.itisedu.com/phrase/200604161505135.html" target=_new><u><font color=#0066cc>复审</font></u></a>该用例模型以核实所有的用例和参与者都已经找到,并且它们可以提供客户所需要的东西. 在迭代开发环境中,您可以选择用例的子集以便在每个迭代中详细描述.参与者和用例找到后,需要详细说明每个用例的事件流.这些说明指出系统与参与者交互的方式以及在各个独立用例中系统执行的有关操作. </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 最后,对已完成的用例模型(包括用例说明)进行复审,开发人员和客户使用该模型对系统应执行的操作达成一致意见. </p>
<p><strong>四、需求管理模型</strong></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在需求管理的流程中,需求的捕获手段固然重要,但在需求的捕获和需求最终成型的过程中,我们会面临各种和需求相关的信息和资料(也可以把这些信息笼统地称做"需求"),如何发现这些信息之间的关系并有效组织,更为关键. 需求类型 在<a href="http://www.itisedu.com/phrase/200604231308415.html" target=_new><u><font color=#0066cc>RUP</font></u></a>中,我们采用一种金字塔方式的管理办法,来组织和管理我们获取的信息乃至最终的需求. </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 为了建立一个真正满足客户需求的系统,项目团队首先必须确定系统要解决的问题.然后,团队必须确定涉众,从中获得业务和用户需要,对其进行描述,并区分它们的优先级.从这一组高层期望或需求出发,对产品或系统特性集达成一致意见.而后,由产品特性来抽取软件需求,在我们的模型中,软件需求是以用例模型的方式来描述.从测试的角度来看,测试项一定来自于软件需求,即软件需求中确定了哪些需求项,测试就要根据这些需求项来制定和实现. </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 系统越大越复杂,出现的需求类型就越多.一个需求类型不过是指需求的一个类.通过确定需求类型,团队可以把大量需求组织成意义明确且更容易管理的组.在一个项目中建立不同类型的需求有助于团队成员对变更请求进行分类,并使相互之间的沟通更为清楚明确.从上述的分析中我们可以看到,通常,一类需求可以细分即分解成其他类型的需求.这里,我们就把需求分解为几种类型,并在他们之间建立相应的关联.业务规则和前景声明包括高层次的需求,团队可以从中导出用户需要,特性和产品需求类型.用例和其他建模形式驱动设计需求,该需求可分解为软件需求,并可以用分析<a href="http://www.itisedu.com/phrase/200604161258515.html" target=_new><u><font color=#0066cc>设计模型</font></u></a>来说明.测试需求源于软件需求,它被分解为具体的测试过程.如果既定项目中有成百上千个,甚至上万个需求实例时,对需求进行分类可以使项目更容易管理.上述的这些需求类型同时保存在对应的RUP文档和数据库中. </p>
<p><strong>五、应用需求类型</strong></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 通过定义需求类型,以及他们之间的关系,我们就建立了一个需求管理模型的<a href="http://www.itisedu.com/phrase/200603061723295.html" target=_new><u><font color=#0066cc>框架</font></u></a>.当然,我们建立这样的一个模型,是为了方便我们使用需求,为了达到这一目的,我们还需要在此基础上添加相应的内容. 需要对各种需求类型添加它们的属性,以便于对需求进行查询等管理手段.比如,可以针对用户需要,确定该需要的必要性,优先级,确定性等属性.在实际的项目中,就可以确定这些属性的值,而后根据这些实际属性值来安排项目的进度表等.或是在项目进度紧急时,确定哪些需求是可以延期完成,而哪些是必须完成的,等等. </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 需求的追踪性 其次,可以根据不同需求的导出情况,在不同的需求之间建立追踪关系.譬如,用户需要决定了要构建产品的特性,产品的特性又决定了产品的软件需求,等.在这些不同类型的需求之间建立关联,一旦其中的某些需求发生变化,就可以确定它可能带来的影响,从而制定相应的策略. </p>
<p><strong>六、需求管理的工作流程</strong> </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 工作流明细简介 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 问题分析 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 问题分析可以通过了解问题及涉众的最初需要,并提出高层解决方案来实现.它是为找出"隐藏在问题之后的问题"而进行的推理和分析.问题分析期间,将对"什么是面临实际问题"和"谁是涉众"等问题达成一致.而且,您还要从业务角度界定解决方案,以及制约该解决方案的因素.您应该已经对项目进行过商业理由分析,这将便于您更好地预计能从构建中的项目中得到多少投资回报. </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 理解涉众需要 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 需求来自各个方面,比如来自客户,合作伙伴,最终用户或是某领域的专家.您需要掌握如何准确判断需求应来源于哪方面,如何接近这些来源并从中获取信息.提供这些信息主要出处的个人在本项目中称为涉众.如果您正在开发一个在您公司内部使用的<a href="http://www.itisedu.com/phrase/200603011147495.html" target=_new><u><font color=#0066cc>信息系统</font></u></a>,那么在开发团队中应包括具有最终用户经验和业务领域专业知识的人员.通常讨论将在业务模型这一级上展开,而不是在系统这一级上展开.如果正在开发一个要在市场上出售的产品,那么您可以充分调动营销人员,以便更好地了解该市场中用户的需要. 获取需要的活动可使用这样一些技巧:访谈,集体讨论,概念原型设计,问卷调查和竞争性分析等.获取结果可能是一份图文并茂的请求或需要列表,并按相互之间的优先级列出. </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 定义系统 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 定义系统指的是解释涉众需求,并整理为对要构建系统的意义明确的说明.在系统定义的初期要确定以下内容:需求构成,文档格式,语言形式,需求的具体程度(需求量及详细程度),需求的优先级和预计工作量(不同人在不同的实践中通常对这两项内容的看法大不相同),技术和管理风险以及最初规模.系统定义活动还可包括与最关键的涉众请求直接联系的初期原型和设计模型.系统定义的结果是用自然语言和图解方式表达的系统说明. </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 管理项目规模 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 为使项目高效运作,应仔细根据所有涉众的需求确定优先级,并对项目规模进行管理.有的开发人员仅仅重视所谓的"复活节彩蛋"(即开发人员感兴趣或觉得有挑战性的特性),而不是及早将精力投入降低项目风险或提高应用<a href="http://www.itisedu.com/phrase/200604232224305.html" target=_new><u><font color=#0066cc>程序</font></u></a>构架稳定性方面,这已使太多的项目蒙受损失.为确保尽早解决或降低项目中的风险,应以递增的方式开发系统.要慎重选择需求,以确保每次增加都能缓解项目中的已知风险.要达到目的,您需要和项目的涉众协商每次迭代的范围.通常,这要求具备管理项目各个阶段的期望结果的良好技能.</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 除了控制开发过程本身,您还需控制需求的来源,并控制项目可交付工件的外观. 改进系统定义 系统的详细定义应能让涉众理解,同意并认可.它不仅需要具备所有功能,而且应符合法律或法规上的要求,符合可用性,可靠性,性能,可支持性和可维护性.感觉构建过程复杂的系统就应该有复杂的定义,这是一种常见的错误看法.这会给解释项目和系统的目的造成困难.人们可能印象深刻,但他们会因不甚理解而无法给出建议.应该致力于</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 了解您制作的系统说明文档的读者.您可能常会发现需要为不同的读者准备不同的说明文档. </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 我们认为用例方法是传达系统目的和定义系统细节的一种行之有效的方法,它常与简单的可视化原型结合使用.用例有助于为需求提供一个环境,利用它可生动地说明系统使用的方式. </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 系统详细定义的另一个构件是说明系统采用的测试方式.测试计划及要执行测试的定义将会说明要核实哪些系统功能. </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 管理需求变更</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 定义需求时无论怎样谨慎小心,也总会有可变因素.变更的需求之所以变得难以管理,不仅是因为一个变更了的需求意味着要花费或多或少的时间来实现某一个新特性,而且也因为对某个需求的变更很可能影响到其他需求.应确保赋予需求一个有弹性的结构,使它能适应变更,并且确保使用可追踪性链接可以表达需求与开发生命周期的其他工件之间的依赖关系.管理变更包括建立<a href="http://www.itisedu.com/phrase/200603130850315.html" target=_new><u><font color=#0066cc>基线</font></u></a>,确定需要追踪的重要依赖关系,建立相关项之间的可追踪性,以及变更控制等活动.</p>
<p><strong>七、需求管理所要完成的任务</strong></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 可以说需求是一种模型，是产品的早期雏形，通过进行需求分析，我们可以对最终产品做出优化。需要始终保持注意的是，需求性是始终处于变化之中的。需求管理需要完成的任务包括： </p>
<p>●明确需求并达成共识； <br>●建立关联； <br>●根据不同需求设计相应解决办法； <br>●进行系统优化； <br>●提出设计方案； <br>●监控和解决可能出现的问题以及需要做出的改变； <br>●控制不同开发任务的开展； <br>●对最终产品做出评测； <br>●监控可能出现的重复开发； <br>●提出项目实施时间表； <br>●确定最终用户界面。 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 有时侯我们所进行的需求分析只停留于分析本身，而没有进一步去思索我们为什么要进行需求分析。需求性是项目开发的源头，只有进行认真的需求分析，我们才能做到对症下药、量体裁衣，才能才设计开发中去伪存真，不断改进。"需求之需求"正是强调了贯穿始终的需求分析的重要。离开了能动的、变化的系统进程而空谈需求管理，无异于纸上谈兵。需求管理所产生的效益或许并不明显，或许要日后才能体现，但是无序的，没有经过精心策划的需求管理是不可能产生效益的。 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 以下篇幅分别介绍需求管理在系统工程中的不同应用。 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 需求共识： </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 首先，用户需求通过非术语的形式进行表述，这种表述应当使每一位开发者明确自己的职责所在，并且清楚知道不同开发工作之间的关联。这里的"用户"泛指在实际应用环境中每一位可能使用最终产品的人。如果一个产品不能满足客户所需，那么设计方案再出色也无济于事，许多方案有很高的技术设计水准却最终不能获得成功，其原因正在于此。可以把产品功能说得天花乱坠，但却无法改变用户需求决定最终产品基本模式的事实。 </p>
<p align=center><img src="http://www.itisedu.com/manage/Upload/image/200632983721280.jpg" border=0></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 需求管理的首要任务在于使开发人员和用户双方对于需求都有一个明确的认识。因此用来进行需求分析的语言组织应当使所有相关人员，包括用户，都能够理解，都能够进而对整个项目有一个整体把握，并明确每一个人在项目中所起的作用。因而需求管理需要解决的第一位也是最基本的任务就是明确需求，并使所有相关人员达成共识。 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 根据需求设计解决办法： </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 我们在进行系统设计时，应当首先建立一个需求模型，但不能是为了建模而建模，需求模型实际是最终产品的抽象化表现。需求模型的建立使我们在明确需求的基础上更进一步，使我们知道我们将要生产何种产品，该产品都具有那些功能。同时，创建需求模型的过程也使开发者明确自己的工作如何同整个项目有机地结合在一起。建立需求模型应当充分研究不同类型、不同<a href="http://www.itisedu.com/phrase/200604241328115.html" target=_new><u><font color=#0066cc>架构</font></u></a>建模方式的可行性，切忌主观武断。 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 系统优化： </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 任何设计都应以考虑用户需求为优先，用户需求的满足程度即成为衡量设计优劣的标准。在一个项目设计周期中，开发人员经常会面临选择，以提炼需求，决定开发的优先次序，并在不同的实施方案中作出选择。这些选择必须考虑到收益与付出地平衡比例，这种选择的重要性尤其在建立需求模型的后期凸现出来。基本需求在这时都已明确，而实施方案还未敲定，为了使用户的基本需求得到落实，一定程度的开销用于搭建不同构架的需求模式是合理的。假使我们已经有了一套翔实的需求分析，我们甚至不必将每一套方案都付诸实行，就可以成功地对系统设计进行优化。</p>
<p align=center><img src="http://www.itisedu.com/manage/Upload/image/200632983736944.jpg" border=0></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 面对不同的可行性而需要作出选择时，我们也必须参照收益与付出的比例关系。例如，在被要求提供计划书时（Request for Proposal），我们应当尽量做到每一份计划书的提供都物有所值。 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 方案设计： </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 明确需求后，开发人员就可以进行方案设计。通过对用户需求和设计方案之间所存在关联性进行分析比较，我们就能够对设计方案进行评估。 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 必要的修改： </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 方案的设计不可能是一成不变的，经常会有方案设计同需求相悖的情况。如果我们无法准确把握用户需求同方案设计之间的关系，我们就无法在需要对方案进行必要修改时正确判断。优秀的需求分析应当非常精确细致地对用户需求作出描述，同时也应该最大程度地给予方案设计者充分发挥的余地。 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 任务划分： </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一个大的开发项目可能涉及20-30组不同的开发队伍，人员包括技术工程师、<a href="http://www.itisedu.com/phrase/200602281725525.html" target=_new><u><font color=#0066cc>软件工程</font></u></a>师以及具体项目主管等等，而每一个模块都有它自己的开发工具和开发语言。 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 主持一个大项目的开发并不是件容易的事，总体项目主管的首要任务是对开发项目进行任务划分，将整体开发任务细化为多个子模块，从而使这些子模块能够平行开发而无需太多的干预。总体项目主管可以将细化的不同模块的需求分析交给不同的开发队伍，对于开发进程的监控只需参照需求的解决情况，对于具体的开发细节则不必过问太多。 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 不同的开发队伍会使用不同的开发语言和开发工具，会使用不同的符号和标记。相反，作为总体项目主管所使用的语言、符号和标记等则必须简单易懂，以使所有的开发人员都等理解。换言之，总体项目主管应当使用自然语言，或只涉及少量的，简单的术语和专用词汇。 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 产品测试： </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 需求的满足情况是决定最终产品成败的判定基础，对最终产品的测试评估必须以产品所试图解决的需求为标准。下图标示了不同的开发阶段所对应的测试需求。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这里有一个需求、产品和测试系统之间的关系问题，确定需要进行的测试属于总体开发主管的工作范畴，虽然具体工作并非都要由开发主管来亲自完成。 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 重复开发： </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 对于总体开发主管而言，针对方案设计的修改是一项经常性的工作（因为修改而造成的影响则应当尽可能减小）。在进行项目开发时，随着开发进程的深入，各种修改的建议和问题的报告是屡见不鲜的，每解决一个问题，就是将产品同其需求性的结合又完善了一步。存在问题正是需求性尚未满足的表现。 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 方案设计的完善和需求性的满足是同步的，因此真正的用户对于产品的评价和建议尤其具有重要意义。在那些一步到位的产品设计中，真正用户无法左右开发进程；但在一个能够进行重复设计、重复开发的产品生命期中，开发人员应当及时搜集用户对于产品的反馈信息，并将这些信息结合到下一步的开发工作中去。如下图所示，用户反馈同产品开发是统一的。 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://www.itisedu.com/phrase/200604240825565.html" target=_new><u><font color=#0066cc>项目管理</font></u></a>的辅助： </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在有些地方，需求管理被作为一个技术问题来处理，需求管理所针对的<a href="http://www.itisedu.com/phrase/200603090845215.html" target=_new><u><font color=#0066cc>对象</font></u></a>只是产品，而同项目管理所涉及的问题例如进程安排或资源分配等无关。实际上，项目管理涉及三方面问题：进程安排、资源分配和质量管理（同需求的统一）。</p>
<p align=center><img src="http://www.itisedu.com/manage/Upload/image/200632983832682.jpg" border=0></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 试想以下三种情况： </p>
<p>●一场高水准的音乐会，预算合理，演出时间却晚了两天。 <br>●质量优良的小轿车，交货及时，然而造价是市价的两倍。 <br>●一套系统，完全满足了用户需求，但在开发过程中使用非法劳工。 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这三种情况虽然都满足了用户所需，然而缺乏实际意义，因此都以失败告终。 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "我付了钱，但这不是我想要的"，没有用户愿意这么说。要避免出现这种情况，在进行项目管理和财务预算时，也必须以需求管理为基础。仅仅完成了一件设计并不意味着工作的结束，只有这件设计充分解决了需求，它才具有里程碑般的意义。同样的，一件产品只有在测试和实际操作中完全满足了需求，已经完全准备好了投入到下一阶段的运营，才意味着这件产品在本阶段工作的结束。 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 开发进程中的每一块里程碑都意味着需求的解决又前进了一步，这样的每一块里程碑也都是委托商付款的重要参照，产品开发的整个进程都可以通过需求管理进行监控。 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 里程碑构造机制的基本方法之一就是进程管理，一项需求的满足就意味着一块里程碑的确立。我们应当对用户需求、针对需求而进行的模块设计以及每个子模块的开发进程之间的关联做到心中有数。 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 通过我们对需求管理实际应用的分析，几个关键因素凸现出来。首先，需求管理在开发周期中是自始至终存在的。注意：不要把它简单理解为"需求周期"，需求管理必须始终保持更新，它构成了技术管理的基础。 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 其次，需求管理同项目管理是密不可分的。如果我们把每一个需求的解决看作一个里程碑，并以此出发对整个开发进程进行监控，我们就应该对整体开发工作进行精密细致的划分，从而将需求分析具体化。 </p>
<p><strong>八、需求管理的工具</strong> </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 需求管理所用到的工具必须能够处理和应用于本文所提到的各种需求，应当有助于我们分析需求，确定相应开发和支持工具以处理相关信息，进而处理系统相应模块。系统工程师始终致力于用简单的工具将需求形象化的展现出来，常用的工具比如附有标注说明的系统发布工具以及相关数据库等。 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 需求管理涉及到一系列复杂的对象，其任务面向很广，关系到整个设计开发的方方面面。其使用的工具应当提供如图列举的一些功能：</p>
<p align=center><img src="http://www.itisedu.com/manage/Upload/image/200632983856858.jpg" border=0></p>
<p><br><strong>九、总结：需求管理</strong> </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 本文论述围绕于需求管理工程。需求管理是开发工作有效进行的确证。很明显需求管理是一种很高层次的系统行为，涉及整个开发过程和产品本身。 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 需求管理首先要针对需求做出分析，随后应用于产品并提出方案。需求分析的模型正是产品的原型样本，优秀的需求管理提高了这样的可能性：它使最终产品更接近于解决需求，提高了用户对产品的满意度，从而使产品成为真正优质合格的产品。从这层意义上说，需求管理是产品质量的基础。</font>&nbsp;</p>
</font></div>
<img src ="http://www.cnitblog.com/stomic/aggbug/41187.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/stomic/" target="_blank">大话人生</a> 2008-03-19 20:01 <a href="http://www.cnitblog.com/stomic/archive/2008/03/19/41187.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用svn——项目的目录布局</title><link>http://www.cnitblog.com/stomic/archive/2008/03/17/41043.html</link><dc:creator>大话人生</dc:creator><author>大话人生</author><pubDate>Mon, 17 Mar 2008 09:50:00 GMT</pubDate><guid>http://www.cnitblog.com/stomic/archive/2008/03/17/41043.html</guid><wfw:comment>http://www.cnitblog.com/stomic/comments/41043.html</wfw:comment><comments>http://www.cnitblog.com/stomic/archive/2008/03/17/41043.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnitblog.com/stomic/comments/commentRss/41043.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/stomic/services/trackbacks/41043.html</trackback:ping><description><![CDATA[Subversion有一个很标准的目录结构，是这样的。<br>比如项目是proj，svn地址为svn://proj/，那么标准的svn布局是<br>
<pre>svn://proj/
|
+-trunk
+-branches
+-tags
</pre>
这是一个标准的布局，trunk为主开发目录，branches为分支开发目录，tags为tag存档目录（不允许修改）。但是具体这几个目录应该如何使用，svn并没有明确的规范，更多的还是用户自己的习惯。<br><br>对于这几个开发目录，一般的使用方法有两种。我更多的是从软件产品的角度出发（比如freebsd），因为互联网的开发模式是完全不一样的。<br>第一种方法，使用trunk作为主要的开发目录。<br>一般的，我们的所有的开发都是基于trunk进行开发，当一个版本/release开发告一段落（开发、测试、文档、制作安装程序、打包等）结束后，代码处于冻结状态（人为规定，可以通过hook来进行管理）。此时应该基于当前冻结的代码库，打tag。当下一个版本/阶段的开发任务开始，继续在trunk进行开发。<br>此时，如果发现了上一个已发行版本（Released Version）有一些bug，或者一些很急迫的功能要求，而正在开发的版本（Developing Version）无法满足时间要求，这时候就需要在上一个版本上进行修改了。应该基于发行版对应的tag，做相应的分支（branch）进行开发。<br>例如，刚刚发布1.0，正在开发2.0，此时要在1.0的基础上进行bug修正。<br>按照时间的顺序<br>
<ol>
    <li>1.0开发完毕，代码冻结
    <li>基于已经冻结的trunk，为release1.0打tag<br>此时的目录结构为<br>svn://proj/<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +trunk/&nbsp; (freeze)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +branches/<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +tags/<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +tag_release_1.0　(copy from trunk)<br>
    <li>2.0开始开发，trunk此时为2.0的开发版
    <li>发现1.0有bug，需要修改，基于1.0的tag做branch<br>此时的目录结构为<br>svn://proj/<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +trunk/&nbsp; ( dev 2.0 )<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +branches/<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +dev_1.0_bugfix (copy from tag/release_1.0)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +tags/<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +release_1.0　(copy from trunk)<br>
    <li>在1.0 bugfix branch进行1.0 bugfix开发，在trunk进行2.0开发
    <li>在1.0 bugfix 完成之后，基于dev_1.0_bugfix的branch做release等
    <li>根据需要选择性的把dev_1.0_bugfix这个分支merge回trunk（什么时候进行这步操作，要根据具体情况）<br></li>
</ol>
这是一种很标准的开发模式，很多的公司都是采用这种模式进行开发的。trunk永远是开发的主要目录。<br><br>第二种方法，在每一个release的branch中进行各自的开发，trunk只做发布使用。<br>这种开发模式当中，trunk是不承担具体开发任务的，一个版本/阶段的开发任务在开始的时候，根据已经release的版本做新的开发分支，并且基于这个分支进行开发。还是举上面的例子，这里面的时序关系是。<br>
<ol>
    <li>1.0开发，做dev1.0的branch<br>此时的目录结构<br>svn://proj/<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +trunk/&nbsp; (不担负开发任务 )<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +branches/<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +dev_1.0 (copy from trunk)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +tags/<br>
    <li>1.0开发完成，merge dev1.0到trunk<br>此时的目录结构<br>svn://proj/<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +trunk/&nbsp; (merge from branch dev_1.0)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +branches/<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +dev_1.0 (开发任务结束，freeze)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +tags/<br>
    <li>根据trunk做1.0的tag<br>此时的目录结构<br>svn://proj/<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +trunk/&nbsp; (merge from branch dev_1.0)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +branches/<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +dev_1.0 (开发任务结束，freeze)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +tags/<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +tag_release_1.0 (copy from trunk)<br>
    <li>1.0开发，做dev2.0分支<br>此时的目录结构<br>svn://proj/<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +trunk/&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +branches/<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +dev_1.0 (开发任务结束，freeze)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +dev_2.0 （进行2.0开发）<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +tags/<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +tag_release_1.0 (copy from trunk)<br>
    <li>1.0有bug，直接在dev1.0的分支上修复<br>此时的目录结构<br>svn://proj/<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +trunk/&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +branches/<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +dev_1.0 (1.0bugfix)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +dev_2.0 （进行2.0开发）<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +tags/<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +tag_release_1.0 (copy from trunk)<br>
    <li>选择性的进行代码merge </li>
</ol>
这其实是一种分散式的开发，当各个部分相对独立一些（功能性的），可以开多个dev的分支进行开发，这样各人/组都不会相互影响。比如dev_2.0_search和dev_2.0_cache等。但是这样merge起来就是一个很痛苦的事情。<br><br>这里要注意一下的，第六步进行选择性的merge，是可以当2.0开发结束后一起把dev_1.0（bugfix用）和dev_2.0（新版本开发用）merge回trunk。或者先把dev_1.0 merge到dev_2.0，进行测试等之后再merge回trunk。<br>这两种方法各有利弊，第一种方法是可以得到一个比较纯的dev_2.0的开发分支，而第二种方法则更加的保险，因为要测试嘛。<br><br>以上呢，就是我说的两种开发模式了，具体哪种好，并没有定论。这里大致的说一下各自的优缺点<br>第一种开发模式（trunk进行主要开发，集中式）：<br>优点：管理简单<br>缺点：当开发的模块比较多，开发人数/小团队比较多的时候，很容易产生冲突而影响对方的开发。因为所有的改动都有可能触碰对方的改动<br>第二重开发模式（分支进行主要开发，分散式）：<br>优点：各自开发独立，不容易相互影响。<br>缺点：管理复杂，merge的时候很麻烦，容易死人。<br><br>其实，这里并没有一定之规，更多的时候是两种模式结合使用。我个人来说是采用第一种方式为主，在某些情况下使用第二种方法。<br>如果你还有其他的好的方法，那么请赐教。:) 
<img src ="http://www.cnitblog.com/stomic/aggbug/41043.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/stomic/" target="_blank">大话人生</a> 2008-03-17 17:50 <a href="http://www.cnitblog.com/stomic/archive/2008/03/17/41043.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Failed to access IIS metabase解决</title><link>http://www.cnitblog.com/stomic/archive/2007/08/18/32029.html</link><dc:creator>大话人生</dc:creator><author>大话人生</author><pubDate>Fri, 17 Aug 2007 18:52:00 GMT</pubDate><guid>http://www.cnitblog.com/stomic/archive/2007/08/18/32029.html</guid><wfw:comment>http://www.cnitblog.com/stomic/comments/32029.html</wfw:comment><comments>http://www.cnitblog.com/stomic/archive/2007/08/18/32029.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cnitblog.com/stomic/comments/commentRss/32029.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/stomic/services/trackbacks/32029.html</trackback:ping><description><![CDATA[<h2><em>Failed to access IIS metabase.</em> </h2>
<font face="Arial, Helvetica, Geneva, SunSans-Regular, sans-serif "><strong>Description: </strong>An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. <br><br><strong>Exception Details: </strong>System.Web.Hosting.HostingEnvironmentException: Failed to access IIS metabase. <br><br><strong>The process account used to run ASP.NET must have read access to the IIS metabase (e.g. IIS://servername/W3SVC). For information on modifying metabase permissions, please see <a href="http://support.microsoft.com/?kbid=267904"><u><font color=#0000ff>http://support.microsoft.com/?kbid=267904</font></u></a>.</strong><br><br><strong>Source Error:</strong> <br><br>
<table width="100%" bgColor=#ffffcc>
    <tbody>
        <tr>
            <td><code>An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.</code> </td>
        </tr>
    </tbody>
</table>
<br><strong>Stack Trace:</strong> <br><br>
<table width="100%" bgColor=#ffffcc>
    <tbody>
        <tr>
            <td><code></code>
            <pre>[HostingEnvironmentException: Failed to access IIS metabase.]<br>   System.Web.Configuration.MetabaseServerConfig.MapPathCaching(String siteID, VirtualPath path) +3500426<br>   System.Web.Configuration.MetabaseServerConfig.System.Web.Configuration.IConfigMapPath.MapPath(String siteID, VirtualPath vpath) +9<br>   System.Web.Hosting.HostingEnvironment.MapPathActual(VirtualPath virtualPath, Boolean permitNull) +163<br>   System.Web.CachedPathData.GetConfigPathData(String configPath) +382<br>   System.Web.CachedPathData.GetConfigPathData(String configPath) +243<br>   System.Web.CachedPathData.GetApplicationPathData() +68<br>   System.Web.CachedPathData.GetVirtualPathData(VirtualPath virtualPath, Boolean permitPathsOutsideApp) +3393747<br>   System.Web.Configuration.RuntimeConfig.GetLKGRuntimeConfig(VirtualPath path) +189<br></pre>
            </td>
        </tr>
    </tbody>
</table>
</font><br>
<hr style="WIDTH: 100%; HEIGHT: 2px">
继续解决吧。。。。<br>
<hr style="WIDTH: 100%; HEIGHT: 2px">
解决办法:<br>
<p><span id=ctl00_MainContentPlaceholder_ctl01_ctl00_lblEntry>C:\WINNT\Microsoft.NET\Framework\v2.0.50727&gt;aspnet_regiis.exe -i</span></p>
<img src ="http://www.cnitblog.com/stomic/aggbug/32029.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/stomic/" target="_blank">大话人生</a> 2007-08-18 02:52 <a href="http://www.cnitblog.com/stomic/archive/2007/08/18/32029.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>