﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-大道自然</title><link>http://www.blogjava.net/iamlibo/</link><description /><language>zh-cn</language><lastBuildDate>Fri, 22 Aug 2008 04:57:43 GMT</lastBuildDate><pubDate>Fri, 22 Aug 2008 04:57:43 GMT</pubDate><ttl>60</ttl><item><title>ubuntu下安装xdmcp服务</title><link>http://www.blogjava.net/iamlibo/archive/2008/07/28/218042.html</link><dc:creator>Libo</dc:creator><author>Libo</author><pubDate>Mon, 28 Jul 2008 05:36:00 GMT</pubDate><guid>http://www.blogjava.net/iamlibo/archive/2008/07/28/218042.html</guid><wfw:comment>http://www.blogjava.net/iamlibo/comments/218042.html</wfw:comment><comments>http://www.blogjava.net/iamlibo/archive/2008/07/28/218042.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/iamlibo/comments/commentRss/218042.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/iamlibo/services/trackbacks/218042.html</trackback:ping><description><![CDATA[
<p><a href="http://hi.baidu.com/ahli/blog/item/a10b51da46de99deb6fd488e.html">http://hi.baidu.com/ahli/blog/item/a10b51da46de99deb6fd488e.html</a></p>
<p>ubuntu下安装xdmcp服务（即远程主机通过xdmcp协议连接到ubuntu的图形终端，以图形终端方式登录）：<br/>1. 登录本机图形终端（本机按Ubuntu/Gnome为例设置）<br/>2. 选择system-&gt;Administration-&gt;logon windows切到remote项，修改其中style为same as local,如为中文菜单请相应选择。<br/>3. 选择system-&gt;Administration-&gt;logon windows切到General项，修改其中Disable Multiple login for a single user前面的X去悼,如为中文菜单请相应选择，否则会出现能显示画面但无法登录（输入用户和密码后又回到登录画面）。<br/>4. 修改sudo vi /etc/gdm/gdm.conf（建议先将gdm.conf备份，以免无法启动时，可以快速恢复）<br/>其中[Daemon]中#RemoteGreeter=/usr/lib/gdm/gdmlogin中前面的#号去悼；<br/>[Security]中#DisallowTCP=true中前面的＃号去悼，并将true改为false;<br/>[xdmcp]中#Enable=false中前面的＃号去悼，并将false改为true;<br/>5. 修改sudo vi /etc/inittab增加一行id:5:initdefault:表示系统将自己运行在多用户级别５的模式下；<br/>6. 重启sudo reboot，不建议sudo gdm restart这样gdm并未生效<br/>7. 检查服务器和客户端的网络防火墙配置，保证177端口和6000-6100端口可用；<br/>8. 使用Xwin的服务器程序连接ubuntu图形界面即可；</p>
<br/><img src ="http://www.blogjava.net/iamlibo/aggbug/218042.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/iamlibo/" target="_blank">Libo</a> 2008-07-28 13:36 <a href="http://www.blogjava.net/iamlibo/archive/2008/07/28/218042.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ubuntu8.0.4与eclipse3.4有问题</title><link>http://www.blogjava.net/iamlibo/archive/2008/07/26/217663.html</link><dc:creator>Libo</dc:creator><author>Libo</author><pubDate>Sat, 26 Jul 2008 07:20:00 GMT</pubDate><guid>http://www.blogjava.net/iamlibo/archive/2008/07/26/217663.html</guid><wfw:comment>http://www.blogjava.net/iamlibo/comments/217663.html</wfw:comment><comments>http://www.blogjava.net/iamlibo/archive/2008/07/26/217663.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/iamlibo/comments/commentRss/217663.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/iamlibo/services/trackbacks/217663.html</trackback:ping><description><![CDATA[
<p>ubuntu8.0.4下安装eclipse3.4后启动后不显示主界面.只显示一个小对话框,再把FireFox升级到3.0.1后就没有问题了.</p>
<p class="zoundry_bw_tags">
  <!-- Tag links generated by Zoundry Blog Writer. Do not manually edit. http://www.zoundry.com -->
  <span class="ztags"><span class="ztagspace">Technorati</span> : <a href="http://technorati.com/tag/eclipse" class="ztag" rel="tag">eclipse</a>, <a href="http://technorati.com/tag/ubuntu" class="ztag" rel="tag">ubuntu</a></span> 
</p><img src ="http://www.blogjava.net/iamlibo/aggbug/217663.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/iamlibo/" target="_blank">Libo</a> 2008-07-26 15:20 <a href="http://www.blogjava.net/iamlibo/archive/2008/07/26/217663.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ubuntu 笔记</title><link>http://www.blogjava.net/iamlibo/archive/2008/07/26/217616.html</link><dc:creator>Libo</dc:creator><author>Libo</author><pubDate>Sat, 26 Jul 2008 01:07:00 GMT</pubDate><guid>http://www.blogjava.net/iamlibo/archive/2008/07/26/217616.html</guid><wfw:comment>http://www.blogjava.net/iamlibo/comments/217616.html</wfw:comment><comments>http://www.blogjava.net/iamlibo/archive/2008/07/26/217616.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/iamlibo/comments/commentRss/217616.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/iamlibo/services/trackbacks/217616.html</trackback:ping><description><![CDATA[
<pre xml:space="preserve">
<span class="Code">用虚拟机安装了一个ubuntu8.04,准备做jira的服务器.</span>
</pre>
<pre xml:space="preserve">
<span class="Code">1、安装java </span>
</pre>
<pre xml:space="preserve">
<span class="Code"><span class="Code">sudo apt-get install sun-java6-jdk</span></span>
</pre>
<pre xml:space="preserve">
<span class="Code"><span class="Code">如果硬盘空间小的话可以用 <span class="Code">sudo apt-get install sun-java6-jre </span></span></span>
</pre>
<pre xml:space="preserve">
<span class="Code"><span class="Code"><span class="Code">如果没有找到依赖包就刷新一下软件包,这样就可以从网上下载升级包了.</span></span></span>
</pre>
<pre xml:space="preserve">
<span class="Code"><span class="Code"><span class="Code">这个命令在64位的操作系统中提示找不到包，我想可能是ubuntu现在还没有sun64位的jdk.</span></span></span>
</pre>
<pre xml:space="preserve">
<span class="Code"><span class="Code"><span class="Code">编辑 /etc/profile 文件加入下面一行</span></span></span>
</pre>
<pre xml:space="preserve">
<span class="Code"><span class="Code"><span class="Code">export JAVA_HOME=/usr/lib/jvm/java-sun</span></span></span>
</pre>
<pre xml:space="preserve">
</pre>
<pre xml:space="preserve">
<span class="Code"><span class="Code"><span class="Code">2、配置静态IP地址</span></span></span>
</pre>
<pre xml:space="preserve">
<span class="Code"><span class="Code"><span class="Code">ubuntu的网络配置信息是保存在 /etc/network/interfaces这个文件中.</span></span></span>
</pre>
<pre xml:space="preserve">
<span class="Code">使用sudo gedit /etc/network/interfaces 编辑这个文件.</span>
</pre>
<pre xml:space="preserve">
<span class="Code">auto eth0 </span>
</pre>
<pre xml:space="preserve">
<span class="Code">iface eth0 inet static<br/>address 192.168.1.9<br/>netmask 255.255.255.0<br/>gateway 192.168.1.1</span>
</pre>
<pre xml:space="preserve">
<span class="Code">设置DNS<br/>编辑 /etc/resolv.conf，设置dns<br/>nameserver 202.96.134.133<br/>nameserver 202.106.0.20</span>
</pre>
<pre xml:space="preserve">
<span class="Code">3、安装FTP服务器(转)</span>
</pre>
<pre xml:space="preserve">
<span class="Code">sudo apt-get install vsftpd</span>
</pre>
<pre xml:space="preserve">
<span class="Code"><br/>安装了之后会在/home/下建立一个ftp目录。这时候你可以试着访问下ftp://IP地址。应该可以看到一个空白内容的ftp空间。<br/><br/><br/>默认设置下匿名用户可以下载，但不能写入或是上传<br/><br/></span>
</pre>
<br/><br/><br/><div class="textbox">
<p>现在我们要让匿名用户无法访问，并且得输入linux上的用户密码后才能访问到他们自己目录里的内容。</p>
<p>首先找到设置vsftpd的文件，位置在/etc/vsftpd.conf</p>
<p>修改之前最好先备份下这个文件：</p>
<pre xml:space="preserve">
<span class="Code">sudo cp /etc/vsftpd.conf /etc/vsftpd.conf.old</span>
</pre>
<p>然后可以改动了：</p>
<pre xml:space="preserve">
<span class="Code">#不让匿名用户使用<br/>#anonymous_enable=YES<br/><br/>#本地用户可用<br/>local_enable=YES <br/><br/>#可用写操作<br/>write_enable=YES<br/><br/>#不需要显示某目录下文件信息<br/>#dirmessage_enable=YES <br/><br/>#加点banner提示<br/>ftpd_banner=Hello~~ <br/><br/>#FTP服务器最大承载用户<br/>max_clients=100<br/><br/>#限制每个IP的进程<br/>max_per_ip=5<br/><br/>#最大传输速率(b/s)<br/>local_max_rate=256000<br/><br/>#隐藏帐号<br/>hide_ids=YES </span>
</pre>
<p>好了，重启下ftp 服务器看看效果</p>
</div>
<p><br/>4 安装TOMCAT 6</p>
<p>本来以为Tomcat安装很简单，没想到也遇到问题了。启动时提示The BASEDIR environment variable...意思是说有个叫BASEDIR的环境变量没有设置.后来一查才知道要将tcomat/bin目录下的所有.sh文件加入可执行权限。这样就OK了。</p>
<br/><p><br/><br/><br/></p>
<p class="zoundry_bw_tags">
  <!-- Tag links generated by Zoundry Blog Writer. Do not manually edit. http://www.zoundry.com -->
  <span class="ztags"><span class="ztagspace">Technorati</span> : <a href="http://technorati.com/tag/ubuntu" class="ztag" rel="tag">ubuntu</a></span> 
</p><img src ="http://www.blogjava.net/iamlibo/aggbug/217616.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/iamlibo/" target="_blank">Libo</a> 2008-07-26 09:07 <a href="http://www.blogjava.net/iamlibo/archive/2008/07/26/217616.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>spring 动态数据源</title><link>http://www.blogjava.net/iamlibo/archive/2008/07/20/216231.html</link><dc:creator>Libo</dc:creator><author>Libo</author><pubDate>Sun, 20 Jul 2008 12:49:00 GMT</pubDate><guid>http://www.blogjava.net/iamlibo/archive/2008/07/20/216231.html</guid><wfw:comment>http://www.blogjava.net/iamlibo/comments/216231.html</wfw:comment><comments>http://www.blogjava.net/iamlibo/archive/2008/07/20/216231.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/iamlibo/comments/commentRss/216231.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/iamlibo/services/trackbacks/216231.html</trackback:ping><description><![CDATA[
<p>Spring 可以设置动态数据源，这样可以对程序来透明的支持切换操作不同的数据库。</p>
<p><a href="http://oiote.blog.sohu.com/74596942.html">http://oiote.blog.sohu.com/74596942.html</a> 这篇文章写得非常不错。测试通过，并准备在项目中使用这个方法。还有几个问题希望大家给点意见：</p>
<p>首先说一下我的需求：数据库结构都是一样，但具体有多少个数据库不确定（视具体用户而定），用户操作那个数据库要根据登录的时候进行选择，或根据用户的权限而定。这个信息肯定是保存在用户的登录信息中(例如：session）</p>
<p>问题1、当有不同的用户需要操作不同的数据库时（根据登录时的选择或指定），什么时候切换数据库？是在service层还是dao层？这个信息怎么传给层中的方法？如果每个方法都加一个参数这样不太好吧？</p>
<p>问题2、这个频繁的更换数据库，会不会有性能影响？因为sessionFactory是一个切换数据库是不是就是重新初始一次sessionFactory?</p>
<p><br/></p>
<p>附原文如下：</p>
<p>Spring2.0.1以后的版本已经支持配置多数据源，并且可以在运行的时候动态加载不同的数据源。通过继承 AbstractRoutingDataSource就可以实现多数据源的动态转换。目前做的项目就是需要访问12个数据源，每个数据源的表结构都是相同的，所以要求数据源的变动对于编码人员来说是透明，也就是说同样SQL语句在不同的环境下操作的数据库是不一样的。具体的配置如下：<br/>一、首先需要写一个静态的键值对照类：</p>
<br/><p>代码</p>
<br/><p><br/></p>
<ol>
<li><span><span>package</span> <span>cn.com.xinli.ccp.dynamicds;</span></span></li>
<li><span>public</span> <span>class</span> <span>DataSourceMap {</span></li>
<li><span>public</span> <span>static</span> <span>final</span> <span>String Admin=</span><span>"Admin"</span><span>;</span></li>
<li><span>public</span> <span>static</span> <span>final</span> <span>String Yxh =</span> <span>"Yxh"</span><span>;</span></li>
<li><span>}</span></li>
</ol>
<br/><br/><br/><br/><p>这个类主要在使用的时候当作获得数据源的标志使用。<br/>二、建立一个获得和设置上下文的类：<br/></p>
<p>代码</p>
<br/><p><br/></p>
<ol>
<li><span><span>package</span> <span>cn.com.xinli.ccp.dynamicds;</span></span></li>
<li><span>public</span> <span>class</span> <span>CustomerContextHolder {</span></li>
<li><span>private</span> <span>static</span> <span>final</span> <span>ThreadLocal contextHolder =</span></li>
<li><span>new</span> <span>ThreadLocal();</span></li>
<li><span>public</span> <span>static</span> <span>void</span> <span>setCustomerType(String customerType) {</span></li>
<li><span>contextHolder.set(customerType);</span></li>
<li><span>}</span></li>
<li><span>public</span> <span>static</span> <span>String getCustomerType() {</span></li>
<li><span>return</span> <span>(String) contextHolder.get();</span></li>
<li><span>}</span></li>
<li><span>public</span> <span>static</span> <span>void</span> <span>clearCustomerType() {</span></li>
<li><span>contextHolder.remove();</span></li>
<li><span>}</span></li>
<li><span>}</span></li>
</ol>
<br/><br/><p><br/>这个主要负责设置上下文环境和获得上下文环境。<br/>三、建立动态数据源类，这个类必须继承AbstractRoutingDataSource：<br/></p>
<p>代码</p>
<br/><p><br/></p>
<ol>
<li><span><span>package</span> <span>cn.com.xinli.ccp.dynamicds;</span></span></li>
<li><span>import</span> <span>org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;</span></li>
<li><span>public</span> <span>class</span> <span>DynamicDataSource</span> <span>extends</span> <span>AbstractRoutingDataSource {</span></li>
<li><span>protected</span> <span>Object determineCurrentLookupKey() {</span></li>
<li><span>// TODO Auto-generated method stub</span></li>
<li><span>return</span> <span>CustomerContextHolder.getCustomerType();</span></li>
<li><span>}</span></li>
<li><span>}</span></li>
</ol>
<br/><br/><p><br/>这个类实现了 determineCurrentLookupKey方法，该方法返回一个Object，一般是返回字符串，也可以是枚举类型。该方法中直接使用了 CustomerContextHolder.getCustomerType()方法获得上下文环境并直接返回。<br/>四、编写spring的配置文件配置数据源<br/></p>
<p>代码</p>
<br/><p><br/></p>
<ol>
<li><span><span>&lt;</span><span>bean</span> <span>id</span><span>=</span><span>"parentDataSource"</span> </span></li>
<li><span>class</span><span>=</span><span>"org.springframework.jdbc.datasource.DriverManagerDataSource"</span><span>&gt;</span></li>
<li><span>&lt;</span><span>property</span> <span>name</span><span>=</span><span>"driverClassName"</span><span>&gt;</span></li>
<li><span>&lt;</span><span>value</span><span>&gt;</span><span>COM.ibm.db2.jdbc.net.DB2Driver</span><span>&lt;/</span><span>value</span><span>&gt;</span></li>
<li><span>&lt;/</span><span>property</span><span>&gt;</span></li>
<li><span>&lt;</span><span>property</span> <span>name</span><span>=</span><span>"url"</span><span>&gt;</span></li>
<li><span>&lt;</span><span>value</span><span>&gt;</span><span>jdbc:db2:127.0.0.1:TEST</span><span>&lt;/</span><span>value</span><span>&gt;</span></li>
<li><span>&lt;/</span><span>property</span><span>&gt;</span></li>
<li><span>&lt;/</span><span>bean</span><span>&gt;</span></li>
<li><span>&lt;</span><span>bean</span> <span>id</span><span>=</span><span>"adminDataSource"</span> <span>parent</span><span>=</span><span>"parentDataSource"</span><span>&gt;</span></li>
<li><span>&lt;</span><span>property</span> <span>name</span><span>=</span><span>"username"</span> <span>value</span><span>=</span><span>"admin"</span><span>/&gt;</span></li>
<li><span>&lt;</span><span>property</span> <span>name</span><span>=</span><span>"password"</span> <span>value</span><span>=</span><span>"master997mb"</span><span>/&gt;</span></li>
<li><span>&lt;/</span><span>bean</span><span>&gt;</span></li>
<li><span>&lt;</span><span>bean</span> <span>id</span><span>=</span><span>"yxhDataSource"</span> <span>parent</span><span>=</span><span>"parentDataSource"</span><span>&gt;</span></li>
<li><span>&lt;</span><span>property</span> <span>name</span><span>=</span><span>"username"</span> <span>value</span><span>=</span><span>"yxh"</span><span>/&gt;</span></li>
<li><span>&lt;</span><span>property</span> <span>name</span><span>=</span><span>"password"</span> <span>value</span><span>=</span><span>"yxh"</span><span>/&gt;</span></li>
<li><span>&lt;/</span><span>bean</span><span>&gt;</span></li>
</ol>
<br/><br/><p><br/>在这个配置中可以看到首先有个parentDataSource，这个主要配置一些数据源的公用信息，项目中都是链接DB2数据库；adminDataSource和yxhDataSource是根据不同需要配置的个性化信息，但都必须加parent属性，值为 parentDataSource。这样就配置好了2个数据源信息。当然如果链接的多数据源是不同类型的两个数据库，那么 parentDataSource就可以不要了，直接配置两个不同的数据源链接就可以了。<br/>五、编写spring配置文件配置多数据源映射关系<br/></p>
<p>代码</p>
<br/><p><br/></p>
<ol>
<li><span><span>&lt;</span><span>bean</span> <span>id</span><span>=</span><span>"dataSource"</span> <span>class</span><span>=</span><span>"cn.com.xinli.ccp.dynamicds.DynamicDataSource"</span><span>&gt;</span> </span></li>
<li><span>&lt;</span><span>property</span> <span>name</span><span>=</span><span>"targetDataSources"</span><span>&gt;</span></li>
<li><span>&lt;</span><span>map</span> <span>key-type</span><span>=</span><span>"java.lang.String"</span><span>&gt;</span></li>
<li><span>&lt;</span><span>entry</span> <span>key</span><span>=</span><span>"Yxh"</span> <span>value-ref</span><span>=</span><span>"yxhDataSource"</span><span>/&gt;</span></li>
<li><span>&lt;/</span><span>map</span><span>&gt;</span></li>
<li><span>&lt;/</span><span>property</span><span>&gt;</span></li>
<li><span>&lt;</span><span>property</span> <span>name</span><span>=</span><span>"defaultTargetDataSource"</span> <span>ref</span><span>=</span><span>"adminDataSource"</span><span>/&gt;</span></li>
<li><span>&lt;/</span><span>bean</span><span>&gt;</span></li>
</ol>
<br/><br/><p><br/>在这个配置中第一个property属性配置目标数据源，&lt;map key-type="java.lang.String"&gt;中的key-type必须要和静态键值对照类DataSourceMap中的值的类型相同；&lt;entry key="Yxh" value-ref="yxhDataSource"/&gt;中key的值必须要和静态键值对照类中的值相同，如果有多个值，可以配置多个&lt; entry&gt;标签。第二个property属性配置默认的数据源。<br/>六、配置hibernate。<br/>Hibernate的配置和普通的hibernate、spring结合的配置一样<br/></p>
<p>代码</p>
<br/><p><br/></p>
<ol>
<li><span><span>&lt;</span><span>bean</span> <span>id</span><span>=</span><span>"sessionFactory"</span> </span></li>
<li><span>class</span><span>=</span><span>"org.springframework.orm.hibernate3.LocalSessionFactoryBean"</span><span>&gt;</span></li>
<li><span>&lt;!-- to override, use the "SpringDatasourceConfig" snippet in your project --&gt;</span></li>
<li><span>&lt;</span><span>property</span> <span>name</span><span>=</span><span>"dataSource"</span><span>&gt;</span></li>
<li><span>&lt;</span><span>ref</span> <span>local</span><span>=</span><span>"dataSource"</span> <span>/&gt;</span></li>
<li><span>&lt;/</span><span>property</span><span>&gt;</span></li>
<li><span>&lt;</span><span>property</span> <span>name</span><span>=</span><span>"mappingResources"</span><span>&gt;</span></li>
<li><span>&lt;</span><span>list</span><span>&gt;</span></li>
<li><span>&lt;</span><span>value</span><span>&gt;</span></li>
<li><span>cn/com/xinli/ccp/entity/User.hbm.xml</span></li>
<li><span>&lt;/</span><span>value</span><span>&gt;</span></li>
<li><span>&lt;</span><span>value</span><span>&gt;</span></li>
<li><span>cn/com/xinli/ccp/entity/Test.hbm.xml</span></li>
<li><span>&lt;/</span><span>value</span><span>&gt;</span></li>
<li><span>&lt;/</span><span>list</span><span>&gt;</span></li>
<li><span>&lt;/</span><span>property</span><span>&gt;</span></li>
<li><span>&lt;</span><span>property</span> <span>name</span><span>=</span><span>"hibernateProperties"</span><span>&gt;</span></li>
<li><span>&lt;</span><span>props</span><span>&gt;</span></li>
<li><span>&lt;</span><span>prop</span> <span>key</span><span>=</span><span>"hibernate.dialect"</span><span>&gt;</span></li>
<li><span>org.hibernate.dialect.DB2Dialect</span></li>
<li><span>&lt;/</span><span>prop</span><span>&gt;</span></li>
<li><span>&lt;</span><span>prop</span> <span>key</span><span>=</span><span>"hibernate.show_sql"</span><span>&gt;</span><span>true</span><span>&lt;/</span><span>prop</span><span>&gt;</span></li>
<li><span>&lt;</span><span>prop</span> <span>key</span><span>=</span><span>"hibernate.use_outer_join"</span><span>&gt;</span><span>true</span><span>&lt;/</span><span>prop</span><span>&gt;</span></li>
<li><span>&lt;</span><span>prop</span> <span>key</span><span>=</span><span>"hibernate.jdbc.batch_size"</span><span>&gt;</span><span>50</span><span>&lt;/</span><span>prop</span><span>&gt;</span></li>
<li><span>&lt;</span><span>prop</span> <span>key</span><span>=</span><span>"hibernate.jdbc.fetch_size"</span><span>&gt;</span><span>5</span><span>&lt;/</span><span>prop</span><span>&gt;</span></li>
<li><span>&lt;</span><span>prop</span> <span>key</span><span>=</span><span>"hibernate.connection.pool_size"</span><span>&gt;</span><span>2</span><span>&lt;/</span><span>prop</span><span>&gt;</span></li>
<li><span>&lt;</span><span>prop</span> <span>key</span><span>=</span><span>"hibernate.connection.autocommit"</span><span>&gt;</span><span>false</span><span>&lt;/</span><span>prop</span><span>&gt;</span></li>
<li><span>&lt;</span><span>prop</span> <span>key</span><span>=</span><span>"hibernate.cache.use_query_cache"</span><span>&gt;</span><span>false</span><span>&lt;/</span><span>prop</span><span>&gt;</span></li>
<li><span>&lt;</span><span>prop</span> <span>key</span><span>=</span><span>"hibernate.max_fetch_depth"</span><span>&gt;</span><span>1</span><span>&lt;/</span><span>prop</span><span>&gt;</span></li>
<li><span>&lt;</span><span>prop</span> <span>key</span><span>=</span><span>"hibernate.bytecode.use_reflection_optimizer"</span><span>&gt;</span><span>true</span><span>&lt;/</span><span>prop</span><span>&gt;</span></li>
<li><span>&lt;/</span><span>props</span><span>&gt;</span></li>
<li><span>&lt;/</span><span>property</span><span>&gt;</span></li>
<li><span>&lt;/</span><span>bean</span><span>&gt;</span></li>
<li><span>&lt;</span><span>bean</span> <span>id</span><span>=</span><span>"mydao"</span> <span>class</span><span>=</span><span>"cn.com.xinli.ccp.dao.HibernateBaseDao"</span><span>&gt;</span></li>
<li><span>&lt;</span><span>property</span> <span>name</span><span>=</span><span>"sessionFactory"</span><span>&gt;</span></li>
<li><span>&lt;</span><span>ref</span> <span>local</span><span>=</span><span>"sessionFactory"</span> <span>/&gt;</span></li>
<li><span>&lt;/</span><span>property</span><span>&gt;</span></li>
<li><span>&lt;/</span><span>bean</span><span>&gt;</span></li>
</ol>
<br/><br/><p><br/>关于dao的代码这里就省略了。<br/>七、配置结束，可以使用了。<br/></p>
<p>代码</p>
<br/><p><br/></p>
<ol>
<li><span><span>public</span> <span>class</span> <span>DaoTest</span> <span>extends</span> <span>TestCase {</span></span></li>
<li><span>public</span> <span>void</span> <span>testSave()</span> <span>throws</span> <span>Exception{</span></li>
<li><span>CustomerContextHolder.setCustomerType(DataSourceMap.Admin);</span><span>//设置数据源</span></li>
<li><span>//hibernate创建实体</span></li>
<li><span>Test test =</span> <span>new</span> <span>Test();</span></li>
<li><span>test.setTest(</span><span>"22222222"</span><span>);</span></li>
<li><span>mydao.save(test);</span><span>//使用dao保存实体</span></li>
<li><span>CustomerContextHolder.setCustomerType(DataSourceMap.Yxh);</span><span>//设置为另一个数据源</span></li>
<li><span>mydao.save(test);</span><span>//使用dao保存实体到另一个库中</span></li>
<li><span>}</span></li>
<li><span>}</span></li>
</ol>
<br/><br/><p>在项目中对于编码人员对多数据源的切换可以做成透明的，操作同样的dao，就可以访问不同的数据库了。</p>
<p class="zoundry_bw_tags">
  <!-- Tag links generated by Zoundry Blog Writer. Do not manually edit. http://www.zoundry.com -->
  <span class="ztags"><span class="ztagspace">Technorati</span> : <a href="http://technorati.com/tag/spring" class="ztag" rel="tag">spring</a></span> 
</p><img src ="http://www.blogjava.net/iamlibo/aggbug/216231.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/iamlibo/" target="_blank">Libo</a> 2008-07-20 20:49 <a href="http://www.blogjava.net/iamlibo/archive/2008/07/20/216231.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Facelets组件</title><link>http://www.blogjava.net/iamlibo/archive/2008/07/18/215816.html</link><dc:creator>Libo</dc:creator><author>Libo</author><pubDate>Fri, 18 Jul 2008 07:22:00 GMT</pubDate><guid>http://www.blogjava.net/iamlibo/archive/2008/07/18/215816.html</guid><wfw:comment>http://www.blogjava.net/iamlibo/comments/215816.html</wfw:comment><comments>http://www.blogjava.net/iamlibo/archive/2008/07/18/215816.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/iamlibo/comments/commentRss/215816.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/iamlibo/services/trackbacks/215816.html</trackback:ping><description><![CDATA[
<p>facelets 可以自定义组件，今天看了一下,果然好用。</p>
<p>以前使用facelets只是定义一个界面的模板，并不没有深入它的自定义组件方面的内容，其实它的自定义组件也就是定义一个tag，然后在xhtml中引入这个tag，但这要比普通的JSP方式的tag方便多了。</p>
<p>要想引用自定义的tag要在web.xml中加入下面代码(<span style="COLOR: #ff0000">前提是一定配置好其他的facelets内容</span>)</p>
<p>&lt;context-param&gt;<br/>&lt;param-name&gt;facelets.LIBRARIES&lt;/param-name&gt;<br/>&lt;param-value&gt;<br/>/WEB-INF/tld/xiangyun.taglib.xml<br/>&lt;/param-value&gt;<br/>&lt;/context-param&gt;<br/><br/>xiangyun.taglib.xml文件的内容如下：</p>
<p>&lt;?xml version="1.0"?&gt;<br/>&lt;!DOCTYPE facelet-taglib PUBLIC<br/>"-//Sun Microsystems, Inc.//DTD Facelet Taglib 1.0//EN"<br/>"<a href="https://facelets.dev.java.net/source/browse/*checkout*/facelets/src/etc/facelet-taglib_1_0.dtd">https://facelets.dev.java.net/source/browse/*checkout*/facelets/src/etc/facelet-taglib_1_0.dtd</a>"&gt;</p>
<p>&lt;facelet-taglib&gt;<br/>&lt;namespace&gt;http://xiangyun.cn/components&lt;/namespace&gt;<br/>&lt;tag&gt;<br/>&lt;tag-name&gt;echo&lt;/tag-name&gt;<br/>&lt;source&gt;component.jspx&lt;/source&gt;<br/>&lt;/tag&gt;<br/>&lt;/facelet-taglib&gt;<br/></p>
<p>在这里引用了一个component.jspx文件，这个文件就是一个或一组想放在一块当做一个组件使用的内容，和其他的jspx文件的写法一样。内容如下：</p>
<p><br/>&lt;ui:composition xmlns:ui="<a href="http://java.sun.com/jsf/facelets">http://java.sun.com/jsf/facelets</a>"<br/>xmlns:ice="<a href="http://www.icesoft.com/icefaces/component">http://www.icesoft.com/icefaces/component</a>"<br/>xmlns:h="<a href="http://java.sun.com/jsf/html">http://java.sun.com/jsf/html</a>"<br/>xmlns:f="<a href="http://java.sun.com/jsf/core">http://java.sun.com/jsf/core</a>"&gt;<br/>&lt;ice:selectInputDate id="inputDate" popupDateFormat="MM/dd/yyyy"<br/>value="#{inputDate}" renderAsPopup="true"<br/>styleClass="iceSelInpDateInput" onkeydown="ctlent(event);"<br/>rendered="true"&gt;<br/>&lt;/ice:selectInputDate&gt;<br/>&lt;h:outputText value="#{inputDate}"<br/>rendered="true" styleClass="printText"&gt;<br/>&lt;f:convertDateTime dateStyle="long" type="date" timeZone="GMT+8"<br/>locale="cn" /&gt;<br/>&lt;/h:outputText&gt;<br/>&lt;/ui:composition&gt;</p>
<p>只需要注意&lt;ui:composition&gt;标签和引入的命名空间就行，标签里面的内容就看你要完成的功能了。在这里我使用了ICEfaces的日期组件，可以替换成JSF支技的任何东西。</p>
<p>接下来就是要使用了。</p>
<p>&lt;html xmlns="<a href="http://www.w3.org/1999/xhtml">http://www.w3.org/1999/xhtml</a>"<br/>xmlns:ui="<a href="http://java.sun.com/jsf/facelets">http://java.sun.com/jsf/facelets</a>"<br/>xmlns:ald="<a href="http://xiangyun.cn/components">http://xiangyun.cn/components</a>"&gt;<br/>&lt;ui:composition template="/pages/layout/layout.jspx"&gt;<br/>&lt;ui:define name="content"&gt;<br/>&lt;h:form id="testForm"&gt;<br/>&lt;ald:echo inputDate="#{testBean.date}"/&gt;<br/>&lt;/h:form&gt;<br/>&lt;/ui:define&gt;<br/>&lt;/ui:composition&gt;<br/>&lt;/html&gt;<br/></p>
<p>这里需要引入命名空间，定义前缀为ald，</p>
<p>&lt;ald:echo&gt;这个标签名同xiangyun.taglib.xml中声明的要一致，inputDate是在定义组件component.jspx中声明的#{inputDate}，它可以接收EL表达式。</p>
<p>这样我们就可以把大的复杂的页面，分成可以重用的组件了。</p>
<p>有问题可以和我联系：<a href="mailto:wfn_libo@163.com">wfn_libo@163.com</a></p>
<p>也可以参考<a href="https://facelets.dev.java.net/nonav/docs/dev/docbook.html#gettingstarted-bean">https://facelets.dev.java.net/nonav/docs/dev/docbook.html#gettingstarted-bean</a></p>
<p class="zoundry_bw_tags">
  <!-- Tag links generated by Zoundry Blog Writer. Do not manually edit. http://www.zoundry.com -->
  <span class="ztags"><span class="ztagspace">Technorati</span> : <a href="http://technorati.com/tag/facelets" class="ztag" rel="tag">facelets</a>, <a href="http://technorati.com/tag/jsf" class="ztag" rel="tag">jsf</a></span> 
</p><img src ="http://www.blogjava.net/iamlibo/aggbug/215816.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/iamlibo/" target="_blank">Libo</a> 2008-07-18 15:22 <a href="http://www.blogjava.net/iamlibo/archive/2008/07/18/215816.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>从spring配置文件读取bean的方法</title><link>http://www.blogjava.net/iamlibo/archive/2008/07/09/213557.html</link><dc:creator>Libo</dc:creator><author>Libo</author><pubDate>Wed, 09 Jul 2008 03:13:00 GMT</pubDate><guid>http://www.blogjava.net/iamlibo/archive/2008/07/09/213557.html</guid><wfw:comment>http://www.blogjava.net/iamlibo/comments/213557.html</wfw:comment><comments>http://www.blogjava.net/iamlibo/archive/2008/07/09/213557.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/iamlibo/comments/commentRss/213557.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/iamlibo/services/trackbacks/213557.html</trackback:ping><description><![CDATA[<p><span style="font-family: Arial;">转</span></p>
<p><span style="font-family: Arial;"><a href="http://omencathay.itpub.net/post/30163/443031">http://omencathay.itpub.net/post/30163/443031</a></span></p>
<p><span style="font-family: Arial;">/**第一种 */<br />
ApplicationContext ac = new FileSystemXmlApplicationContext("serviceContext.xml");<br />
JurisdictionImp jurisdictionImp = (JurisdictionImp)ac.getBean("jurisdictionImp");<br />
/**第二种*/<br />
FileSystemXmlApplicationContext ctx =new FileSystemXmlApplicationContext(CONTEXT_FILE);<br />
JurisdictionImp jurisdictionImp = (JurisdictionImp) ctx.getBean("jurisdictionImp");<br />
/**第三种*/<br />
Resource resource = new ClassPathResource(CONTEXT_FILE);<br />
XmlBeanFactory beanFactory = new XmlBeanFactory( resource);<br />
JurisdictionImp jurisdictionImp=(JurisdictionImp) beanFactory.getBean("jurisdictionImp");<br />
/**第四种*/<br />
ServletContext context=request.getSession().getServletContext();<br />
ApplicationContext ctx = WebApplicationContextUtils.getRequiredWebApplicationContext(context);<br />
JurisdictionImp jurisdictionImp=(JurisdictionImp) ctx.getBean("jurisdictionImp");<br />
/**第五种*/<br />
/**<br />
* 获得其它业务类对象<br />
* */<br />
public Object getBean(String name)<br />
{<br />
WebApplicationContext ctx<br />
if (ctx == null)<br />
{<br />
ctx = WebApplicationContextUtils<br />
.getRequiredWebApplicationContext(servlet.getServletContext());<br />
}<br />
return ctx.getBean(name);<br />
}</span></p>
<img src ="http://www.blogjava.net/iamlibo/aggbug/213557.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/iamlibo/" target="_blank">Libo</a> 2008-07-09 11:13 <a href="http://www.blogjava.net/iamlibo/archive/2008/07/09/213557.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JSF 动态创建组件</title><link>http://www.blogjava.net/iamlibo/archive/2008/07/01/212007.html</link><dc:creator>Libo</dc:creator><author>Libo</author><pubDate>Tue, 01 Jul 2008 13:39:00 GMT</pubDate><guid>http://www.blogjava.net/iamlibo/archive/2008/07/01/212007.html</guid><wfw:comment>http://www.blogjava.net/iamlibo/comments/212007.html</wfw:comment><comments>http://www.blogjava.net/iamlibo/archive/2008/07/01/212007.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/iamlibo/comments/commentRss/212007.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/iamlibo/services/trackbacks/212007.html</trackback:ping><description><![CDATA[
<p>JSF 的组件和组件树的概念非常好,可以完全通过JAVA代码实现的组件的生成与设置方法等操作.尤其是JSF1.2提供了更多的组件的Binding方法.下面就实际做一个例子.</p>
<p>首先在managedBean中创建组件</p>
<p>1、创建按钮</p>
<p>private HtmlCommandButton button = new HtmlCommandButton();</p>
<p>public HtmlCommandButton getButton() {<br/>button.setValue("button"); //设置按钮上显示的值<br/>FacesContext context = FacesContext.getCurrentInstance();<br/>ELContext elContext = context.getELContext();<br/>ExpressionFactory ef = context.getApplication().getExpressionFactory();<br/>Class[] c = new Class[0];<br/>// c[0] = ActionEvent.class; //此处想调用一个带参数的方法,没有成功<br/>MethodExpression me = ef.createMethodExpression(elContext,<br/>"#{testBean.testEl}", Void.TYPE, c);<br/>button.setActionExpression(me); //为钮加入一个响应的方法,这种方法是JSF1.2方式的</p>
<p>return button;<br/>}</p>
<p>//在运行时被调用的方式,同前面的方法绑定中的EL表达是一致的.</p>
<p>public void testEl() {<br/>System.out.println("testEl method is run no param");<br/>}</p>
<p>在JSP页面中加入按钮.(testBean是在FacesConfig.xml中声明的上的bean)</p>
<p>&lt;h:commandButton binding="#{testBean.button }"/&gt;</p>
<p>2、创建表格<br/>private HtmlPanelGrid grid = new HtmlPanelGrid();<br/></p>
<p>public HtmlPanelGrid getGrid() {<br/>List list = grid.getChildren();//取得表格的列表<br/>list.add(getHtmlInputText());//向表格列表加入组件<br/>System.out.println("grid column " + grid.getColumns());<br/>return grid;<br/>}</p>
<p>public HtmlInputText getHtmlInputText() {<br/>htmlInputText.setValue("abcc");//这里直接设置值了，可以通过expressionFactory.createValueExpression(elContext, "#{testBean.userid}", String.class);来设置值表达式</p>
<p>htmlInputText.setAlt("alt htmlInputText ");<br/>htmlInputText.setConverter(new TestConve());//为输入框设置转换器<br/>return htmlInputText;<br/>}<br/></p>
<p>在JSP中加入下面代码:</p>
<p>&lt;h:panelGrid binding="#{testBean.grid }"/&gt;</p>
<p>就可以在表格内显示一个输入框了。</p>
<p><br/></p>
<p class="zoundry_bw_tags">
  <!-- Tag links generated by Zoundry Blog Writer. Do not manually edit. http://www.zoundry.com -->
  <span class="ztags"><span class="ztagspace">Technorati</span> : <a href="http://technorati.com/tag/jsf" class="ztag" rel="tag">jsf</a>, <a href="http://technorati.com/tag/%E5%8A%A8%E6%80%81%E7%BB%84%E4%BB%B6" class="ztag" rel="tag">动态组件</a></span> 
</p><img src ="http://www.blogjava.net/iamlibo/aggbug/212007.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/iamlibo/" target="_blank">Libo</a> 2008-07-01 21:39 <a href="http://www.blogjava.net/iamlibo/archive/2008/07/01/212007.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>birt应用</title><link>http://www.blogjava.net/iamlibo/archive/2008/05/16/200947.html</link><dc:creator>Libo</dc:creator><author>Libo</author><pubDate>Fri, 16 May 2008 08:14:00 GMT</pubDate><guid>http://www.blogjava.net/iamlibo/archive/2008/05/16/200947.html</guid><wfw:comment>http://www.blogjava.net/iamlibo/comments/200947.html</wfw:comment><comments>http://www.blogjava.net/iamlibo/archive/2008/05/16/200947.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/iamlibo/comments/commentRss/200947.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/iamlibo/services/trackbacks/200947.html</trackback:ping><description><![CDATA[
<p>有转载有原创,就算做个整理吧.</p>
<p>1、row 的背景颜色交替变换</p>
<p>选中table -&gt;details 然后在</p>
<p>onPrepare方法中加入下面代码</p>
<p>var count=1;</p>
<p>在onCreate方法中加入下面代码</p>
<p>count++;<br/>this.getStyle().backgroundColor=(count%2==0?"red":"blue");</p>
<p>这样表格就可以是红蓝交替显示了。<br/></p>
<p>2、按一定的条件显示特定行,比如以红色显示数量小于0的行</p>
<p>if( row["inQ"]&lt;0)<br/>this.getStyle().backgroundColor="red";</p>
<p>其中之一"inQ"是表中的列名,不一定是数据集成的列名，一开始以为是数据集成的列名，搞了好长时间。如果列名与数据集中的列名一样就没有问题了。</p>
<p>3、参数类型</p>
<p>birt 报表中的日期(date)型参数是java.sql.Date而不是java.util.Date</p>
<p>是看birt 源码才知道，下面是检查参数类型的方法的代码</p>
<p>private boolean validateParameterValueType(String paramName, Object paramValue, String type, ScalarParameterHandle paramHandle)<br/>throws ParameterValidationException<br/>{<br/>if("decimal".equals(type) || "float".equals(type))<br/>if(paramValue instanceof Number)<br/>return true;<br/>else<br/>throw new ParameterValidationException("Error.InvalidParameterType", new String[] {<br/>paramName, type, paramValue.getClass().getName()<br/>});<br/>if("dateTime".equals(type))<br/>if(paramValue instanceof Date)<br/>return true;<br/>else<br/>throw new ParameterValidationException("Error.InvalidParameterType", new String[] {<br/>paramName, type, paramValue.getClass().getName()<br/>});<br/>if("date".equals(type))<br/>if(paramValue instanceof java.sql.Date)<br/>return true;<br/>else<br/>throw new ParameterValidationException("Error.InvalidParameterType", new String[] {<br/>paramName, type, paramValue.getClass().getName()<br/>});<br/>if("time".equals(type))<br/>if(paramValue instanceof Time)<br/>return true;<br/>else<br/>throw new ParameterValidationException("Error.InvalidParameterType", new String[] {<br/>paramName, type, paramValue.getClass().getName()<br/>});<br/>if("string".equals(type))<br/>{<br/>if(paramHandle.isRequired())<br/>{<br/>String value = paramValue.toString().trim();<br/>if(value.length() == 0)<br/>throw new ParameterValidationException("Error.ParameterValueBlank", new String[] {<br/>paramName<br/>});<br/>}<br/>return true;<br/>}<br/>if("boolean".equals(type))<br/>{<br/>if(paramValue instanceof Boolean)<br/>return true;<br/>else<br/>throw new ParameterValidationException("Error.InvalidParameterType", new String[] {<br/>paramName, type, paramValue.getClass().getName()<br/>});<br/>} else<br/>{<br/>return true;<br/>}<br/>}<br/></p>
<p><br/></p>
<p class="zoundry_bw_tags">
  <!-- Tag links generated by Zoundry Blog Writer. Do not manually edit. http://www.zoundry.com -->
  <span class="ztags"><span class="ztagspace">Technorati</span> : <a href="http://technorati.com/tag/birt" class="ztag" rel="tag">birt</a></span> 
</p><img src ="http://www.blogjava.net/iamlibo/aggbug/200947.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/iamlibo/" target="_blank">Libo</a> 2008-05-16 16:14 <a href="http://www.blogjava.net/iamlibo/archive/2008/05/16/200947.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>svn 分支与合并</title><link>http://www.blogjava.net/iamlibo/archive/2008/05/16/200795.html</link><dc:creator>Libo</dc:creator><author>Libo</author><pubDate>Fri, 16 May 2008 02:18:00 GMT</pubDate><guid>http://www.blogjava.net/iamlibo/archive/2008/05/16/200795.html</guid><wfw:comment>http://www.blogjava.net/iamlibo/comments/200795.html</wfw:comment><comments>http://www.blogjava.net/iamlibo/archive/2008/05/16/200795.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/iamlibo/comments/commentRss/200795.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/iamlibo/services/trackbacks/200795.html</trackback:ping><description><![CDATA[
<p><a href="http://www.svn8.com/SVNSY/20080505/576.html">http://www.svn8.com/SVNSY/20080505/576.html</a></p>
<br/><p style="TEXT-INDENT: 24pt" class="a"><span style="FONT-FAMILY: 宋体">程序员编写程序的过程中，每个程序都会有很多不同的版本，这就需要程序员很好的管理代码，在需要的时间可以取出需要的版本，并且每个版本都有一个完整的说明。</span></p>
<p style="TEXT-INDENT: 24pt" class="a"><span style="FONT-FAMILY: 宋体">我们使用</span>Sub Version<span style="FONT-FAMILY: 宋体">（简称</span>SVN<span style="FONT-FAMILY: 宋体">）作为版本管理工具。这里着重介绍</span>SVN<span style="FONT-FAMILY: 宋体">作为跨平台的多人协作使用方法。在多个程序员管理同一段代码的过程中，版本的管理显得尤为重要，使用</span>SVN<span style="FONT-FAMILY: 宋体">可以方便的进行分支、合并，记录下所有的版本。</span></p>
<a name="_Toc121547261" id="_Toc121547261"/><span><span style="FONT-FAMILY: 宋体">基本配置</span></span>
<p style="TEXT-INDENT: 24pt" class="a"><span style="FONT-FAMILY: 宋体">在开始某项软件、文档的开发与撰写时，首先由配置管理负责人建立</span>SVN<span style="FONT-FAMILY: 宋体">仓库、用户名及其权限，并通知相关人员</span>SVN<span style="FONT-FAMILY: 宋体">仓库地址、</span>SVN<span style="FONT-FAMILY: 宋体">仓库负责人。</span></p>
<a name="_Toc121547262" id="_Toc121547262"/>
<p style="TEXT-INDENT: 24pt" class="a">SVN<span style="FONT-FAMILY: 宋体">仓库的负责人把工程的</span>tsvn:logminisize<span style="FONT-FAMILY: 宋体">设置为</span>1<span style="FONT-FAMILY: 宋体">，以便强制注释。设置方法：在你的工程文件夹右键</span>-&gt;<span style="FONT-FAMILY: 宋体">属性中，进入</span>Subversion<span style="FONT-FAMILY: 宋体">标签，选中</span>tsvn: logminisize<span style="FONT-FAMILY: 宋体">，确保复选框</span>recursive<span style="FONT-FAMILY: 宋体">选中，然后点击</span>Set<span style="FONT-FAMILY: 宋体">按钮把它的值设为</span>1<span style="FONT-FAMILY: 宋体">，其意思是指提交的注释最短长度为一个字。如图：</span></p>
<p style="MARGIN-LEFT: 60pt; TEXT-INDENT: 24pt" class="a"><img width="397" height="541" border="0" src="http://www.svn8.com/uploads/allimg/080505/0810340.jpg"/></p>
<p><span style="FONT-FAMILY: 宋体">图</span> <span><span>2</span></span><span>.</span><span><span>1</span></span></p>
<a name="_Toc121547263" id="_Toc121547263"/><span><span style="FONT-FAMILY: 宋体">软件配置</span></span>
<p style="MARGIN-LEFT: 45pt; TEXT-INDENT: -21pt" class="a"><span style="FONT-FAMILY: Wingdings"><span>l </span></span> <span style="FONT-FAMILY: 宋体">忽略文件</span></p>
<p style="TEXT-INDENT: 24pt" class="a"><span style="FONT-FAMILY: 宋体">在</span><span>SVN</span> <span style="FONT-FAMILY: 宋体">的</span><span>[Setting]</span><span style="FONT-FAMILY: 宋体">的</span><span>[General]</span><span style="FONT-FAMILY: 宋体">中</span><span style="FONT-FAMILY: 宋体">，</span><span style="FONT-FAMILY: 宋体">设置需要忽略的文件以便忽略掉一些临时的、无用的文件</span><span style="FONT-FAMILY: 宋体">，</span><span style="FONT-FAMILY: 宋体">常被忽略的文件有</span><span>*.opt *.ncb *.suo *.plg *.pch *.idb *.pdb *.scc *.obj Debug Release *.o *.bin *.out *.ilk *.aps debug release *.clw *.bak</span><span style="FONT-FAMILY: 宋体">。每个程序员可以根据自己的需要进行修改忽略文件，上面只是使用</span>VC++<span style="FONT-FAMILY: 宋体">与</span>Tornado<span style="FONT-FAMILY: 宋体">编程时常用的一些忽略文件。</span><img width="586" height="371" border="0" src="http://www.svn8.com/uploads/allimg/080505/0810341.jpg"/></p>
<p><span style="FONT-FAMILY: 宋体">图</span> <span><span>2</span></span><span>.</span><span><span>2</span></span></p>
<p style="TEXT-INDENT: 24pt" class="a"><span style="FONT-FAMILY: 宋体">以上说的忽略文件是指全局的忽略文件。</span>SVN<span style="FONT-FAMILY: 宋体">还能在特定的目录中指定需要忽略的文件。忽略文件支持通配符。</span></p>
<p style="MARGIN-LEFT: 45pt; TEXT-INDENT: -21pt" class="a"><span style="FONT-FAMILY: Wingdings"><span>l </span></span> <span style="FONT-FAMILY: 宋体">合并比较工具</span></p>
<p style="TEXT-INDENT: 24pt" class="a"><span style="FONT-FAMILY: 宋体">在</span>Merge Tool<span style="FONT-FAMILY: 宋体">中可以选择用来合并的工具，强烈推荐用</span>Araxis Merge<span style="FONT-FAMILY: 宋体">。在</span>[Setting]-&gt;[Diff]<span style="FONT-FAMILY: 宋体">中填入</span>"C:\Program Files\Araxis\Araxis Merge v6.5\Merge.exe"<span style="FONT-FAMILY: 宋体">；在</span>[Setting]-&gt;[Merge]<span style="FONT-FAMILY: 宋体">的选项中，填入</span>"C:\Program Files\Araxis\Araxis Merge v6.5\Merge.exe" %theirs %mine %merged <span style="FONT-FAMILY: 宋体">；其中</span>"C:\Program Files\Araxis\Araxis Merge v6.5\Merge.exe"<span style="FONT-FAMILY: 宋体">是指合并工具的路径，</span>%theirs %mine %merged<span style="FONT-FAMILY: 宋体">分别指</span>..<span style="FONT-FAMILY: 宋体">将要合并到主干的分支，主干，及合并后的结果。</span></p>
<p style="TEXT-INDENT: 24pt" class="a"><img width="586" height="371" border="0" src="http://www.svn8.com/uploads/allimg/080505/0810342.jpg"/></p>
<p><span style="FONT-FAMILY: 宋体">图</span> <span><span>2</span></span><span>.</span><span><span>3</span></span></p>
<a name="_Toc121547264" id="_Toc121547264"/><span><span style="FONT-FAMILY: 宋体">仓库目录结构</span></span>
<p style="TEXT-INDENT: 24pt" class="a">SVN<span style="FONT-FAMILY: 宋体">仓库的负责人规划好仓库的目录结构。推荐的目录结构如下图所示。</span></p>
<p style="TEXT-INDENT: 24pt" class="a"><span style="FONT-FAMILY: 宋体">仓库的一级目录只有两个，分别为</span>code<span style="FONT-FAMILY: 宋体">和</span>doc<span style="FONT-FAMILY: 宋体">。其中，</span>doc<span style="FONT-FAMILY: 宋体">主要用来放置先期的文档，</span>code<span style="FONT-FAMILY: 宋体">主要用来放置工程的代码，也可以包含后期的文档。</span></p>
<p style="TEXT-INDENT: 24pt" class="a"><span style="FONT-FAMILY: 宋体">仓库的二级目录只可以是</span>branch<span style="FONT-FAMILY: 宋体">与</span>trunk<span style="FONT-FAMILY: 宋体">两个目录，分别存放主干与分支。</span>trunk<span style="FONT-FAMILY: 宋体">目录下直接存放工程文件。</span>branch<span style="FONT-FAMILY: 宋体">目录下包括一些子目录分别对应各个分支。</span></p>
<p style="TEXT-ALIGN: center"><span><img width="586" height="445" border="0" src="http://www.svn8.com/uploads/allimg/080505/0810343.jpg"/></span></p>
<p><span style="FONT-FAMILY: 宋体">图</span> <span><span>2</span></span><span>.</span><span><span>4</span></span></p>
<a name="_Toc121547265" id="_Toc121547265"/>
<p style="TEXT-INDENT: 24pt" class="a"><span style="FONT-FAMILY: 宋体">从</span><span>SVN</span><span style="FONT-FAMILY: 宋体">仓库中取出代码时</span><span style="FONT-FAMILY: 宋体">，一定</span><span style="FONT-FAMILY: 宋体">不要把整个仓库取出来</span><span style="FONT-FAMILY: 宋体">，</span><span style="FONT-FAMILY: 宋体">而应该只取出</span><span>trunk</span><span style="FONT-FAMILY: 宋体">目录</span><span style="FONT-FAMILY: 宋体">，</span><span style="FONT-FAMILY: 宋体">或只取出</span><span>branch</span><span style="FONT-FAMILY: 宋体">下的某个分支目录</span><span style="FONT-FAMILY: 宋体">（比</span><span style="FONT-FAMILY: 宋体">如上图中的</span><span>svn:\\code\branch\xw_051206</span><span style="FONT-FAMILY: 宋体">）</span><span style="FONT-FAMILY: 宋体">。</span></p>
<a name="_Toc121547266" id="_Toc121547266"/><a name="_Toc121547267" id="_Toc121547267"/>
<p style="TEXT-INDENT: 24pt" class="a"><span style="FONT-FAMILY: 宋体">一个项目会有多个人共同合作开发完成。基本流程是：</span></p>
<p style="MARGIN-LEFT: 45pt; TEXT-INDENT: -21pt" class="a"><span style="FONT-FAMILY: Wingdings"><span>l </span></span> <span style="FONT-FAMILY: 宋体">各开发成员建立自己的分支，并在此分支上开发；</span></p>
<p style="MARGIN-LEFT: 45pt; TEXT-INDENT: -21pt" class="a"><span style="FONT-FAMILY: Wingdings"><span>l </span></span> <span style="FONT-FAMILY: 宋体">各开发成员把分支合并到主干上并形成较为稳定的版本；</span></p>
<p style="MARGIN-LEFT: 45pt; TEXT-INDENT: -21pt" class="a"><span style="FONT-FAMILY: Wingdings"><span>l </span></span> <span style="FONT-FAMILY: 宋体">各个成员重新从主干上建立新的分支，在此分支上开发</span><span>(</span><span style="FONT-FAMILY: 宋体">即回到第一步</span><span>)</span></p>
<p style="MARGIN-LEFT: 45pt; TEXT-INDENT: -21pt" class="a"><span style="FONT-FAMILY: Wingdings"><span>l </span></span> <span style="FONT-FAMILY: 宋体">循环往复，直到工程结束。</span></p>
<p style="TEXT-INDENT: 24pt" class="a"><span style="FONT-FAMILY: 宋体">下面我用一个例子来说明合作开发的基本流程。</span></p>
<p style="TEXT-INDENT: 24pt" class="a"><span style="FONT-FAMILY: 宋体">现在</span>xb<span style="FONT-FAMILY: 宋体">与</span>lzj<span style="FONT-FAMILY: 宋体">两个开发人员要共同开发一个工程</span>onlytest<span style="FONT-FAMILY: 宋体">，其这个工程的主干的</span>SVN<span style="FONT-FAMILY: 宋体">仓库地址如下图。</span></p>
<p style="TEXT-ALIGN: center"><span><img width="450" height="309" border="0" src="http://www.svn8.com/uploads/allimg/080505/0810344.jpg"/></span></p>
<p><span style="FONT-FAMILY: 宋体">图</span> <span><span>2</span></span><span>.</span><span><span>5</span></span></p>
<a name="_Toc121547268" id="_Toc121547268"/>
<p style="TEXT-INDENT: 24pt" class="a">xb<span style="FONT-FAMILY: 宋体">与</span>lzj<span style="FONT-FAMILY: 宋体">分别在</span>onlytest<span style="FONT-FAMILY: 宋体">这个工程中建立两个分支，分别为</span>xb _051115<span style="FONT-FAMILY: 宋体">和</span>lz_051115<span style="FONT-FAMILY: 宋体">。</span></p>
<p style="TEXT-INDENT: 24pt" class="a"><span style="FONT-FAMILY: 宋体">在这里分支命名要采用</span>[<span style="COLOR: rgb(51,153,102); FONT-FAMILY: 宋体">姓名缩写</span><span style="COLOR: rgb(51,153,102)">_6</span><span style="COLOR: rgb(51,153,102); FONT-FAMILY: 宋体">个数的日期</span><span style="COLOR: rgb(51,153,102)">_</span><span style="COLOR: rgb(51,153,102); FONT-FAMILY: 宋体">后缀</span>(<span style="FONT-FAMILY: 宋体">可选</span>)]<span style="FONT-FAMILY: 宋体">的形式，比如</span>xb_051208_1<span style="FONT-FAMILY: 宋体">，</span>xb_051212<span style="FONT-FAMILY: 宋体">之类的。创建完分支后我们可以看到这个工程的目录结构如下图所示：</span></p>
<p style="TEXT-ALIGN: center"><span><img width="586" height="426" border="0" src="http://www.svn8.com/uploads/allimg/080505/0810345.jpg"/></span></p>
<p><span style="FONT-FAMILY: 宋体">图</span> <span><span>2</span></span><span>.</span><span><span>6</span></span><span style="FONT-FAMILY: 宋体">分支目录</span></p>
<p style="TEXT-INDENT: 24pt" class="a"><span style="FONT-FAMILY: 宋体">建完之后，</span> xb<span style="FONT-FAMILY: 宋体">和</span>lzj<span style="FONT-FAMILY: 宋体">分别在本地取出对应的分支进行开发。</span></p>
<a name="_Toc121547269" id="_Toc121547269"/>
<p style="TEXT-INDENT: 24pt" class="a"><span style="FONT-FAMILY: 宋体">当</span><span style="FONT-FAMILY: 宋体">程序到达一个比较稳定的阶段，就需要把分支合并到主干上，下面讲述一下合并的流程。</span></p>
<p style="TEXT-INDENT: 24pt" class="a"><span style="FONT-FAMILY: 宋体">在本节中继续使用上一节中所示的工程与</span>SVN<span style="FONT-FAMILY: 宋体">仓库讲解。</span></p>
<span><span>1.2.3.1</span></span> <span>xb</span><span style="FONT-FAMILY: 黑体">与</span><span>lzj</span><span style="FONT-FAMILY: 黑体">分别修改自己分支上的代码</span>
<p style="TEXT-INDENT: 24pt" class="a"><span style="FONT-FAMILY: 宋体">现在</span><span style="FONT-FAMILY: 宋体">，</span><span style="FONT-FAMILY: 宋体">主干上的</span><span>test_SVN.txt</span><span style="FONT-FAMILY: 宋体">是空文档。</span></p>
<p style="TEXT-INDENT: 24pt" class="a"><span style="FONT-FAMILY: 宋体">由</span><span>xb</span><span style="FONT-FAMILY: 宋体">与</span><span>lzj</span><span style="FONT-FAMILY: 宋体">修改提交后</span><span style="FONT-FAMILY: 宋体">，</span><span style="FONT-FAMILY: 宋体">两个分支中</span><span>test_SVN.txt</span><span style="FONT-FAMILY: 宋体">分别如下两图所示</span><span style="FONT-FAMILY: 宋体">：</span></p>
<p style="TEXT-ALIGN: center"><span><img width="321" height="130" border="0" src="http://www.svn8.com/uploads/allimg/080505/0810346.jpg"/></span></p>
<p><span style="FONT-FAMILY: 宋体">图</span> <span><span>2</span></span><span>.</span><span><span>7</span></span> <span>xb_051129</span><span style="FONT-FAMILY: 宋体">分支下的</span><span>test_SVN.txt</span></p>
<p style="TEXT-ALIGN: center"><span><img width="321" height="130" border="0" src="http://www.svn8.com/uploads/allimg/080505/0810347.jpg"/></span></p>
<p><span style="FONT-FAMILY: 宋体">图</span> <span><span>2</span></span><span>.</span><span><span>8</span></span> <span>lzj_051129</span><span style="FONT-FAMILY: 宋体">分支下的</span><span>test_SVN.txt</span></p>
<span><span>1.2.3.2</span></span> <span>xb</span><span style="FONT-FAMILY: 黑体">将</span><span>xb_051129</span><span style="FONT-FAMILY: 黑体">分支合并到主干</span>
<p style="TEXT-INDENT: 24pt" class="a"><span>xb</span><span style="FONT-FAMILY: 宋体">先把主干</span><span>check out</span><span style="FONT-FAMILY: 宋体">到本地。然后在主干的目录上右键</span><span style="FONT-FAMILY: 宋体">选择</span>svn-&gt;merge<span style="FONT-FAMILY: 宋体">，弹出如下窗口：</span></p>
<p style="TEXT-ALIGN: center"><span><img width="524" height="466" border="0" src="http://www.svn8.com/uploads/allimg/080505/0810348.jpg"/></span></p>
<p><span style="FONT-FAMILY: 宋体">图</span> <span><span>2</span></span><span>.</span><span><span>9</span></span><span style="FONT-FAMILY: 宋体">合并对话框</span></p>
<p style="TEXT-INDENT: 24pt" class="a"><span style="FONT-FAMILY: 宋体">此对话框的含义是把</span>From<span style="FONT-FAMILY: 宋体">指定的分支版本到</span>To<span style="FONT-FAMILY: 宋体">指定的分支版本之间的差异合并到主干上。</span></p>
<p style="TEXT-INDENT: 24pt" class="a"><span style="FONT-FAMILY: 宋体">在这里分支选的是</span>xb_051129<span style="FONT-FAMILY: 宋体">。版本号的选定方法是点击</span>From<span style="FONT-FAMILY: 宋体">中的</span>Show Log<span style="FONT-FAMILY: 宋体">，在</span>Log<span style="FONT-FAMILY: 宋体">窗口中按住</span>Ctrl<span style="FONT-FAMILY: 宋体">键，点击选择</span>"made a copy"<span style="FONT-FAMILY: 宋体">之上的那个版本，以及最顶上的那个版本，如</span><span style="FONT-FAMILY: 宋体">图</span> <span>2</span>.<span>11</span><span style="FONT-FAMILY: 宋体">所示。然后点击确定回到上图中的对话框，会自动填写</span>From<span style="FONT-FAMILY: 宋体">与</span>To<span style="FONT-FAMILY: 宋体">中的</span>Revision<span style="FONT-FAMILY: 宋体">号。</span></p>
<p><span><img width="585" height="581" border="0" src="http://www.svn8.com/uploads/allimg/080505/0810349.jpg"/></span></p>
<p><a name="_Ref121716988" id="_Ref121716988"/><span><span><span>2</span></span></span><span><span>.</span></span><span><span><span>10</span></span></span><span style="FONT-FAMILY: 宋体">选择需要合并的版本</span></p>
<p style="TEXT-INDENT: 24pt" class="a"><span style="FONT-FAMILY: 宋体">然后直接点击</span>merge<span style="FONT-FAMILY: 宋体">进行合并，你也可以通过</span>dry run<span style="FONT-FAMILY: 宋体">来看是不是两者之间有差异。由于没有其它人修改主干，所以合并的很顺利，下图是</span>xb_051115<span style="FONT-FAMILY: 宋体">与主干合并后的结果。合并完毕之后，由</span>xb<span style="FONT-FAMILY: 宋体">对主干进行提交。</span></p>
<p style="TEXT-INDENT: 24pt; TEXT-ALIGN: center" class="a"><img width="321" height="130" border="0" src="http://www.svn8.com/uploads/allimg/080505/08103410.jpg"/></p>
<p><span style="FONT-FAMILY: 宋体">图</span> <span><span>2</span></span><span>.</span><span><span>11</span></span><span style="FONT-FAMILY: 宋体">合并后，主干上的</span><span>test_SVN.txt</span></p>
<br/><span><span>1.2.3.3</span></span> <span>lzj</span><span style="FONT-FAMILY: 黑体">将</span><span>lzj_051129</span><span style="FONT-FAMILY: 黑体">分支合并到主干，解决冲突</span>
<p style="TEXT-INDENT: 24pt" class="a">xb<span style="FONT-FAMILY: 宋体">合并完毕之后，</span>lzj<span style="FONT-FAMILY: 宋体">要将他的分支合并到主干上去，方法同上。但是由于</span>xb<span style="FONT-FAMILY: 宋体">已经修改过主干，所以产生了冲突，会弹出一个冲突对话框。双击对话框中的产生冲突的文件名，就可以调出工具对此文件进行合并，下图是我们用</span>merge<span style="FONT-FAMILY: 宋体">工具显示的界面。</span></p>
<p><span><img width="585" height="382" border="0" src="http://www.svn8.com/uploads/allimg/080505/08103411.jpg"/></span></p>
<p><span style="FONT-FAMILY: 宋体">图</span> <span><span>2</span></span><span>.</span><span><span>12</span></span></p>
<p style="MARGIN-LEFT: 45pt; TEXT-INDENT: -21pt" class="a"><span style="FONT-FAMILY: Wingdings"><span>l </span></span> <span style="FONT-FAMILY: 宋体">首先比较第一个窗口与第二个窗口，把结果修改合并到第二个窗口。</span></p>
<p style="MARGIN-LEFT: 45pt; TEXT-INDENT: -21pt" class="a"><span style="FONT-FAMILY: Wingdings"><span>l </span></span> <span style="FONT-FAMILY: 宋体">然后确保光标处于第二个窗口时，点击上图中红色圈圈所示的按钮。这样会把第二个窗口的内容全部复制到第三个容口。之后保存，退出。</span></p>
<p style="MARGIN-LEFT: 45pt; TEXT-INDENT: -21pt" class="a"><span style="FONT-FAMILY: Wingdings"><span>l </span></span> <span style="FONT-FAMILY: 宋体">然后在工程目录上点右键，进行</span>SVN-&gt;Resolved<span style="FONT-FAMILY: 宋体">。这样会删除无用的临时文件。</span></p>
<p style="MARGIN-LEFT: 45pt; TEXT-INDENT: -21pt" class="a"><span style="FONT-FAMILY: Wingdings"><span>l </span></span> <span style="FONT-FAMILY: 宋体">最后提交所作的修改，并添加详细的注释。</span></p>
<a name="_Toc121547270" id="_Toc121547270"/><a name="_Toc121547271" id="_Toc121547271"/><span><span style="FONT-FAMILY: 宋体">中的标签</span></span>
<p style="TEXT-INDENT: 24pt" class="a"><span style="FONT-FAMILY: 宋体">与</span>CVS<span style="FONT-FAMILY: 宋体">不同，使用</span>SVN<span style="FONT-FAMILY: 宋体">时不用专门为目录添加标签，因为</span>SVN<span style="FONT-FAMILY: 宋体">也对目录进行版本管理。</span></p>
<p><span style="FONT-FAMILY: 宋体">我们在提交时写好注释（比如重要的版本提交时使用</span><span>051201</span><span style="FONT-FAMILY: 宋体">之类的日期作为开头），就可以通过注释来查找比较重要的目录版本号，相当于</span><span>CVS</span><span style="FONT-FAMILY: 宋体">或</span><span>VSS</span><span style="FONT-FAMILY: 宋体">中的标签。</span></p>
<p><span style="FONT-FAMILY: 宋体">另外，每个工程都会有一个版本说明文件，通过此文件可以查找关键版本。</span></p>
<a name="_Toc121547272" id="_Toc121547272"/>
<p style="TEXT-INDENT: 24pt" class="a"><span style="FONT-FAMILY: 宋体">你可以重命名、移动或删除你的文件或文件夹，但请使用</span>SVN<span style="FONT-FAMILY: 宋体">进行这些操作，否则之前的版本信息会丢失。</span></p>
<p style="TEXT-INDENT: 24pt" class="a"><span style="FONT-FAMILY: 宋体">使用</span>SVN<span style="FONT-FAMILY: 宋体">删除、移动与重命名文件夹的方法是在文件</span>/<span style="FONT-FAMILY: 宋体">文件夹上点右键进行</span>SVN<span style="FONT-FAMILY: 宋体">操作，或直接在资源浏览器中使用右键拖放（会弹出</span>SVN<span style="FONT-FAMILY: 宋体">选项）。</span></p>
<p style="TEXT-INDENT: 24pt" class="a"><span style="FONT-FAMILY: 宋体">文件的删除、移动与重命名之前，必须保证工作目录是最新的版本；进行这些操作之后，需要进行提交。</span></p>
<span><span>1.3.3</span></span> <span style="FONT-FAMILY: 宋体">版本的回退</span>
<p style="TEXT-INDENT: 24pt" class="a"><span style="FONT-FAMILY: 宋体">在代码的编写过程中，难免会有不尽人意的地方，你也许需要回退到某一个版本，但是在这个过程中可能有一些文件你想保留，也有一些文件你不想保留，这就牵扯到很复杂的版本管理过程，在这里给大家推荐几种方法。</span></p>
<p style="MARGIN-LEFT: 45pt; TEXT-INDENT: -21pt" class="a"><span><span>1. </span></span> <span style="FONT-FAMILY: 宋体">若是你编辑了工程，在没有提交的前提下，你想放弃这些修改，你可以直接选择</span><span>revert</span><span style="FONT-FAMILY: 宋体">就可以更新到工程的最新的版本。</span></p>
<p style="MARGIN-LEFT: 45pt; TEXT-INDENT: -21pt" class="a"><span><span>2. </span></span> <span style="FONT-FAMILY: 宋体">若是你想退回到某一个版本，你就可以直接选择</span><span>update to reversion</span><span style="FONT-FAMILY: 宋体">如图</span><span>,</span><span style="FONT-FAMILY: 宋体">这样我们就可以把我们的版本回退到你选中的版本去，这种情况下</span><span>SVN</span><span style="FONT-FAMILY: 宋体">并没有显示出有什么冲突，并且新建立的文件也还在，但是在这种情况下你并不能直接在你回退后的版本上进行编辑，因为</span><span>SVN</span><span style="FONT-FAMILY: 宋体">的版本控制还是在最新的主干上。我们需要</span><span>update</span><span style="FONT-FAMILY: 宋体">并解决冲突。</span></p>
<p style="MARGIN-LEFT: 45pt; TEXT-INDENT: -21pt" class="a"><span><span>3. </span></span> <span style="FONT-FAMILY: 宋体">你可以直接选择</span><span>revert changes from this revision</span><span style="FONT-FAMILY: 宋体">如图，这样的话你可以直接解决冲突并提交。不过这种方法的不足是，你新建的文件都没有了，整个工程都回退到之前的版本了。</span></p>
<p style="MARGIN-LEFT: 45pt; TEXT-INDENT: -21pt" class="a"><span><span>4. </span></span> <span style="FONT-FAMILY: 宋体">我推荐的一种方法是，直接</span><span>export</span><span style="FONT-FAMILY: 宋体">一个你需要的版本，然后用你</span><span>export</span><span style="FONT-FAMILY: 宋体">的版本覆盖你的最新的版本，这样你就可以不丢失你新建的文件，同时获得</span><span>head</span><span style="FONT-FAMILY: 宋体">的</span><span>SVN</span><span style="FONT-FAMILY: 宋体">控制文件。</span></p>
<p style="MARGIN-LEFT: 24pt; TEXT-INDENT: 0pt" class="a"><span><img width="586" height="563" border="0" src="http://www.svn8.com/uploads/allimg/080505/08103412.jpg"/></span></p>
<p><span style="FONT-FAMILY: 宋体">图</span> <span><span>13</span></span></p>
<a name="_Toc121547273" id="_Toc121547273"/>
<p style="TEXT-INDENT: 24pt" class="a"><span style="FONT-FAMILY: 宋体">每个工程会有很多个小模块，当某个模块达到稳定的时候，你就需要提交一次，以免写下个模块代码的时候出现不可恢复的错误。</span></p>
<p style="TEXT-INDENT: 24pt" class="a"><span style="FONT-FAMILY: 宋体">每一次提交需要前，需要通过</span>pclint<span style="FONT-FAMILY: 宋体">检查，保证是一个编译没有错误的版本。当提交比较稳定的版本的时候，同时要修改你的版本号。</span></p>
<p style="TEXT-INDENT: 24pt" class="a"><a name="_Toc121547274" id="_Toc121547274"/></p>
<span><span><span>1.3.5</span></span> <span style="FONT-FAMILY: 宋体">版本说明文件</span></span>
<p style="TEXT-INDENT: 24pt" class="a"><span style="FONT-FAMILY: 宋体">版本说明文件为</span>xml<span style="FONT-FAMILY: 宋体">表格，可用</span>excel<span style="FONT-FAMILY: 宋体">编辑，它会记录下关键的版本信息。</span></p>
<p style="TEXT-INDENT: 24pt" class="a"><span style="FONT-FAMILY: 宋体">版本说明文件内容如下表。发布版本是指用户对外公布的版本号，后文中有详细描述；</span>Revision<span style="FONT-FAMILY: 宋体">是</span>SVN<span style="FONT-FAMILY: 宋体">内部的工程文件夹的版本号。一个发布版本可能对应多个</span>Revision<span style="FONT-FAMILY: 宋体">：</span></p>
<p class="zoundry_bw_tags">
  <!-- Tag links generated by Zoundry Blog Writer. Do not manually edit. http://www.zoundry.com -->
  <span class="ztags"><span class="ztagspace">Technorati</span> : <a href="http://technorati.com/tag/svn" class="ztag" rel="tag">svn</a></span> 
</p><img src ="http://www.blogjava.net/iamlibo/aggbug/200795.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/iamlibo/" target="_blank">Libo</a> 2008-05-16 10:18 <a href="http://www.blogjava.net/iamlibo/archive/2008/05/16/200795.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ant testng 一点注意</title><link>http://www.blogjava.net/iamlibo/archive/2008/05/13/200183.html</link><dc:creator>Libo</dc:creator><author>Libo</author><pubDate>Tue, 13 May 2008 05:20:00 GMT</pubDate><guid>http://www.blogjava.net/iamlibo/archive/2008/05/13/200183.html</guid><wfw:comment>http://www.blogjava.net/iamlibo/comments/200183.html</wfw:comment><comments>http://www.blogjava.net/iamlibo/archive/2008/05/13/200183.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/iamlibo/comments/commentRss/200183.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/iamlibo/services/trackbacks/200183.html</trackback:ping><description><![CDATA[
<p>在ant 中运行testng 的时候.一定要将testng-XX.jar放到classpath 中.我就为这折腾了两小时.疏忽大意啊。</p>
<p>ant-buils.xml内容如下:</p>
<br/>&lt;path id="cpath"&gt;<br/><span style="COLOR: #ff0000">&lt;pathelement location="${ant.home}/lib/testng-5.3-jdk15.jar" /&gt;<br/></span>&lt;fileset dir="E:\deploy-lib"&gt;<br/>&lt;include name="*.jar"/&gt;<br/>&lt;/fileset&gt;<br/>&lt;/path&gt;<br/>&lt;taskdef resource="testngtasks" classpath="${ant.home}/lib/testng-5.3-jdk15.jar" /&gt;<br/>&lt;path id="runpath"&gt;<br/>&lt;path refid="cpath" /&gt;<br/><span style="COLOR: #ff0000">&lt;pathelement location="bin" /&gt;<br/></span>&lt;/path&gt;<br/><br/>&lt;target name="test"&gt;<br/>&lt;testng classpathref="runpath" outputDir="test-output"&gt;<br/>&lt;jvmarg value="-ea" /&gt;<br/>&lt;xmlfileset dir="src/test/resources" includes="testng.xml" /&gt;<br/>&lt;/testng&gt;<br/>&lt;/target&gt;<br/><img src ="http://www.blogjava.net/iamlibo/aggbug/200183.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/iamlibo/" target="_blank">Libo</a> 2008-05-13 13:20 <a href="http://www.blogjava.net/iamlibo/archive/2008/05/13/200183.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>