<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>星星的金币的博客</title>
    <description>欢迎你来到我在javaeye的博客，本博客数据来自我自主开发的多用户博客SGblog，由javaeye RSS同步导入的。若您有什么建议和问题，请到我的网站上访问。</description>
    <link>http://sgwood.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
          <item>
        <title>77go负载</title>
        <author>sgwood</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://sgwood.javaeye.com">sgwood</a>&nbsp;
                    链接：<a href="http://sgwood.javaeye.com/blog/177656" style="color:red;">http://sgwood.javaeye.com/blog/177656</a>&nbsp;
          发表时间: 2008年03月29日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          其中是开许多resin ,例如：<br />resin77go-fuzhai.bat中开了四个httpd:<br />start E:\webtools\resin\httpd.exe -conf E:\webtools\resin\conf\resin77go-fuzhai.conf -server a<br />start E:\webtools\resin\httpd.exe -conf E:\webtools\resin\conf\resin77go-fuzhai.conf -server b<br />start E:\webtools\resin\httpd.exe -conf E:\webtools\resin\conf\resin77go-fuzhai.conf -server c<br />start E:\webtools\resin\httpd.exe -conf E:\webtools\resin\conf\resin77go-fuzhai.conf -server d<br />在resin77go-fuzhai.conf中<br />&nbsp; &lt;cluster><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;srun server-id="a" host="127.0.0.1" port="6801"/><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;srun server-id="b" host="127.0.0.1" port="6802"/><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;srun server-id="c" host="127.0.0.1" port="6803"/><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;srun server-id="d" host="127.0.0.1" port="6804"/><br />&nbsp;&nbsp;&nbsp; &lt;/cluster><br /><br />&nbsp;&nbsp;&nbsp; &lt;host id='www.77go.cn'><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;document-directory>D:/77go&lt;/document-directory><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- configures the root web-app --><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;web-app id='/'><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- adds xsl to the search path --><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;class-loader><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;compiling-loader path='WEB-INF/classes'/><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;library-loader path='WEB-INF/lib'/><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/class-loader><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/web-app><br />&nbsp;&nbsp;&nbsp; &lt;/host><br /><br />LoadModule caucho_module "E:/webtools/resin/win32/apache-2.0/mod_caucho.dll"<br />	&lt;IfModule mod_caucho.c><br />#	&nbsp; ResinConfigServer localhost 6811<br />#	&nbsp; CauchoStatus yes<br />#	&lt;/IfModule><br />#	&lt;IfModule mod_caucho.c><br />#	&nbsp; ResinConfigServer localhost 6812<br />#	&nbsp; CauchoStatus yes<br />#	&lt;/IfModule><br />#	&lt;IfModule mod_caucho.c><br />#	&nbsp; ResinConfigServer localhost 6813<br />#	&nbsp; CauchoStatus yes<br />#	&lt;/IfModule><br />#	&lt;IfModule mod_caucho.c><br />#	&nbsp; ResinConfigServer localhost 6814<br />#	&nbsp; CauchoStatus yes<br />#	&lt;/IfModule><br /><br />#&lt;VirtualHost *:80><br />#&nbsp;&nbsp;&nbsp; DocumentRoot D:/77go<br />#&nbsp;&nbsp;&nbsp; ServerName www.77go.cn<br />#&nbsp;&nbsp;&nbsp; DirectoryIndex index.jsp index.htm index.html <br />#&nbsp;&nbsp;&nbsp; Options FollowSymLinks<br />#&nbsp;&nbsp;&nbsp; ErrorLog D:/77go/logs/www.77go.cn-error_log<br />#&nbsp;&nbsp;&nbsp; CustomLog D:/77go/logs/access_www.77go.cn.log common<br />#&nbsp;&nbsp;&nbsp; CustomLog "|bin/cronolog.exe E:/77go_log/%y/%m/%d/access_www.77go.cn.log" combined env=!img-request<br />#&nbsp;&nbsp;&nbsp; ErrorLog&nbsp; "|bin/cronolog.exe E:/77go_log/%y/%m/%d/error_www.77go.cn.log"<br />#&lt;/VirtualHost><br /><br />下面是网上的一篇相关配置：<br />配置resin负载均衡<br /><br />下面就简单列出如何配置load balance，以resin 3为例：<br /><br /><br /><br />配置apache：<br /><br />假设我开4个cluster，ip分别是10.10.22.1、10.10.22.2、10.10.22.3、10.10.22.4。网卡设置好。在apache的配置文件httpd.conf的最后有3句话：<br /><br />LoadModule caucho_module /usr/local/apache-mysql/libexec/mod_caucho.so<br />ResinConfigServer localhost 6802<br />CauchoStatus yes<br /><br />只需将第二句改成：<br /><br />ResinConfigServer 10.10.22.1 6802<br />ResinConfigServer 10.10.22.2 6802<br />ResinConfigServer 10.10.22.3 6802<br />ResinConfigServer 10.10.22.4 6802<br /><br />resin的配置：<br /><br />&lt;!-- &lt;http port='80'/> --><br /><br />&lt;cluster> <br />&lt;srun server-id="a" host="10.10.22.1" port="6802" index="1"/> &lt;srun server-id="b" host="10.10.22.2" port="6802" index="2"/> &lt;srun server-id="c" host="10.10.22.3" port="6802" index="3"/> &lt;srun server-id="d" host="10.10.22.4" port="6802" index="4"/> &lt;/cluster><br /><br />其他根据自己需求配置！<br /><br />6. 启动resin和apache：由于使用负载均衡技术，因此启动也不单单是起一个http.sh了。可以写一个脚本：<br /><br />#!/bin/bash<br />/usr/local/apache/bin/apachectl start<br />/usr/local/resin/bin/httpd.sh -pid /usr/local/resin/srun1.pid -server a start<br />/usr/local/resin/bin/httpd.sh -pid /usr/local/resin/srun2.pid -server b start<br />/usr/local/resin/bin/httpd.sh -pid /usr/local/resin/srun3.pid -server c start<br />/usr/local/resin/bin/httpd.sh -pid /usr/local/resin/srun4.pid -server d start<br /><br />对于resin的负载均衡使用上启动的进程数，我认为还是要根据自己的机器实际情况来考虑的。少了达不到效果，多了会机器系统也是一个负载。个人认为，4个可以作为一个默认的选择来考虑。
          <br/><br/>
          <span style="color:red;">
            <a href="http://sgwood.javaeye.com/blog/177656#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 29 Mar 2008 21:09:26 +0800</pubDate>
        <link>http://sgwood.javaeye.com/blog/177656</link>
        <guid>http://sgwood.javaeye.com/blog/177656</guid>
      </item>
          <item>
        <title>C3P0连接池详细配置</title>
        <author>sgwood</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://sgwood.javaeye.com">sgwood</a>&nbsp;
                    链接：<a href="http://sgwood.javaeye.com/blog/177132" style="color:red;">http://sgwood.javaeye.com/blog/177132</a>&nbsp;
          发表时间: 2008年03月28日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>转载至:http://jacreater.spaces.live.com/blog/cns!BE44984C5949B55B!120.entry</p><p>&lt;c3p0-config&gt;<br />&nbsp; &lt;default-config&gt;<br />&nbsp;<span style="color: #ff0000">&lt;!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。Default: 3 --&gt;<br /></span>&nbsp;&lt;property name=&quot;acquireIncrement&quot;&gt;3&lt;/property&gt;<br />&nbsp;<br />&nbsp;<span style="color: #ff0000">&lt;!--定义在从数据库获取新连接失败后重复尝试的次数。Default: 30 --&gt;</span><br />&nbsp;&lt;property name=&quot;acquireRetryAttempts&quot;&gt;30&lt;/property&gt;<br />&nbsp;<br />&nbsp;<span style="color: #ff0000">&lt;!--两次连接中间隔时间，单位毫秒。Default: 1000 --&gt;</span><br />&nbsp;&lt;property name=&quot;acquireRetryDelay&quot;&gt;1000&lt;/property&gt;<br />&nbsp;<br />&nbsp;<span style="color: #ff0000">&lt;!--连接关闭时默认将所有未提交的操作回滚。Default: false --&gt;<br /></span>&nbsp;&lt;property name=&quot;autoCommitOnClose&quot;&gt;false&lt;/property&gt;<br />&nbsp;<br />&nbsp;<span style="color: #ff0000">&lt;!--c3p0将建一张名为Test的空表，并使用其自带的查询语句进行测试。如果定义了这个参数那么<br />&nbsp;&nbsp;属性preferredTestQuery将被忽略。你不能在这张Test表上进行任何操作，它将只供c3p0测试<br />&nbsp;&nbsp;使用。Default: null--&gt;<br /></span>&nbsp;&lt;property name=&quot;automaticTestTable&quot;&gt;Test&lt;/property&gt;</p><div>&nbsp;<span style="color: #ff0000">&lt;!--获取连接失败将会引起所有等待连接池来获取连接的线程抛出异常。但是数据源仍有效<br />&nbsp;&nbsp;保留，并在下次调用getConnection()的时候继续尝试获取连接。如果设为true，那么在尝试<br />&nbsp;&nbsp;获取连接失败后该数据源将申明已断开并永久关闭。Default: false--&gt;</span><br />&nbsp;&lt;property name=&quot;breakAfterAcquireFailure&quot;&gt;false&lt;/property&gt;</div><div><span style="color: #ff0000">&nbsp;&lt;!--当连接池用完时客户端调用getConnection()后等待获取新连接的时间，超时后将抛出<br />&nbsp;&nbsp;SQLException,如设为0则无限期等待。单位毫秒。Default: 0 --&gt;</span><br />&nbsp;&lt;property name=&quot;checkoutTimeout&quot;&gt;100&lt;/property&gt;</div><div>&nbsp;<span style="color: #ff0000">&lt;!--通过实现ConnectionTester或QueryConnectionTester的类来测试连接。类名需制定全路径。<br />&nbsp;&nbsp;Default: com.mchange.v2.c3p0.impl.DefaultConnectionTester--&gt;</span><br />&nbsp;&lt;property name=&quot;connectionTesterClassName&quot;&gt;&lt;/property&gt;</div><div><span style="color: #ff0000">&nbsp;&lt;!--指定c3p0 libraries的路径，如果（通常都是这样）在本地即可获得那么无需设置，默认null即可<br />&nbsp;&nbsp;Default: null--&gt;<br /></span>&nbsp;&lt;property name=&quot;factoryClassLocation&quot;&gt;null&lt;/property&gt;</div><div><span style="color: #ff0000">&nbsp;&lt;!--Strongly disrecommended. Setting this to true may lead to subtle and bizarre bugs. <br />&nbsp;&nbsp;（文档原文）作者强烈建议不使用的一个属性--&gt;</span><br />&nbsp;&lt;property name=&quot;forceIgnoreUnresolvedTransactions&quot;&gt;false&lt;/property&gt;</div><div><span style="color: #ff0000">&nbsp;&lt;!--每60秒检查所有连接池中的空闲连接。Default: 0 --&gt;</span><br />&nbsp;&lt;property name=&quot;idleConnectionTestPeriod&quot;&gt;60&lt;/property&gt;</div><div><span style="color: #ff0000">&nbsp;&lt;!--初始化时获取三个连接，取值应在minPoolSize与maxPoolSize之间。Default: 3 --&gt;</span><br />&nbsp;&lt;property name=&quot;initialPoolSize&quot;&gt;3&lt;/property&gt;<br />&nbsp;<br /><span style="color: #ff0000">&nbsp;&lt;!--最大空闲时间,60秒内未使用则连接被丢弃。若为0则永不丢弃。Default: 0 --&gt;<br /></span>&nbsp;&lt;property name=&quot;maxIdleTime&quot;&gt;60&lt;/property&gt;<br />&nbsp;<br /><span style="color: #ff0000">&nbsp;&lt;!--连接池中保留的最大连接数。Default: 15 --&gt;</span><br />&nbsp;&lt;property name=&quot;maxPoolSize&quot;&gt;15&lt;/property&gt;<br />&nbsp;<br /><span style="color: #ff0000">&nbsp;&lt;!--JDBC的标准参数，用以控制数据源内加载的PreparedStatements数量。但由于预缓存的statements<br />&nbsp;&nbsp;属于单个connection而不是整个连接池。所以设置这个参数需要考虑到多方面的因素。<br />&nbsp;&nbsp;如果maxStatements与maxStatementsPerConnection均为0，则缓存被关闭。Default: 0--&gt;<br /></span>&nbsp;&lt;property name=&quot;maxStatements&quot;&gt;100&lt;/property&gt;<br />&nbsp;<br /><span style="color: #ff0000">&nbsp;&lt;!--maxStatementsPerConnection定义了连接池内单个连接所拥有的最大缓存statements数。Default: 0&nbsp; --&gt;</span><br />&nbsp;&lt;property name=&quot;maxStatementsPerConnection&quot;&gt;&lt;/property&gt;</div><div><span style="color: #ff0000">&nbsp;&lt;!--c3p0是异步操作的，缓慢的JDBC操作通过帮助进程完成。扩展这些操作可以有效的提升性能<br />&nbsp;&nbsp;通过多线程实现多个操作同时被执行。Default: 3--&gt;</span><br />&nbsp;&lt;property name=&quot;numHelperThreads&quot;&gt;3&lt;/property&gt;</div><div><span style="color: #ff0000">&nbsp;&lt;!--当用户调用getConnection()时使root用户成为去获取连接的用户。主要用于连接池连接非c3p0<br />&nbsp;&nbsp;的数据源时。Default: null--&gt;</span><br />&nbsp;&lt;property name=&quot;overrideDefaultUser&quot;&gt;root&lt;/property&gt;<br />&nbsp;<br />&nbsp;<span style="color: #ff0000">&lt;!--与overrideDefaultUser参数对应使用的一个参数。Default: null--&gt;</span><br />&nbsp;&lt;property name=&quot;overrideDefaultPassword&quot;&gt;password&lt;/property&gt;</div><div><span style="color: #ff0000">&nbsp;&lt;!--密码。Default: null--&gt;</span><br />&nbsp;&lt;property name=&quot;password&quot;&gt;&lt;/property&gt;</div><div>&nbsp;<span style="color: #ff0000">&lt;!--定义所有连接测试都执行的测试语句。在使用连接测试的情况下这个一显著提高测试速度。注意：<br />&nbsp;&nbsp;测试的表必须在初始数据源的时候就存在。Default: null--&gt;<br /></span>&nbsp;&lt;property name=&quot;preferredTestQuery&quot;&gt;select id from test where id=1&lt;/property&gt;</div><div><span style="color: #ff0000">&nbsp;&lt;!--用户修改系统配置参数执行前最多等待300秒。Default: 300 --&gt;</span><br />&nbsp;&lt;property name=&quot;propertyCycle&quot;&gt;300&lt;/property&gt;<br />&nbsp;<br />&nbsp;<span style="color: #ff0000">&lt;!--因性能消耗大请只在需要的时候使用它。如果设为true那么在每个connection提交的<br />&nbsp;&nbsp;时候都将校验其有效性。建议使用idleConnectionTestPeriod或automaticTestTable<br />&nbsp;&nbsp;等方法来提升连接测试的性能。Default: false --&gt;</span><br />&nbsp;&lt;property name=&quot;testConnectionOnCheckout&quot;&gt;false&lt;/property&gt;<br />&nbsp;<br /><span style="color: #ff0000">&nbsp;&lt;!--如果设为true那么在取得连接的同时将校验连接的有效性。Default: false --&gt;</span><br />&nbsp;&lt;property name=&quot;testConnectionOnCheckin&quot;&gt;true&lt;/property&gt;</div><div><span style="color: #ff0000">&nbsp;&lt;!--用户名。Default: null--&gt;<br /></span>&nbsp;&lt;property name=&quot;user&quot;&gt;root&lt;/property&gt;</div><div>&nbsp;<span style="color: #ff0000">&lt;!--早期的c3p0版本对JDBC接口采用动态反射代理。在早期版本用途广泛的情况下这个参数<br />&nbsp;&nbsp;允许用户恢复到动态反射代理以解决不稳定的故障。最新的非反射代理更快并且已经开始<br />&nbsp;&nbsp;广泛的被使用，所以这个参数未必有用。现在原先的动态反射与新的非反射代理同时受到<br />&nbsp;&nbsp;支持，但今后可能的版本可能不支持动态反射代理。Default: false--&gt;</span><br />&nbsp;&lt;property name=&quot;usesTraditionalReflectiveProxies&quot;&gt;false&lt;/property&gt;</div><div><br />&nbsp;&nbsp;&nbsp; &lt;property name=&quot;automaticTestTable&quot;&gt;con_test&lt;/property&gt;<br />&nbsp;&nbsp;&nbsp; &lt;property name=&quot;checkoutTimeout&quot;&gt;30000&lt;/property&gt;<br />&nbsp;&nbsp;&nbsp; &lt;property name=&quot;idleConnectionTestPeriod&quot;&gt;30&lt;/property&gt;<br />&nbsp;&nbsp;&nbsp; &lt;property name=&quot;initialPoolSize&quot;&gt;10&lt;/property&gt;<br />&nbsp;&nbsp;&nbsp; &lt;property name=&quot;maxIdleTime&quot;&gt;30&lt;/property&gt;<br />&nbsp;&nbsp;&nbsp; &lt;property name=&quot;maxPoolSize&quot;&gt;25&lt;/property&gt;<br />&nbsp;&nbsp;&nbsp; &lt;property name=&quot;minPoolSize&quot;&gt;10&lt;/property&gt;<br />&nbsp;&nbsp;&nbsp; &lt;property name=&quot;maxStatements&quot;&gt;0&lt;/property&gt;</div><div>&nbsp;&nbsp;&nbsp; &lt;user-overrides user=&quot;swaldman&quot;&gt;<br />&nbsp;&nbsp;&nbsp; &lt;/user-overrides&gt;</div><div>&lt;/default-config&gt;<br />&nbsp; &lt;named-config name=&quot;dumbTestConfig&quot;&gt;<br />&nbsp;&nbsp;&nbsp; &lt;property name=&quot;maxStatements&quot;&gt;200&lt;/property&gt;<br />&nbsp;&nbsp;&nbsp; &lt;user-overrides user=&quot;poop&quot;&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name=&quot;maxStatements&quot;&gt;300&lt;/property&gt;<br />&nbsp;&nbsp;&nbsp; &lt;/user-overrides&gt;<br />&nbsp;&nbsp; &lt;/named-config&gt;<br />&lt;/c3p0-config&gt;<br /></div>
          <br/><br/>
          <span style="color:red;">
            <a href="http://sgwood.javaeye.com/blog/177132#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 28 Mar 2008 10:06:42 +0800</pubDate>
        <link>http://sgwood.javaeye.com/blog/177132</link>
        <guid>http://sgwood.javaeye.com/blog/177132</guid>
      </item>
          <item>
        <title>Eclipse中设置在创建新类时自动生成注释(转)</title>
        <author>sgwood</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://sgwood.javaeye.com">sgwood</a>&nbsp;
                    链接：<a href="http://sgwood.javaeye.com/blog/177130" style="color:red;">http://sgwood.javaeye.com/blog/177130</a>&nbsp;
          发表时间: 2008年03月28日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          Eclipse中设置在创建新类时自动生成注释 <br /><br /><br />windows-->preference <br />Java-->Code Style-->Code Templates <br />code-->new Java files <br />编辑它 <br /><br />${filecomment} <br />${package_declaration} <br />/** <br />* @author 作者 E-mail: <br />* @version 创建时间：${date} ${time} <br />* 类说明 <br />*/ <br />${typecomment} <br />${type_declaration}
          <br/><br/>
          <span style="color:red;">
            <a href="http://sgwood.javaeye.com/blog/177130#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 28 Mar 2008 10:03:54 +0800</pubDate>
        <link>http://sgwood.javaeye.com/blog/177130</link>
        <guid>http://sgwood.javaeye.com/blog/177130</guid>
      </item>
          <item>
        <title>extjs demo</title>
        <author>sgwood</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://sgwood.javaeye.com">sgwood</a>&nbsp;
                    链接：<a href="http://sgwood.javaeye.com/blog/175645" style="color:red;">http://sgwood.javaeye.com/blog/175645</a>&nbsp;
          发表时间: 2008年03月25日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          &lt;html><br />&lt;head><br />&lt;meta http-equiv="Content-Type" content="text/html;charset=utf-8"/><br />&lt;title>ExtJS&lt;/title><br />	&lt;link rel="stylesheet" type="text/css" href="ext-2.0/resources/css/ext-all.css" />&nbsp;&nbsp; <br />	&lt;script type="text/javascript" src="ext-2.0/adapter/ext/ext-base.js">&lt;/script>&nbsp; <br />	&lt;script type="text/javascript" src="ext-2.0/ext-all.js">&lt;/script><br />	&lt;script><br />	function showUrl(value)<br /><br />{<br /><br />return "&lt;a href=http://"+value+">"+value+"&lt;/a>";<br /><br />}<br /><br />Ext.onReady(function(){ <br /><br />/**<br />var data=[ [1, 'EasyJWeb', 'EasyJF','www.easyjf.com'],<br /><br />[2, 'jfox', 'huihoo','www.huihoo.org'], <br /><br />[3, 'jdon', 'jdon','www.jdon.com'],<br /><br />[4, 'springside', 'springside','www.springside.org.cn'] ];<br /><br />var store=new Ext.data.SimpleStore({data:data,fields:["id","name","organization","homepage"]});*/<br />var data=[{id:1,<br /><br />name:'EasyJWeb',<br /><br />organization:'EasyJF',<br /><br />homepage:'www.easyjf.com'},<br /><br />{id:2,<br /><br />name:'jfox',<br /><br />organization:'huihoo',<br /><br />homepage:'www.huihoo.org'}, <br /><br />{id:3,<br /><br />name:'jdon',<br /><br />organization:'jdon',<br /><br />homepage:'www.jdon.com'},<br /><br />{id:4, <br /><br />name:'springside',<br /><br />organization: 'springside',<br /><br />homepage:'www.springside.org.cn'}<br /><br />];<br />var store=new Ext.data.JsonStore({data:data,fields:["id","name","organization","homepage"]});<br /><br />var colM=new Ext.grid.ColumnModel([{header:"项目名称",dataIndex:"name",sortable:true},<br /><br />{header:"开发团队",dataIndex:"organization",sortable:true},<br /><br />{header:"网址",dataIndex:"homepage",renderer:showUrl}]);<br /><br /><br />var grid = new Ext.grid.GridPanel({<br /><br />renderTo:"hello",<br /><br />title:"中国Java开源产品及团队",<br /><br />height:150,<br /><br />width:600, <br /><br />cm:colM,<br /><br /><br />store:store,<br /><br />autoExpandColumn:2<br /><br />}); <br /><br />});<br />&lt;/script><br />&lt;/head><br />&lt;body><br />&lt;div id="hello"><br />&lt;/body><br />&lt;/html>
          <br/><br/>
          <span style="color:red;">
            <a href="http://sgwood.javaeye.com/blog/175645#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 25 Mar 2008 09:27:34 +0800</pubDate>
        <link>http://sgwood.javaeye.com/blog/175645</link>
        <guid>http://sgwood.javaeye.com/blog/175645</guid>
      </item>
          <item>
        <title>struts2 code-behind</title>
        <author>sgwood</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://sgwood.javaeye.com">sgwood</a>&nbsp;
                    链接：<a href="http://sgwood.javaeye.com/blog/166331" style="color:red;">http://sgwood.javaeye.com/blog/166331</a>&nbsp;
          发表时间: 2008年03月01日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          code-behind在struts2里有两种表现形式：<br />1.Default mappings (默认映射)：其实就是访问那些没有配置过Action的JSP页面，也能像访问Action那样访问。<br />比如说在项目${root}/leo/a.jsp 有这么一个a.jsp. <br />我可以在地址栏里输入：http://localhost:8080/项目名称/leo/a.action 来访问这个 a.jsp<br />效果与 http://localhost:8080/项目名称/leo/a.jsp是一样的。类似于咱们在welcome-file 那里定义的index，<br />这就是默认映射。<br /><br />2.Default results (默认结果)：其实就是无须显示的在struts-*.xml里配置那些返回 jsp, vm. ftl视图的Action。<br />比如说，我有一个以下配置文件， 没有result.<br />&lt;package name="code" extends="struts-default" namespace="/code"><br />		&lt;action name="leo" class="code.LeoAction" /><br />&lt;/package><br /><br />Action文件是这样的：<br />package code;<br /><br />import com.opensymphony.xwork2.ActionSupport;<br /><br />public class LeoAction extends ActionSupport {<br /><br />	private static final long serialVersionUID = 1L;<br /><br />	private String flag = "";<br /><br />	public String getFlag() {<br />		return flag;<br />	}<br /><br />	public void setFlag(String flag) {<br />		this.flag = flag;<br />	}<br /><br />	public String execute() {<br />		if (flag == null || flag.equals("")) {<br />			this.addActionMessage("input message");<br />			return INPUT;<br />		} else if (flag != null && flag.equals("error")) {<br />			this.addActionError("error happen");<br />			return ERROR;<br />		} else {<br />			this.addActionMessage("I am leo");<br />			return SUCCESS;<br />		}<br />	}<br /><br />}<br /><br />故意设置了一个 flag 来查看结果。 通过，http://localhost:8080/项目名称/leo/leo.action?flag=测试值<br />你会发现，<br />INPUT&nbsp;&nbsp; 对应 http://localhost:8080/项目名称/leo/leo-input.jsp<br />ERROR&nbsp;&nbsp; 对应 http://localhost:8080/项目名称/leo/leo-error.jsp<br />SUCCESS 对应 http://localhost:8080/项目名称/leo/leo-success.jsp<br /><br />这就是默认结果的意思。<br /><br />下面是codebehind的path示例:<br />&lt;?xml version="1.0" encoding="UTF-8"?> <br />&lt;!DOCTYPE struts PUBLIC <br />"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" <br />"http://struts.apache.org/dtds/struts-2.0.dtd"> <br />&lt;struts> <br />&lt;constant name="struts.devMode" value="false" /> <br />&lt;constant name="struts.i18n.encoding" value="UTF-8" /> <br />&lt;constant name="struts.action.extension" value="html" /> <br />&lt;constant name="struts.objectFactory" value="spring" /> <br />&lt;constant name="struts.custom.i18n.resources" <br />value="ApplicationResources,errors" /> <br />&lt;constant name="struts.multipart.maxSize" value="2097152" /> <br />&lt;constant name="struts.ui.theme" value="css_xhtml" /> <br />&lt;constant name="struts.codebehind.pathPrefix" <br />value="/WEB-INF/pages/" /> <br /><br />&lt;!-- Include Struts defaults --> <br />&lt;include file="struts-default.xml" /> <br /><br />&lt;!-- Configuration for the default package. --> <br />&lt;package name="default" extends="struts-default"> <br />&lt;default-interceptor-ref name="defaultStack" /> <br />&lt;!-- DashBoard--> <br />&lt;action name="dashBoard" method="showDashBoard" <br />class="com.flips.action.DashBoard"> <br />&lt;result name="success">dashBoard.jsp&lt;/result> <br />&lt;interceptor-ref name="basicStack"/> <br />&lt;/action> <br /><br />&lt;action name="showRule" method="showRule" <br />class="com.flips.action.RuleImpl"> <br />&lt;result name="success">ruleList.jsp&lt;/result> <br />&lt;interceptor-ref name="basicStack"/> <br /><br />&lt;/action> <br /><br />&lt;/package> <br />&lt;/struts>
          <br/><br/>
          <span style="color:red;">
            <a href="http://sgwood.javaeye.com/blog/166331#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 01 Mar 2008 09:39:51 +0800</pubDate>
        <link>http://sgwood.javaeye.com/blog/166331</link>
        <guid>http://sgwood.javaeye.com/blog/166331</guid>
      </item>
          <item>
        <title>a href=#与 a href=javascript:void(0) 的区别 打开新窗口链接的几种</title>
        <author>sgwood</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://sgwood.javaeye.com">sgwood</a>&nbsp;
                    链接：<a href="http://sgwood.javaeye.com/blog/166138" style="color:red;">http://sgwood.javaeye.com/blog/166138</a>&nbsp;
          发表时间: 2008年02月29日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>＃包含了一个位置信息</p><p>默认的锚点是＃top 也就是网页的上端</p><p>而javascript:void(0)&nbsp; 仅仅表示一个死链接</p><p>这就是为什么有的时候页面很长浏览链接明明是＃可是</p><p>跳动到了页首</p><p>而javascript:void(0) 则不是如此</p><p>所以调用脚本的时候最好用void(0)</p><p>或者&lt;input onclick&gt;</p><p>&lt;div onclick&gt;等<br /><br />打开新窗口链接的几种办法<br /><br />1.window.open('url')<br /><br />2.用自定义函数</p><div style="padding-right: 5px; padding-left: 4px; font-size: 13px; padding-bottom: 4px; width: 98%; word-break: break-all; padding-top: 4px; background-color: #eeeeee; border: #cccccc 1px solid"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" /><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">script</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">function</span><span style="color: #000000">&nbsp;openWin(tag,obj)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span><span style="color: #000000">{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;obj.target</span><span style="color: #000000">=</span><span style="color: #000000">&quot;</span><span style="color: #000000">_blank</span><span style="color: #000000">&quot;</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;obj.href&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">&quot;</span><span style="color: #000000">Web/Substation/Substation.aspx?stationno=</span><span style="color: #000000">&quot;</span><span style="color: #000000">+</span><span style="color: #000000">tag;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;obj.click();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;/</span><span style="color: #000000">script</span><span style="color: #000000">&gt;</span></div><p>&nbsp;</p><div style="padding-right: 5px; padding-left: 4px; font-size: 13px; padding-bottom: 4px; width: 98%; word-break: break-all; padding-top: 4px; background-color: #eeeeee; border: #cccccc 1px solid"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" alt="" /><span style="color: #0000ff">&lt;</span><span style="color: #800000">a&nbsp;</span><span style="color: #ff0000">&nbsp;href</span><span style="color: #0000ff">=&quot;javascript:void(0)&quot;</span><span style="color: #ff0000">&nbsp;onclick</span><span style="color: #0000ff">=&quot;openWin(3,this)&quot;</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">www.webkkk.net(绝对领域)</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">a</span><span style="color: #0000ff">&gt;</span></div><p><br />window.location.href=&quot;&quot;</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://sgwood.javaeye.com/blog/166138#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 29 Feb 2008 14:47:02 +0800</pubDate>
        <link>http://sgwood.javaeye.com/blog/166138</link>
        <guid>http://sgwood.javaeye.com/blog/166138</guid>
      </item>
          <item>
        <title>从LiveJournal后台发展看大规模网站性能优化方法</title>
        <author>sgwood</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://sgwood.javaeye.com">sgwood</a>&nbsp;
                    链接：<a href="http://sgwood.javaeye.com/blog/165945" style="color:red;">http://sgwood.javaeye.com/blog/165945</a>&nbsp;
          发表时间: 2008年02月28日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <h2>一、LiveJournal发展历程</h2><a href="http://www.livejournal.com/"><span style="color: #0f314e">LiveJournal</span></a>是99年始于校园中的项目，几个人出于爱好做了这样一个应用，以实现以下功能： <ul><li>博客，论坛 </li><li>社会性网络，找到朋友 </li><li>聚合，把朋友的文章聚合在一起</li></ul>LiveJournal采用了大量的开源软件，甚至它本身也是一个开源软件。 <p>在上线后，LiveJournal实现了非常快速的增长：</p><ul><li>2004年4月份：280万注册用户。 </li><li>2005年4月份：680万注册用户。 </li><li>2005年8月份：790万注册用户。 </li><li>达到了每秒钟上千次的页面请求及处理。 </li><li>使用了大量MySQL服务器。 </li><li>使用了大量通用组件。</li></ul><h2>二、LiveJournal架构现状概况</h2><p><img src="http://www.example.net.cn/archives/livejournal_backend.png" height="445" alt="livejournal_backend.png" width="600" /><br /></p><h2>三、从LiveJournal发展中学习</h2><p>&nbsp;</p><p>LiveJournal从1台服务器发展到100台服务器，这其中经历了无数的伤痛，但同时也摸索出了解决这些问题的方法，通过对LiveJournal的学习，可以让我们避免LJ曾经犯过的错误，并且从一开始就对系统进行良好的设计，以避免后期的痛苦。</p><p>下面我们一步一步看LJ发展的脚步。</p><div id="a000073more"><div id="more"><h2>1、一台服务器</h2><p>一台别人捐助的服务器，LJ最初就跑在上面，就像Google开始时候用的破服务器一样，值得我们尊敬。这个阶段，LJ的人以惊人的速度熟悉的Unix的操作管理，服务器性能出现过问题，不过还好，可以通过一些小修小改应付过去。在这个阶段里LJ把CGI升级到了FastCGI。</p><p>最终问题出现了，网站越来越慢，已经无法通过优过化来解决的地步，需要更多的服务器，这时LJ开始提供付费服务，可能是想通过这些钱来购买新的服务器，以解决当时的困境。<br />毫无疑问，当时LJ存在巨大的单点问题，所有的东西都在那台服务器的铁皮盒子里装着。</p><p><img src="http://www.example.net.cn/archives/LJ-backend-7.png" height="187" alt="LJ-backend-7.png" width="500" /></p><h2>2、两台服务器</h2><p>用付费服务赚来的钱LJ买了两台服务器：一台叫做Kenny的Dell 6U机器用于提供Web服务，一台叫做Cartman的Dell 6U服务器用于提供数据库服务。</p><p><img src="http://www.example.net.cn/archives/LJ-backend-8.png" height="279" alt="LJ-backend-8.png" width="218" /></p><p>LJ有了更大的磁盘，更多的计算资源。但同时网络结构还是非常简单，每台机器两块网卡，Cartman通过内网为Kenny提供MySQL数据库服务。<br /><br />暂时解决了负载的问题，新的问题又出现了：</p><ul><li>原来的一个单点变成了两个单点。 </li><li>没有冷备份或热备份。 </li><li>网站速度慢的问题又开始出现了，没办法，增长太快了。 </li><li>Web服务器上CPU达到上限，需要更多的Web服务器。</li></ul><h2>3、四台服务器</h2><p>又买了两台，Kyle和Stan，这次都是1U的，都用于提供Web服务。目前LJ一共有3台Web服务器和一台数据库服务器。这时需要在3台Web服务器上进行负载均横。</p><p><img src="http://www.example.net.cn/archives/LJ-backend-9.png" height="241" alt="LJ-backend-9.png" width="499" /></p><p>LJ把Kenny用于外部的网关，使用mod_backhand进行负载均横。</p><p>然后问题又出现了：</p><ul><li>单点故障。数据库和用于做网关的Web服务器都是单点，一旦任何一台机器出现问题将导致所有服务不可用。虽然用于做网关的Web服务器可以通过保持心跳同步迅速切换，但还是无法解决数据库的单点，LJ当时也没做这个。 </li><li>网站又变慢了，这次是因为IO和数据库的问题，问题是怎么往应用里面添加数据库呢？</li></ul><h2>4、五台服务器</h2><p>又买了一台数据库服务器。在两台数据库服务器上使用了数据库同步(Mysql支持的Master-Slave模式)，写操作全部针对主数据库（通过Binlog，主服务器上的写操作可以迅速同步到从服务器上），读操作在两个数据库上同时进行(也算是负载均横的一种吧)。</p><p><img src="http://www.example.net.cn/archives/LJ-backend-10.png" height="265" alt="LJ-backend-10.png" width="500" /></p><p>实现同步时要注意几个事项：</p><ul><li>读操作数据库选择算法处理，要选一个当前负载轻一点的数据库。 </li><li>在从数据库服务器上只能进行读操作 </li><li>准备好应对同步过程中的延迟，处理不好可能会导致数据库同步的中断。只需要对写操作进行判断即可，读操作不存在同步问题。</li></ul><h2>5、更多服务器</h2><p>有钱了，当然要多买些服务器。部署后快了没多久，又开始慢了。这次有更多的Web服务器，更多的数据库服务器，存在 IO与CPU争用。于是采用了BIG-IP作为负载均衡解决方案。</p><p><img src="http://www.example.net.cn/archives/LJ-backend-11.png" height="483" alt="LJ-backend-11.png" width="453" /></p><h2>6、现在我们在哪里：</h2><p><img src="http://www.example.net.cn/archives/LJ-backend-1.png" height="357" alt="LJ-backend-1.png" width="600" /></p><p>现在服务器基本上够了，但性能还是有问题，原因出在架构上。</p><p>数据库的架构是最大的问题。由于增加的数据库都是以Slave模式添加到应用内，这样唯一的好处就是将读操作分布到了多台机器，但这样带来的后果就是写操作被大量分发，每台机器都要执行，服务器越多，浪费就越大，随着写操作的增加，用于服务读操作的资源越来越少。</p><p><img src="http://www.example.net.cn/archives/LJ-backend-2.png" height="195" alt="LJ-backend-2.png" width="500" /></p><p>由一台分布到两台</p><p><img src="http://www.example.net.cn/archives/LJ-backend-3.png" height="273" alt="LJ-backend-3.png" width="500" /></p><p>最终效果</p><p>现在我们发现，我们并不需要把这些数据在如此多的服务器上都保留一份。服务器上已经做了RAID，数据库也进行了备份，这么多的备份完全是对资源的浪费，属于冗余极端过度。那为什么不把数据分布存储呢？</p><p>问题发现了，开始考虑如何解决。现在要做的就是把不同用户的数据分布到不同的服务器上进行存储，以实现数据的分布式存储，让每台机器只为相对固定的用户服务，以实现平行的架构和良好的可扩展性。</p><p>为了实现用户分组，我们需要为每一个用户分配一个组标记，用于标记此用户的数据存放在哪一组数据库服务器中。每组数据库由一个master及几个slave组成，并且slave的数量在2-3台，以实现系统资源的最合理分配，既保证数据读操作分布，又避免数据过度冗余以及同步操作对系统资源的过度消耗。</p><p><img src="http://www.example.net.cn/archives/LJ-backend-4.png" height="324" alt="LJ-backend-4.png" width="500" /></p><p>由一台（一组）中心服务器提供用户分组控制。所有用户的分组信息都存储在这台机器上，所有针对用户的操作需要先查询这台机器得到用户的组号，然后再到相应的数据库组中获取数据。</p><p>这样的用户架构与目前LJ的架构已经很相像了。</p><p>在具体的实现时需要注意几个问题：</p><ul><li>在数据库组内不要使用自增ID，以便于以后在数据库组之间迁移用户，以实现更合理的I/O，磁盘空间及负载分布。 </li><li>将userid，postid存储在全局服务器上，可以使用自增，数据库组中的相应值必须以全局服务器上的值为准。全局服务器上使用事务型数据库InnoDB。 </li><li>在数据库组之间迁移用户时要万分小心，当迁移时用户不能有写操作。</li></ul><h2>7、现在我们在哪里</h2><p><img src="http://www.example.net.cn/archives/LJ-backend-5.png" height="365" alt="LJ-backend-5.png" width="500" /></p><p>问题：</p><ul><li>一个全局主服务器，挂掉的话所有用户注册及写操作就挂掉。 </li><li>每个数据库组一个主服务器，挂掉的话这组用户的写操作就挂掉。 </li><li>数据库组从服务器挂掉的话会导致其它服务器负载过大。</li></ul><p>对于Master-Slave模式的单点问题，LJ采取了Master-Master模式来解决。所谓Master-Master实际上是人工实现的，并不是由MySQL直接提供的，实际上也就是两台机器同时是Master，也同时是Slave，互相同步。</p><p>Master-Master实现时需要注意：</p><ul><li>一个Master出错后恢复同步，最好由服务器自动完成。 </li><li>数字分配，由于同时在两台机器上写，有些ID可能会冲突。</li></ul><p>解决方案：</p><ul><li>奇偶数分配ID，一台机器上写奇数，一台机器上写偶数 </li><li>通过全局服务器进行分配(LJ采用的做法)。</li></ul><p>&nbsp;</p><p>Master-Master模式还有一种用法，这种方法与前一种相比，仍然保持两台机器的同步，但只有一台机器提供服务（读和写），在每天晚上的时候进行轮换，或者出现问题的时候进行切换。</p><h2>8、现在我们在哪里</h2><p><img src="http://www.example.net.cn/archives/LJ-backend-6.png" height="349" alt="LJ-backend-6.png" width="500" /></p><p>现在插播一条广告，MyISAM VS InnoDB。</p><p>使用InnoDB：</p><ul><li>支持事务 </li><li>需要做更多的配置，不过值得，可以更安全的存储数据，以及得到更快的速度。</li></ul><p>使用MyISAM：</p><ul><li>记录日志（LJ用它来记网络访问日志） </li><li>存储只读静态数据，足够快。 </li><li>并发性很差，无法同时读写数据（添加数据可以） </li><li>MySQL非正常关闭或死机时会导致索引错误，需要使用myisamchk修复，而且当访问量大时出现非常频繁。</li></ul><h2>9、缓存</h2><p>去年我写过<a href="http://www.example.net.cn/archives/2006/01/eoamemcachedoea.html"><span style="color: #0f314e">一篇文章介绍memcached</span></a>，它就是由LJ的团队开发的一款缓存工具，以key-value的方式将数据存储到分布的内存中。LJ缓存的数据：</p><ul><li>12台独立服务器（不是捐赠的） </li><li>28个实例 </li><li>30GB总容量 </li><li>90-93%的命中率（用过squid的人可能知道，squid内存加磁盘的命中率大概在70-80%）</li></ul><p>如何建立缓存策略？</p><p>想缓存所有的东西？那是不可能的，我们只需要缓存已经或者可能导致系统瓶颈的地方，最大程度的提交系统运行效率。通过对MySQL的日志的分析我们可以找到缓存的对象。</p><p>缓存的缺点？</p><ul><li>没有完美的事物，缓存也有缺点： </li><li>增大开发量，需要针对缓存处理编写特殊的代码。 </li><li>管理难度增加，需要更多人参与系统维护。 </li><li>当然大内存也需要钱。</li></ul><h2>10、Web访问负载均衡</h2><p>在数据包级别使用BIG-IP，但BIG-IP并不知道我们内部的处理机制，无法判断由哪台服务器对这些请求进行处理。反向代理并不能很好的起到作用，不是已经够快了，就是达不到我们想要的效果。</p><p>所以，LJ又开发了<a href="http://www.danga.com/perlbal/"><span style="color: #3165ce">Perlbal</span></a>。特点：</p><ul><li>快，小，可管理的http web 服务器/代理 </li><li>可以在内部进行转发 </li><li>使用Perl开发 </li><li>单线程，异步，基于事件，使用epoll , kqueue </li><li>支持Console管理与http远程管理，支持动态配置加载 </li><li>多种模式：web服务器，反向代理，插件 </li><li>支持插件：GIF/PNG互换？</li></ul><h2>11、MogileFS</h2><p>LJ使用开源的<a href="http://www.danga.com/mogilefs/"><span style="color: #3165ce">MogileFS</span></a>作为分布式文件存储系统。MogileFS使用非常简单，它的主要设计思想是：</p><ul><li>文件属于类（类是最小的复制单位） </li><li>跟踪文件存储位置 </li><li>在不同主机上存储 </li><li>使用MySQL集群统一存储分布信息 </li><li>大容易廉价磁盘</li></ul><p>到目前为止就这么多了，更多文档可以在<a href="http://www.danga.com/words/"><span style="color: #3165ce">http://www.danga.com/words/</span></a>找到。<a href="http://www.danga.com/"><span style="color: #3165ce">Danga.com</span></a>和<a href="http://www.livejournal.com/"><span style="color: #0f314e">LiveJournal.com</span></a>的同学们拿这个文档参加了两次MySQL Con，两次OS Con，以及众多的其它会议，无私的把他们的经验分享出来，值得我们学习。在web2.0时代快速开发得到大家越来越多的重视，但良好的设计仍是每一个应用的基础，希望web2.0们在成长为Top500网站的路上，不要因为架构阻碍了网站的发展。</p><p>参考资料：<a href="http://www.danga.com/words/2005_oscon/oscon-2005.pdf"><span style="color: #3165ce">http://www.danga.com/words/2005_oscon/oscon-2005.pdf</span></a></p><p>&nbsp;</p><p>转:http://www.example.net.cn/archives/2006/03/olivejournaloio.html</p></div></div>
          <br/><br/>
          <span style="color:red;">
            <a href="http://sgwood.javaeye.com/blog/165945#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 28 Feb 2008 19:23:27 +0800</pubDate>
        <link>http://sgwood.javaeye.com/blog/165945</link>
        <guid>http://sgwood.javaeye.com/blog/165945</guid>
      </item>
          <item>
        <title>设置文本域的背景图&lt;textarea name=&quot;textarea&quot; cols=&quot;35&quot; rows=</title>
        <author>sgwood</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://sgwood.javaeye.com">sgwood</a>&nbsp;
                    链接：<a href="http://sgwood.javaeye.com/blog/165087" style="color:red;">http://sgwood.javaeye.com/blog/165087</a>&nbsp;
          发表时间: 2008年02月26日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>&lt;textarea name=&quot;textarea&quot; cols=&quot;35&quot; rows=&quot;15&quot; style=&quot;background-attachment: fixed;background-image: url(./bg.jpg)&quot;&gt;&lt;/textarea&gt; <br />注: fixed可以固定背景图，如不需要可不用。 <br />效果图如下： <br /><img src="http://msdn.javaeye.com/upload/picture/pic/4109/6d9919aa-9c81-4b97-843e-e3f8e9928741.jpg" alt="" />&nbsp;</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://sgwood.javaeye.com/blog/165087#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 26 Feb 2008 13:05:46 +0800</pubDate>
        <link>http://sgwood.javaeye.com/blog/165087</link>
        <guid>http://sgwood.javaeye.com/blog/165087</guid>
      </item>
          <item>
        <title>同行一边居左 一边居右 div</title>
        <author>sgwood</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://sgwood.javaeye.com">sgwood</a>&nbsp;
                    链接：<a href="http://sgwood.javaeye.com/blog/165086" style="color:red;">http://sgwood.javaeye.com/blog/165086</a>&nbsp;
          发表时间: 2008年02月26日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          原代码 - 显示为 内容A靠右<br />引用:<br />&lt;div class="main" style="font-size: 12px; text-align: right; font-weight:bold;">内容A&lt;/div><br />想把它增加右边一个内容 - 显示为 内容A靠左,内容B靠右<br />引用:<br />&lt;table cellspacing="0" cellpadding="0" border="0" width="{TABLEWIDTH}" align="center" style="table-layout: fixed"><br />&lt;tr>&lt;td class="nav" width="50%" align="left" nowrap>内容A&lt;/td><br />&lt;td align="right" width="50%">内容B&lt;/td><br />&lt;/tr>&lt;/table>&lt;br>&lt;/div><br />第一个代码是DIV,而第2个代码是table . <br />怎么将第一个效果,用DIV表达出来呢?<br />回答:<br />&lt;div style="float:left;">第一个层&lt;/div>&lt;div style="float:right;">表格&lt;/div>
          <br/><br/>
          <span style="color:red;">
            <a href="http://sgwood.javaeye.com/blog/165086#comments" style="color:red;">已有 <strong>1</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 26 Feb 2008 13:01:53 +0800</pubDate>
        <link>http://sgwood.javaeye.com/blog/165086</link>
        <guid>http://sgwood.javaeye.com/blog/165086</guid>
      </item>
          <item>
        <title>orcale使用记录</title>
        <author>sgwood</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://sgwood.javaeye.com">sgwood</a>&nbsp;
                    链接：<a href="http://sgwood.javaeye.com/blog/164551" style="color:red;">http://sgwood.javaeye.com/blog/164551</a>&nbsp;
          发表时间: 2008年02月24日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          创建表空间sgwood:<br />create tablespace sgwood datafile 'H:\oracle\product\10.2.0\oradata\orcl\sgwood.dbf' size 200m autoextend on next 10m maxsize unlimited;<br />建表admin_emp:<br /> create table admin_emp (<br /> empno NUMBER(5) PRIMARY KEY,<br /> ename VARCHAR(15) NOT NULL,<br /> ssn NUMBER(9) ,<br /> job VARCHAR2(10),<br /> mgr NUMBER(5),<br /> hiredate DATE DEFAULT (sysdate),<br /> sal NUMBER(7,2),<br /> comm NUMBER(7,2),<br /> deptno NUMBER(3) NOT NULL<br /> )<br /> alter table system.admin_emp add<br /> (location varchar2(80),<br /> tel varchar2(10));<br /><br /> alter table admin_emp<br /> rename column ssn to ssno;<br />alter table admin_emp<br />set unused(comm);<br />SQL> select * from all_unused_col_tabs;<br /><br />OWNER&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; TABLE_NAME&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; COUNT<br />------------------------------ ------------------------------ ----------<br />SYSTEM&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ADMIN_EMP&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; 1<br />//改变表存储<br />alter table system.admin_emp move<br />storage (initial 20K<br />next 40K<br />maxextents 20<br />pctincrease 0);<br /><br /> tablespace sgwood<br /> STORAGE (INITIAL 50K);<br />建序列emp_sequence：<br />create sequence emp_sequence<br />increment by 1<br />start with 1<br />nomaxvalue<br />nocycle<br />cache 10;<br />alter sequence emp_sequence<br />increment by 10<br />maxvalue 1000<br />cycle<br />cache 20;<br />insert into admin_emp(empno,ename,deptno) values(emp_sequence.NEXTVAL,'sgwood',120);<br />insert into admin_emp(empno,ename,deptno) values(emp_sequence.NEXTVAL,'sgwood',emp_sequence.CURRVAL);<br />insert into admin_emp(empno,ename,deptno) values(emp_sequence.CURRVAL,'sgwood',emp_sequence.NEXTVAL);<br />SQL> select empno,ename,deptno from admin_emp ;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp; EMPNO ENAME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DEPTNO<br />---------- --------------- ----------<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1 2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2 sgwood&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 120<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3 sgwood&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 120<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4 sgwood&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 120<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5 sgwood&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 120<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6 sgwood&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 120<br /><br />已选择6行。<br /><br />创建视图sales_staff:<br />create view sales_staff as<br />select empno,ename,deptno<br />from admin_emp<br />where&nbsp; deptno=120<br />with check option constraint sales_staff_cnst;<br />insert into sales_staff values(7788,'OSTER',120); OK!<br />insert into sales_staff values(7788,'OSTER',12);<br />select * from sales_staff;<br /><br />select view_name,text_length,text from dba_views where view_name='SALES_STAFF';<br /><br />select column_name,data_type,data_length,last_analyzed from dba_tab_columns where owner='SCOTT' and TABLE_name='EMP';
          <br/><br/>
          <span style="color:red;">
            <a href="http://sgwood.javaeye.com/blog/164551#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 24 Feb 2008 10:42:35 +0800</pubDate>
        <link>http://sgwood.javaeye.com/blog/164551</link>
        <guid>http://sgwood.javaeye.com/blog/164551</guid>
      </item>
          <item>
        <title>77go论坛性能测试</title>
        <author>sgwood</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://sgwood.javaeye.com">sgwood</a>&nbsp;
                    链接：<a href="http://sgwood.javaeye.com/blog/164549" style="color:red;">http://sgwood.javaeye.com/blog/164549</a>&nbsp;
          发表时间: 2008年02月24日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          主要是些SQL测试，记录如下：<br /><br />77go(网络查询): ID(index),ID1,ID2(index)皆为bigint(13) not null default (0),title varchar(200) null(yes)<br />select ID from bbscs_forum_2 <br />0 row affected .1 field ,26829 records in last resultset. Time: 4.50sec<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;&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; 4.8<br />三：4.89<br />四 4.42<br />五：4.58<br />六：4.72<br />7: 4.78<br />8: 5.28<br />9: 6.92<br />10: 4.98<br />11: 4.47<br /><br />select ID2,ID3 from bbscs_forum_2<br />.............2 fields, 26829 records&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 7.77sec<br />2: 7.58sec<br />3:7.63sec<br />4: 8.27sec<br />5:7.92sec<br />6:7.83sec<br />7:7.77sec<br />8:7.86sec<br /><br />select ID,ID1,ID2 from bbscs_forum_2<br />..................3 fields ,.......................11.31sec<br />2:10.92<br />3:11.48<br />4:11.08<br />5:10.86<br /><br />select title from bbscs_forum_2<br />1:8.94<br />2:8.89<br />3:9.13<br />4:8.83<br />5:9.02sec<br />6:8.98sec<br /><br />select detail&nbsp; from bbscs_forum_2&nbsp; where id&lt;40000<br />1:0.14sec(193个数据)<br />2:0.13sec<br /><br />select detail from bbscs_forum_2&nbsp; (detail:text )<br />1:20.09 内容举例：post_21190_170_21190_1140543448796.html<br />2:20.39(无空记录)<br />3:20.08<br />4:20.66<br /><br />select sign from bbscs_forum_2(sign为text)<br />1:3.64<br />2:3.64(可能有许多空记录,其中24454为空）<br />3:3.98<br /><br />select lastPostTitle from bbscs_forum_2 (varchar(510))<br />1:3.52(可能是大多内容少成"---"吧）<br />2:3.64<br />3:3.33<br />select Amend from bbscs_forum_2 (与lastPostTitle一样)<br />1:2.23<br />2:2.14<br />3:2.39 (内容全为空）
          <br/><br/>
          <span style="color:red;">
            <a href="http://sgwood.javaeye.com/blog/164549#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 24 Feb 2008 10:40:34 +0800</pubDate>
        <link>http://sgwood.javaeye.com/blog/164549</link>
        <guid>http://sgwood.javaeye.com/blog/164549</guid>
      </item>
          <item>
        <title>Maven入门--较复杂的实例</title>
        <author>sgwood</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://sgwood.javaeye.com">sgwood</a>&nbsp;
                    链接：<a href="http://sgwood.javaeye.com/blog/164107" style="color:red;">http://sgwood.javaeye.com/blog/164107</a>&nbsp;
          发表时间: 2008年02月22日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <span style="font-size: x-small"><span style="font-size: x-small; font-family: courier new,courier"><span style="font-size: small; font-family: times new roman,times">本文将使用一个较复杂的实例，讲述如何定制目录布局(即不使用Maven标准目录布局)，以及讲述一些关键插件的使用(配置)。为了方便其它朋友能够方便地使用该实例，后台数据库使用开源的面向对象数据库--</span></span></span><a href="http://www.db4o.com/"><span style="font-size: x-small; color: #000080"><span style="font-size: x-small; font-family: courier new,courier"><span style="font-size: small; font-family: times new roman,times">db4o</span></span></span></a><span style="font-family: courier new,courier"><span style="font-size: x-small"><span style="font-size: small"><span style="font-family: times new roman,times"><span style="font-size: x-small">，该数据库无需安装，已包含在与本文配套的实例中，文末附有该实例的下载链接。(2007.01.02最后更新)<br /></span><span style="font-size: 12pt; color: red"><span style="font-size: 12pt; color: red">注：转载出处(<a href="http://www.blogjava.net/jiangshachina" style="color: red">http://www.blogjava.net/jiangshachina</a>)！</span></span><br /><br /><strong><span style="font-size: small">1 实例的构想</span></strong><br /></span></span></span></span><span style="font-size: x-small"><span style="font-size: x-small; font-family: courier new,courier"><span style="font-size: small; font-family: times new roman,times">文章开头的摘要已经讲述了，本文仍然将以一个实例描述如何使用Maven， 该实例将使用非Maven标准的目录结构，并将呈现一些关键的Maven插件的配置与应用。 该实例是一个基于db4o的数据库Web应用。该应用本身十分简单，即从db4o数据库中查询出若干记录并将它们显现在Web页面中。<br />&nbsp;&nbsp;&nbsp; 该实例仍然由一个普通应用工程(demo-app)与一个Web应用工程(demo-web)，以及这两个工程的父工程(demo)构成，最终的目标是将Web应用工程制作成war文件，并部署到JBoss服务器中。启动服务器后，能够在页面中看到正确的查询结果。 <br />&nbsp;&nbsp;&nbsp; 该实例使用<span style="color: #008000">Eclipse3.2 + JDK1.5.0_10 + Windows2000</span>开发。当然这仅仅只是我个人的开发平台，但该实例并不受限于此平台；由于我选择使用db4o针对JDK1.5的产品包，所以该实例只能运行在JDK1.5.0或更高版本的JDK/JRE中； 该工程中的所有文件都使用<span style="color: #006400">UTF-8</span>编码方式。 <br /><br /><strong>2 demo工程</strong> <br />demo工程是其它两个工程的父工程，它的主要职责是预定义子工程所需要依赖的jar文件(artifact)，以及针对子工程所使用的插件进行通用配置。该工程完整的POM文件如下所示：<br /></span></span></span><div style="padding-right: 5px; padding-left: 4px; font-size: 13px; padding-bottom: 4px; width: 98%; padding-top: 4px; background-color: #eeeeee; border: #cccccc 1px solid"><span style="color: #000000"><span style="font-size: x-small"><span style="font-size: x-small; font-family: courier new,courier"><span style="font-size: small; font-family: times new roman,times">&lt;project</span></span></span></span><span style="font-size: x-small"><span style="font-family: courier new,courier"><span style="font-size: x-small"><span style="font-size: small"><span style="font-family: times new roman,times"><span style="color: #000000">&gt;<br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp; &lt;modelVersion&gt;</span><span style="color: #000000">4.0.0</span></span></span></span></span></span><span style="font-size: x-small"><span style="font-family: courier new,courier"><span style="font-size: x-small"><span style="font-size: small"><span style="font-family: times new roman,times"><span style="color: #000000">&lt;/modelVersion&gt;<br />&nbsp;&nbsp;&nbsp; &lt;groupId&gt;mvn.demo&lt;/groupId&gt;<br />&nbsp;&nbsp;&nbsp; &lt;artifactId&gt;demo&lt;/artifactId&gt;<br />&nbsp;&nbsp;&nbsp; &lt;packaging&gt;pom&lt;/packaging&gt;<br />&nbsp;&nbsp;&nbsp; &lt;version&gt;</span><span style="color: #000000">1.0</span></span></span></span></span></span><span style="font-size: x-small"><span style="font-family: courier new,courier"><span style="font-size: x-small"><span style="font-size: small"><span style="font-family: times new roman,times"><span style="color: #000000">-SNAPSHOT&lt;/version&gt;<br />&nbsp;&nbsp;&nbsp; &lt;description&gt;Maven&nbsp;Demo&nbsp;Project&lt;/description&gt;<br /><br />&nbsp;&nbsp;&nbsp; &lt;modules&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;module&gt;demo-app&lt;/module&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;module&gt;demo-web&lt;/module&gt;<br />&nbsp;&nbsp;&nbsp; &lt;/modules&gt;<br /><br />&nbsp;&nbsp;&nbsp; &lt;dependencyManagement&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;dependencies&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;dependency&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;groupId&gt;mvn.demo&lt;/groupId&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;artifactId&gt;demo-app&lt;/artifactId&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;version&gt;${project.version}&lt;/version&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/dependency&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;dependency&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;groupId&gt;mvn.demo&lt;/groupId&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;artifactId&gt;demo-web&lt;/artifactId&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;version&gt;${project.version}&lt;/version&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/dependency&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;dependency&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;groupId&gt;com.db4o&lt;/groupId&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;artifactId&gt;db4o-java5&lt;/artifactId&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;version&gt;</span><span style="color: #000000">5.5</span></span></span></span></span></span><span style="font-size: x-small"><span style="font-family: courier new,courier"><span style="font-size: x-small"><span style="font-size: small"><span style="font-family: times new roman,times"><span style="color: #000000">&lt;/version&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/dependency&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;dependency&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;groupId&gt;javax.servlet&lt;/groupId&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;artifactId&gt;servlet-api&lt;/artifactId&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;version&gt;</span><span style="color: #000000">2.4</span></span></span></span></span></span><span style="font-size: x-small"><span style="font-family: courier new,courier"><span style="font-size: x-small"><span style="font-size: small"><span style="font-family: times new roman,times"><span style="color: #000000">&lt;/version&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;scope&gt;provided&lt;/scope&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/dependency&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;dependency&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;groupId&gt;commons-configuration&lt;/groupId&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;artifactId&gt;commons-configuration&lt;/artifactId&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;version&gt;</span><span style="color: #000000">1.2</span></span></span></span></span></span><span style="font-size: x-small"><span style="font-family: courier new,courier"><span style="font-size: x-small"><span style="font-size: small"><span style="font-family: times new roman,times"><span style="color: #000000">&lt;/version&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;exclusions&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;exclusion&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;groupId&gt;dom4j&lt;/groupId&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;artifactId&gt;dom4j&lt;/artifactId&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/exclusion&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;exclusion&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;groupId&gt;xml-apis&lt;/groupId&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;artifactId&gt;xml-apis&lt;/artifactId&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/exclusion&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;exclusion&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;groupId&gt;xalan&lt;/groupId&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;artifactId&gt;xalan&lt;/artifactId&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/exclusion&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;exclusion&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;groupId&gt;xerces&lt;/groupId&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;artifactId&gt;xercesImpl&lt;/artifactId&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/exclusion&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/exclusions&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/dependency&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/dependencies&gt;<br />&nbsp;&nbsp;&nbsp; &lt;/dependencyManagement&gt;<br /><br />&nbsp;&nbsp;&nbsp; &lt;dependencies&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;dependency&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;groupId&gt;junit&lt;/groupId&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;artifactId&gt;junit&lt;/artifactId&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;version&gt;</span><span style="color: #000000">3.8.1</span></span></span></span></span></span><span style="font-size: x-small"><span style="font-family: courier new,courier"><span style="font-size: x-small"><span style="font-size: small"><span style="font-family: times new roman,times"><span style="color: #000000">&lt;/version&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;scope&gt;test&lt;/scope&gt;<br />&nbsp;&nbsp;&nbsp; &lt;/dependency&gt;<br />&nbsp;&nbsp;&nbsp; &lt;/dependencies&gt;<br /><br />&nbsp;&nbsp;&nbsp; &lt;build&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;plugins&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;plugin&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;artifactId&gt;maven-resources-plugin&lt;/artifactId&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;configuration&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;encoding&gt;UTF-</span><span style="color: #000000">8</span></span></span></span></span></span><span style="font-size: x-small"><span style="font-family: courier new,courier"><span style="font-size: x-small"><span style="font-size: small"><span style="font-family: times new roman,times"><span style="color: #000000">&lt;/encoding&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/configuration&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/plugin&gt;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;plugin&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;artifactId&gt;maven-compiler-plugin&lt;/artifactId&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;configuration&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;source&gt;</span><span style="color: #000000">1.5</span></span></span></span></span></span><span style="font-size: x-small"><span style="font-family: courier new,courier"><span style="font-size: x-small"><span style="font-size: small"><span style="font-family: times new roman,times"><span style="color: #000000">&lt;/source&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;target&gt;</span><span style="color: #000000">1.5</span></span></span></span></span></span><span style="font-size: x-small"><span style="font-family: courier new,courier"><span style="font-size: x-small"><span style="font-size: small"><span style="font-family: times new roman,times"><span style="color: #000000">&lt;/target&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;encoding&gt;UTF-</span><span style="color: #000000">8</span></span></span></span></span></span><span style="color: #000000"><span style="font-size: x-small"><span style="font-size: x-small; font-family: courier new,courier"><span style="font-size: small; font-family: times new roman,times">&lt;/encoding&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/configuration&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/plugin&gt;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;plugin&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;artifactId&gt;maven-jar-plugin&lt;/artifactId&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;configuration&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;archive&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;addMavenDescriptor&gt;false&lt;/addMavenDescriptor&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/archive&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/configuration&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/plugin&gt;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;plugin&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;artifactId&gt;maven-war-plugin&lt;/artifactId&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;configuration&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;archive&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;addMavenDescriptor&gt;false&lt;/addMavenDescriptor&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/archive&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/configuration&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/plugin&gt;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;plugin&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;artifactId&gt;maven-javadoc-plugin&lt;/artifactId&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;configuration&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;charset&gt;UTF16&lt;/charset&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/configuration&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/plugin&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/plugins&gt;<br />&nbsp;&nbsp;&nbsp; &lt;/build&gt;<br />&lt;/project&gt;<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" alt="" /></span></span></span></span></div><span style="font-size: x-small"><span style="font-size: x-small; font-family: courier new,courier"><span style="font-size: small; font-family: times new roman,times">&nbsp;&nbsp;&nbsp; 预定义工程的依赖关系，就是把会被子工程依赖的artifact的详细信息(groupId，artifactId，version，...)先声明到&lt;dependencyManagement&gt;中。然后子工程只需要声明使用某个artifact就可以了，即那时只需要设置groupId和artifactId(甚至更少)就可以了。 <strong>&lt;dependencyManagement&gt;中声明的artifact并不一定真的会被使用到</strong>。 <br /><strong>2.1 声明依赖关系</strong> <br />&nbsp;&nbsp;&nbsp; 根据实际情况， 该实例 需要使用db4o针对java5的产品包(jar文件)。由于该jar文件并不存在于Maven的中央仓库中，所以我们不能直接通过Maven获得该jar文件。我们只能另外下载db4o-5.5(Java版)的压缩包，然后从压缩包内获得db4o-java5.jar。得到该jar后，必须先将它安装到Maven的本地仓库中(安装方法参见资源[1]，主题&quot;向本地仓库安装文件时要生成POM文件&quot;)，以备后面的使用。此处将该artifact的groupId定义为<span style="color: #0000ff">com.db4o</span>，artifactId定义为<span style="color: #0000ff">db4o-java5</span>，version自然就是5.5了(请见上述POM脚本)。<br />&nbsp;&nbsp;&nbsp; 由于该实例最终是一个Web应用，所以它至少需要依赖Servlet的包(servlet-api-2.4.jar)，还需要commons-configuration-1.2.jar。这两个artifact都已经存在于Maven中央仓库中，所以我查找到它们后，按照Maven中央仓库的命名将它们声明到了&lt;dependencyManagement&gt;中(请见上述POM脚本)。junit是进行单元测试时使用的artifact，(假设)它肯定会被每个工程使用，所以没有将它设置到 &lt;dependencyManagement&gt;中，而直接设置到了 &lt;dependency&gt;中。 <br />&nbsp;&nbsp;&nbsp; 细心的朋友肯定已经发现了，针对 commons-configuration的依赖声明处多了一些语句。从表面上看，应该是排除了4个artifact(dom4j， <span style="color: #000000">xml-apis</span> ， <span style="color: #000000">xalan</span> 和 <span style="color: #000000">xerces</span> )。不错，就是排除了这4个jar文件(artifact)。如果有兴趣的话，可以将整个&lt;exclusions&gt;元素删除，然后再尝试一下制作war文件。你会发现在WEB-INF/lib目录下存在着这4个artifact对应的jar文件。那我为什么要将它们&ldquo;排除&rdquo;呢？因为，它们是多余的！即，它们对于我的这个Web应用来说，根本就是无用的！<br />&nbsp;&nbsp;&nbsp; Maven2加入了一个很好的特性：<strong>自动加载&ldquo;依赖的依赖(Transitive Dependency)&rdquo;</strong>。以commons-configuration为例。为了能够让它运行正常，我们实际上还需要其它一些jar(artifact)，如commons-collections，commons-lang，...。但这些artifact我都没有&ldquo;显示&rdquo;地声明需要依赖它们，但Maven会自动加载，因为 commons-configuration的POM文件将它们声明为了dependency 。<br />&nbsp;&nbsp;&nbsp; 既然那个4个artifact是commons-configuration的依赖，为什么会认为它们是无用的呢？实际上，它们就不应该被声明到commons-configuration的依赖关系中。这是commons-configuration开发者的失误，他们没有将依赖关系整理清晰，而将一些确实既不是runtime，更不是compile-time需要的artifact放入到了依赖关系中。在Maven中央仓库中存在着很多这种情况，所以我们有时需要弄清楚&ldquo;哪些文件是我们真正需要的，哪些是可以被清除的&rdquo;。但有时候，很难做到一个不漏。正是由于这一原因，自动加载Transitive Dependency这一极好的特性，有时让人十分无奈 ^_^<br /><strong>2.2 对插件进行基本配置</strong><br />我们可以把对插件的全局性(如针对整个项目的)设置放到较高层次的POM文件中，因为它们被设置后，子工程们就会自然遵守它们，而且可以使每个子工程的情况都是一样的。<br />&nbsp;&nbsp;&nbsp; 在第1节中，已经表明该工程使用JDK1.5平台，并且所有文件都使用UTF-8的编码方式。而Maven默认使用JDK1.3级别的javac编译器；默认使用本地编码方式(简体中文Windows操作系统默认使用GBK编码方式)处理文件。这样就必须对Maven进行适当设置，以满足工程的实际需要。<br />&nbsp;&nbsp;&nbsp; 针对资源文件的处理<span style="color: #000000">，Maven使用maven-resources-plugin插件，需要将它的编码方式设置为UTF-8。编译Java源文件，是使用maven-compiler-plugin插件，需要将它的source(Java源文件)与target(class文件)的级别都设置为1.5，另外还要将它的encoding方式设置为UTF-8。（详细设置请见POM脚本）</span><br /><br /></span></span></span><span style="font-size: x-small"><span style="font-family: courier new,courier"><span style="font-size: x-small"><span style="font-size: small"><span style="font-family: times new roman,times"><strong>3 demo-app工程<br /></strong>demo-app工程是一个普通应用程序工程，它用于处理和数据库相关的操作，如针对数据库的增、删、改、查等基本功能。该工程POM文件的主要内容如下所示：<br /></span></span></span></span></span><div style="padding-right: 5px; padding-left: 4px; font-size: 13px; padding-bottom: 4px; width: 98%; padding-top: 4px; background-color: #eeeeee; border: #cccccc 1px solid"><span style="color: #000000"><span style="font-size: x-small"><span style="font-size: x-small; font-family: courier new,courier"><span style="font-size: small; font-family: times new roman,times">&lt;project</span></span></span></span><span style="color: #000000"><span style="font-size: x-small"><span style="font-size: x-small; font-family: courier new,courier"><span style="font-size: small; font-family: times new roman,times">&gt;<br />&nbsp;&nbsp;&nbsp; ......</span></span></span></span><span style="color: #000000"><br /><span style="font-size: x-small"><span style="font-size: x-small; font-family: courier new,courier"><span style="font-size: small; font-family: times new roman,times">&nbsp;&nbsp;&nbsp; &lt;build&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;finalName&gt;app&lt;/finalName&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;directory&gt;target&lt;/directory&gt;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;sourceDirectory&gt;src/java&lt;/sourceDirectory&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;outputDirectory&gt;target/classes&lt;/outputDirectory&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;resources&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;resource&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;directory&gt;src/java&lt;/directory&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;excludes&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;exclude&gt;**/*.java&lt;/exclude&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/excludes&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/resource&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/resources&gt;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;testSourceDirectory&gt;src/test/java&lt;/testSourceDirectory&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;testOutputDirectory&gt;target/test-classes&lt;/testOutputDirectory&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;testResources&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;testResource&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;directory&gt;src/test/java&lt;/directory&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;excludes&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;exclude&gt;**/*.java&lt;/exclude&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/excludes&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/testResource&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/testResources&gt;<br />&nbsp;&nbsp;&nbsp; &lt;/build&gt;<br />&lt;/project&gt;<br /></span></span></span></span></div><span style="font-size: x-small"><span style="font-size: x-small; font-family: courier new,courier"><span style="font-size: small; font-family: times new roman,times">&nbsp;&nbsp;&nbsp; 文章的开头已经提到，本实例将会使用定制的目录结构，但在前面却一字不提此事，现在将描述如何定制目录结构。Maven的标准目录结构其实是在Super POM中设置的，由于任何POM都会继承该POM，所以所有的工作都会默认使用标准目录结构。要定制目录，其实就是需要重新设置相关参数的值，即用新值覆盖Super POM中的值。<br /></span></span></span><span style="color: #000000"><span style="font-size: x-small"><span style="font-size: x-small; font-family: courier new,courier"><span style="font-size: small; font-family: times new roman,times">[1]&lt;finalName&gt;，该元素指定了工程输出的artifact的名称，默认值为${artifactId}-${version}，此处修改为app。<br /></span></span></span></span><span style="color: #000000"><span style="font-size: x-small"><span style="font-size: x-small; font-family: courier new,courier"><span style="font-size: small; font-family: times new roman,times">[2]&lt;directory&gt;，该元素指定了工程输出的目标目录。默认值为target，此处未修改变。<br /></span></span></span></span><span style="color: #000000"><span style="font-size: x-small"><span style="font-size: x-small; font-family: courier new,courier"><span style="font-size: small; font-family: times new roman,times">[3]&lt;sourceDirectory&gt;，该元素指定了Java源文件所在的目录。默认值为src/main/java，此处修改为src/java。<br /></span></span></span></span><span style="font-size: x-small"><span style="font-family: courier new,courier"><span style="font-size: x-small"><span style="font-size: small"><span style="font-family: times new roman,times"><span style="color: #000000">[4]&lt;outputDirectory&gt;，该元素指定了编译后的class文件的放置目录。默认值为target/classes，此处未作改变。<br /></span><span style="color: #000000">[5]&lt;resources&gt;</span> <span style="color: #000000">&lt;resource&gt;，该元素指定了Java源文件使用的资源文件的存放目录。默认值为src/main/resources，此处修改为src/java。由于在编码Java源文件时，Maven会将资源路径中的文件全部拷贝到classes目录。而此时将Java资源文件目录与Java源文件目录，设置为同一目录，所以需要将.java文件排除在资源文件的范畴之外(</span> <span style="color: #000000">&lt;exclude&gt;**/*.java&lt;/exclude&gt;</span> </span></span></span></span></span><span style="font-size: x-small"><span style="font-family: courier new,courier"><span style="font-size: x-small"><span style="font-size: small"><span style="font-family: times new roman,times"><span style="color: #000000">)。<br />[6]</span> </span></span></span></span></span><span style="font-size: x-small"><span style="font-family: courier new,courier"><span style="font-size: x-small"><span style="font-size: small"><span style="font-family: times new roman,times"><span style="color: #000000">&lt;testSourceDirectory&gt;，该元素指定了单元测试Java源文件的放置目录。默认值为src/test/java，此处未作修改。<br />[7]</span> <span style="color: #000000">&lt;testOutputDirectory&gt;，该元素指定了单元测试Java源文件编译后的class文件放置目录。默认值为</span> </span></span></span></span></span><span style="font-size: x-small"><span style="font-family: courier new,courier"><span style="font-size: x-small"><span style="font-size: small"><span style="font-family: times new roman,times"><span style="color: #000000">target/test-classes，此处未作改变。<br />[8]</span> <span style="color: #000000">&lt;testResources&gt;</span> <span style="color: #000000">&lt;testResource&gt;，该元素指定了单元测试Java源文件所使用的资源文件的放置目录。默认值为src/test/resources，此处修改为</span> <span style="color: #000000">src/test/java。并且也做了与</span> <span style="color: #000000">设置&lt;resources&gt;</span> </span></span></span></span></span><span style="font-size: x-small"><span style="font-family: courier new,courier"><span style="font-size: x-small"><span style="font-size: small"><span style="font-family: times new roman,times"><span style="color: #000000">&lt;resource&gt;时相同的处理(排除Java源文件)。<br />&nbsp;&nbsp;&nbsp; 通过上述设置后，就可以拥有一个定制的Maven工程目录结构了。<br /></span><br /></span></span></span></span></span><span style="font-size: x-small"><span style="font-family: courier new,courier"><span style="font-size: x-small"><span style="font-size: small"><span style="font-family: times new roman,times"><strong>4 demo-web工程<br /></strong>demo-web工程是整个应用最终的目标输出，因为此处的目的就是制作一个war文件，然后将它部署到JBoss服务器中。与demo-app工程相比，demo-web工程的POM文件主要有如下不同内容：<br /></span></span></span></span></span><div style="padding-right: 5px; padding-left: 4px; font-size: 13px; padding-bottom: 4px; width: 98%; padding-top: 4px; background-color: #eeeeee; border: #cccccc 1px solid"><!--<br>
<br>
Code highlighting produced by Actipro CodeHighlighter (freeware)<br>
<a href="http://www.CodeHighlighter.com/" target="_blank">http://www.CodeHighlighter.com/</a><br>
<br>
--><span style="font-family: courier new,courier"><span style="font-size: x-small"><span style="font-size: small"><span style="font-family: times new roman,times"><span style="color: #000000">&lt;project</span> </span></span></span></span><span style="color: #000000"><span style="font-size: x-small; font-family: courier new,courier"><span style="font-size: small; font-family: times new roman,times">&gt;<br /></span></span></span><span style="font-family: courier new,courier"><span style="font-size: x-small"><span style="font-size: small"><span style="font-family: times new roman,times"><span style="color: #000000">&nbsp;&nbsp;&nbsp; ......<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;build&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ......<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;plugins&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;plugin&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;artifactId&gt;maven-war-plugin&lt;/artifactId&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;version&gt;</span> <span style="color: #000000">2.0.1</span> </span></span></span></span><span style="font-family: courier new,courier"><span style="font-size: x-small"><span style="font-size: small"><span style="font-family: times new roman,times"><span style="color: #000000">&lt;/version&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;configuration&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;webappDirectory&gt;target/${artifactId}&lt;/webappDirectory&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;warSourceDirectory&gt;src/webapp&lt;/warSourceDirectory&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/configuration&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/plugin&gt;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;plugin&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;groupId&gt;org.codehaus.mojo&lt;/groupId&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;artifactId&gt;jboss-maven-plugin&lt;/artifactId&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;version&gt;</span> <span style="color: #000000">1.3.1</span> </span></span></span></span><span style="font-family: courier new,courier"><span style="font-size: x-small"><span style="font-size: small"><span style="font-family: times new roman,times"><span style="color: #000000">&lt;/version&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;configuration&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;jbossHome&gt;E:/jboss-</span> <span style="color: #000000">4.0.2</span> </span></span></span></span><span style="font-family: courier new,courier"><span style="font-size: x-small"><span style="font-size: small"><span style="font-family: times new roman,times"><span style="color: #000000">&lt;/jbossHome&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;serverName&gt;default&lt;/serverName&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;fileName&gt;<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;${project.build.directory}/${project.build.finalName}.${project.packaging}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/fileName&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/configuration&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/plugin&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/plugins&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;/build&gt;<br />&lt;/project&gt;</span> </span></span></span></span></div><span style="font-size: x-small"><span style="font-size: x-small"><span style="font-family: courier new,courier"><span style="font-size: x-small"><span style="font-size: small"><span style="font-family: times new roman,times">可以看出不同之处就在于对maven-war-plguin及jboss-maven-plugin插件的配置与使用。<br />&nbsp;&nbsp;&nbsp; Maven使用maven-war-plugin插件对Web工程制作war文件。由于本文使用了定制目录结构，这样则会使maven-war-plugin无法找到Web工程的Web Root目录(默认是src/main/webapp)，所以需要对该插件进行适当地配置。&lt;warSourceDirectory&gt;就是Web工程的Web Root目录，此处设置为；&lt;webappDirectory&gt;是制作war文件之前，相当于是一个被打开(exploded)的war文件的根目录(默认是target/artifactId-version)。<br />&nbsp;&nbsp;&nbsp; 该工程的脚本中，还使用了一个JBoss插件。该插件可以将制作好的war文件部署(实质上是拷贝)到指定的JBoss部署目录中。&lt;jbossHome&gt;是JBoss的安装根目录，&lt;serverName&gt;指JBoss Server的名称，&lt;fileName&gt;是被部署war文件的名称。<br /><br /><span style="font-size: small"><strong>参考资源</strong></span><br />[1]Maven入门--概念与实例. http://www.blogjava.net/jiangshachina/archive/2006/09/01/67080.html<br />[2]Maven + Continuum Weed. http://www.blogjava.net/jiangshachina/archive/2006/09/11/68944.aspx<br />[3]Maven POM Reference. http://maven.apache.org/pom.html<br />[3]db4o. http://www.db4objects.com<br /><span style="font-size: small"><strong>本文实例下载地址--</strong></span></span></span></span></span><a href="http://www.blogjava.net/files/jiangshachina/mvn-demo.rar"><span style="font-family: courier new,courier"><span style="font-size: x-small"><span style="font-size: small"><span style="font-family: times new roman,times"><span style="font-size: small; color: #000080"><strong>http://www.blogjava.net/files/jiangshachina/mvn-demo.rar</strong></span><br /></span></span></span></span></a></span></span>
          <br/><br/>
          <span style="color:red;">
            <a href="http://sgwood.javaeye.com/blog/164107#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 22 Feb 2008 10:38:12 +0800</pubDate>
        <link>http://sgwood.javaeye.com/blog/164107</link>
        <guid>http://sgwood.javaeye.com/blog/164107</guid>
      </item>
          <item>
        <title>Maven入门--概念与实例 </title>
        <author>sgwood</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://sgwood.javaeye.com">sgwood</a>&nbsp;
                    链接：<a href="http://sgwood.javaeye.com/blog/164103" style="color:red;">http://sgwood.javaeye.com/blog/164103</a>&nbsp;
          发表时间: 2008年02月22日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <span style="font-size: x-small"><span style="font-size: small; font-family: times new roman,times"><span style="font-size: small; font-family: courier new,courier"><span style="font-size: small; font-family: times new roman,times">&nbsp;&nbsp;&nbsp; 本文虽然是Maven2的入门文章，但并不涉及Maven的历史、下载与安装，这些内容可以到Maven的官方网站上了解。本文主要是关注Maven中的重要概念，并以一个实例来阐述使用Maven的基本方法。<strong>文末有例子代码下载的链接</strong>。(2007.01.02最后更新)</span></span></span></span><span style="font-family: times new roman,times"><span style="font-size: small"><span style="font-family: courier new,courier"><span style="font-size: small"><span><span><span style="font-size: small"><span style="font-family: times new roman,times"><span style="font-size: small"> <br /></span><span style="font-size: 12pt; color: red">注：转载出处(<a href="http://www.blogjava.net/jiangshachina" style="color: red">http://www.blogjava.net/jiangshachina</a>)！</span><br /><br /></span></span></span></span></span></span></span></span><span style="font-size: small"><span style="font-family: times new roman,times"><span style="font-size: small"><span style="font-family: courier new,courier"><span style="font-size: small"><span><span><span style="font-size: small"><span style="font-family: times new roman,times"><strong>1 关键名词</strong> <br /></span></span></span></span></span></span></span></span></span><span style="font-family: times new roman,times"><span style="font-size: small"><span style="font-family: courier new,courier"><span style="font-size: small"><span><span><span style="font-size: small"><span style="font-family: times new roman,times"><span style="font-size: x-small">&nbsp;&nbsp;&nbsp; <strong>Project</strong>：任何您想build的事物，Maven都可以认为它们是工程。这些工程被定义为工程对象模型(POM，Poject Object Model)。一个工程可以依赖其它的工程；一个工程也可以由多个子工程构成。<br />&nbsp;&nbsp;&nbsp; <strong>POM</strong>：POM(pom.xml)是Maven的核心文件，它是指示Maven如何工作的元数据文件，类似于Ant中的build.xml文件。POM文件位于每个工程的根目录中。<br />&nbsp;&nbsp;&nbsp; <strong>GroupId</strong>：groupId是一个工程的在全局中唯一的标识符，一般地，它就是工程名。groupId有利于使用一个完全的包名，将一个工程从其它有类似名称的工程里区别出来。<br />&nbsp;&nbsp;&nbsp; <strong>Artifact</strong>：artifact是工程将要产生或需要使用的文件，它可以是jar文件，源文件，二进制文件，war文件，甚至是pom文件。每个artifact都由groupId和artifactId组合的标识符唯一识别。需要被使用(依赖)的artifact都要放在仓库(见Repository)中，否则Maven无法找到(识别)它们。<br />&nbsp;&nbsp;&nbsp; <strong>Dependency</strong>：为了能够build或运行，一个典型的Java工程会依赖其它的包。在Maven中，这些被依赖的包就被称为dependency。dependency一般是其它工程的artifact。<br />&nbsp;&nbsp;&nbsp; <strong>Plug-in</strong>：Maven是由插件组织的，它的每一个功能都是由插件提供的。插件提供goal(类似于Ant中的target)，并根据在POM中找到的元数据去完成工作。主要的Maven插件要是由Java写成的，但它也支持用Beanshell或Ant脚本写成的插件。<br />&nbsp;&nbsp;&nbsp; <strong>Repository</strong>：仓库用于存放artifact，它可以是本地仓库，也可以是远程仓库。Maven有一个默认的远程仓库--central，可以从<span style="color: #0000ff">http://www.ibiblio.org/maven2/</span>下载其中的artifact。在Windows平台上，本地仓库的默认地址是<span style="color: #0000ff"><em>User_Home</em>\.m2\repository</span>。<br />&nbsp;&nbsp;&nbsp; <strong>Snapshot</strong>：工程中可以(也应该)有一个特殊版本，它的版本号包括<em>SNAPSHOT</em>字样。该版本可以告诉Maven，该工程正处于开发阶段，会经常更新(但还未发布)。当其它工程使用此类型版本的artifact时，Maven会在仓库中寻找该artifact的最新版本，并自动下载、使用该最新版。<br /></span><strong><span style="font-size: small">2 Maven Build Life Cycle</span></strong><br /></span></span></span></span></span></span></span></span><span style="font-family: times new roman,times"><span style="font-size: small"><span style="font-family: courier new,courier"><span style="font-size: small"><span><span><span style="font-size: small"><span style="font-family: times new roman,times"><span style="font-size: x-small">&nbsp;&nbsp;&nbsp; 软件项目一般都有相似的开发过程：准备，编译，测试，打包和部署，Maven将上述过程称为Build Life Cycle。在Maven中，这些生命周期由一系列的短语组成，每个短语对应着一个(或多个)操作；或对应着一个(或多个)goal(类似于Ant中的target)。<br />&nbsp;&nbsp;&nbsp; 如编译源文件的命令<span style="color: #0000ff">mvn compile</span>中的compile是一个生命周期短语。同时该命令也可以等价于<span style="color: #0000ff">mvn compiler:compile</span>，其中的compiler是一个插件，它提供了compile(<strong>此compile与mvn compile中的compile意义不同</strong>)goal；compiler还可提供另一个goal--testCompile，该goal用于编译junit测试类。<br />&nbsp;&nbsp;&nbsp; 在执行某一个生命周期时，Maven会首先执行该生命周期之前的其它周期。如要执行compile，那么将首先执行validate，generate-source，process-source和generate-resources，最后再执行compile本身。<em>关于Maven中默认的生命周期短语，请见参考资源[6]中的附录B.3</em>。<br /></span><strong><span style="font-size: small">3 标准目录布局</span></strong><br /></span></span></span></span></span></span></span></span><span style="font-family: times new roman,times"><span style="font-size: small"><span style="font-family: courier new,courier"><span style="font-size: small"><span><span><span style="font-size: small"><span style="font-family: times new roman,times"><span style="font-size: x-small">&nbsp;&nbsp;&nbsp; Maven为工程中的源文件，资源文件，配置文件，生成的输出和文档都制定了一个标准的目录结构。Maven鼓励使用标准目录布局，这样就不需要进行额外的配置，而且有助于各个不同工程之间的联接。当然，Maven也允许定制个性的目录布局，这就需要进行更多的配置。<em>关于Maven的标准目录布局，请见参考资源[6]中的附录B.1</em>。<br /></span><strong><span style="font-size: small">4 Maven的优点</span></strong><br /></span></span></span></span></span></span></span></span><span style="font-family: times new roman,times"><span style="font-size: small"><span style="font-family: courier new,courier"><span style="font-size: small"><span><span><span style="font-size: small"><span style="font-family: times new roman,times"><span style="font-size: x-small">&nbsp;&nbsp;&nbsp; [1]build逻辑可以被重用。在Ant中可能需要多次重复地写相同的语句，但由于POM的继承性，可以复用其它的POM文件中的语句。这样既可以写出清晰的build语句，又可以构造出层次关系良好的build工程。<br />&nbsp;&nbsp;&nbsp; [2]不必关注build工作的实现细节。我们只需要使用一些build生命周期短语就可以达到我们的目标，而不必管Maven是如何做到这些的。如，只需要告诉Maven要安装(install)，那么它自然就会验证，编译，打包，及安装。<br />&nbsp;&nbsp;&nbsp; [3]Maven会自动加载工程依赖的artifact所依赖的其它artifact(Transitive Dependency)，而不用显示的将这些artifact全部写到dependency中。<br />&nbsp;&nbsp;&nbsp; [4]如果完全使用Maven的标准目录布局，那么可以极大地减少配置细节。<br /></span><strong><span style="font-size: small">5 实例</span></strong><br /></span></span></span></span></span></span></span></span><span style="font-size: x-small"><span style="font-family: times new roman,times"><span style="font-size: small"><span style="font-family: courier new,courier"><span style="font-size: small"><span><span><span style="font-size: small"><span style="font-family: times new roman,times"><strong>5.1 构想</strong><br />&nbsp;&nbsp;&nbsp; 由于只是阐述Maven的基本使用方法，所以本文将要设计的实例，只是一个简单的Maven demo。该实例包含两个工程：普通应用程序工程(app)和Web应用工程(webapp)。app工程提供一个简单的Java类；webapp工程只包含一个Servlet，并将使用app中的Java类。<br />&nbsp;&nbsp;&nbsp; 该Demo的目标是能够正确地将webapp制成war包，以供部署时使用。要能够正确制作war，自然首先就必须要能够正确的编译源代码，且要将App模块制成jar包。本文创建的工程所在的目录是<span style="color: #0000ff">D:\maven\demo</span>。<br /><strong>5.2 App工程</strong><br />&nbsp;&nbsp;&nbsp; 可以使用Maven的archetype插件来创建新工程，命令如下：<br />&nbsp;&nbsp;&nbsp; <span style="color: #0000ff">D:\maven\demo&gt;mvn archetype:create -DgroupId=ce.demo.mvn -DartifactId=app</span><br />该工程的groupId是ce.demo.mvn，那么该工程的源文件将放在Java包ce.demo.mvn中。artifactId是app，那么该工程根目录的名称将为app。<br />&nbsp;&nbsp;&nbsp; 当第一次执行该命令时，Maven会从central仓库中下载一些文件。这些文件包含插件archetype，以及它所依赖的其它包。该命令执行完毕后，在目录D:\maven\demo下会出现如下目录布局：<br /></span></span></span></span></span></span></span></span></span><div style="padding-right: 5px; padding-left: 4px; font-size: 13px; padding-bottom: 4px; width: 98%; padding-top: 4px; background-color: #eeeeee; border: #cccccc 1px solid"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br><a href="http://www.CodeHighlighter.com/" target="_blank">http://www.CodeHighlighter.com/</a><br><br>--><span style="color: #000000"><span style="font-size: small; font-family: times new roman,times"><span style="font-size: small; font-family: courier new,courier"><span style="font-size: small; font-family: times new roman,times">app<br />|--&nbsp;pom.xml<br />`--&nbsp;src<br />&nbsp;&nbsp;&nbsp;&nbsp;|--&nbsp;main<br />&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;`--&nbsp;java<br />&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`--&nbsp;ce<br />&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`--&nbsp;demo<br />&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`--&nbsp;mvn<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;App.java<br />&nbsp;&nbsp;&nbsp;&nbsp;`--&nbsp;test<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`--&nbsp;java<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`--&nbsp;ce<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`--&nbsp;demo<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`--&nbsp;mvn<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;AppTest.java</span></span></span></span></div><span style="font-size: small; font-family: times new roman,times"><span style="font-size: small; font-family: courier new,courier"><span style="font-size: small; font-family: times new roman,times">因本文暂时不涉及JUnit测试，故请将目录<span style="color: #0000ff">app\src\test</span>目录删除(不删除也没关系 ^_^)。然后再修改App.java文件，其完全内容如下：<br /></span></span></span><span style="color: #008000"><div style="padding-right: 5px; padding-left: 4px; font-size: 13px; padding-bottom: 4px; width: 98%; padding-top: 4px; background-color: #eeeeee; border: #cccccc 1px solid"><span style="font-family: times new roman,times"><span style="font-size: small"><span style="font-family: courier new,courier"><span style="font-size: small"><span><span><span style="font-size: small"><span style="font-family: times new roman,times"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" alt="" /><span style="color: #0000ff">package</span></span></span></span></span></span></span></span></span><span style="font-family: times new roman,times"><span style="font-size: small"><span style="font-family: courier new,courier"><span style="font-size: small"><span><span><span style="font-size: small"><span style="font-family: times new roman,times"><span style="color: #000000">&nbsp;ce.demo.mvn;<br /><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" id="Codehighlighter1_38_105_Open_Image" align="top" alt="" /><img src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" id="Codehighlighter1_38_105_Closed_Image" align="top" alt="" style="display: none" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;App&nbsp;</span><span style="display: none; background-color: #ffffff; border: #808080 1px solid"><img src="http://www.blogjava.net/Images/dot.gif" alt="" /></span></span></span></span></span></span></span></span></span><span><span style="font-family: times new roman,times"><span style="font-size: small"><span style="font-family: courier new,courier"><span style="font-size: small"><span><span><span style="font-size: small"><span style="font-family: times new roman,times"><span style="color: #000000">{<br /><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" id="Codehighlighter1_77_103_Open_Image" align="top" alt="" /><img src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" id="Codehighlighter1_77_103_Closed_Image" align="top" alt="" style="display: none" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;getStr(String&nbsp;str)&nbsp;</span><span style="display: none; background-color: #ffffff; border: #808080 1px solid"><img src="http://www.blogjava.net/Images/dot.gif" alt="" /></span></span></span></span></span></span></span></span></span><span><span style="font-family: times new roman,times"><span style="font-size: small"><span style="font-family: courier new,courier"><span style="font-size: small"><span><span><span style="font-size: small"><span style="font-family: times new roman,times"><span style="color: #000000">{<br /><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span></span></span></span></span></span></span></span></span><span style="color: #000000"><span style="font-size: small; font-family: times new roman,times"><span style="font-size: small; font-family: courier new,courier"><span style="font-size: small; font-family: times new roman,times">&nbsp;str;<br /><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></span></span></span><span style="color: #000000"><br /><span style="font-size: small; font-family: times new roman,times"><span style="font-size: small; font-family: courier new,courier"><span style="font-size: small; font-family: times new roman,times"><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" alt="" />}</span></span></span></span></span></div></span><span style="font-size: small; font-family: times new roman,times"><span style="font-size: small; font-family: courier new,courier"><span style="font-size: small; font-family: times new roman,times">其实，如果我们能够清楚地知道Maven的标准目录布局，就可以不使用archetype插件来创建工程原型；如果我们要定制个性的目录布局，那么就更没有必要使用archetype插件了。<br /><strong>5.3 WebApp工程</strong><br />&nbsp;&nbsp;&nbsp; 我们仍然如创建app工程一样使用archetype插件来创建webapp工程，命令如下：<br />&nbsp;&nbsp;&nbsp; <span style="color: #0000ff">D:\maven\demo&gt;mvn archetype:create -DgroupId=ce.demo.mvn -DartifactId=webapp -DarchetypeArtifactId=maven-archetype-webapp</span><br />&nbsp;&nbsp;&nbsp; 第一次运行此命令时，也会从central仓库中下载一些与Web应用相关的artifact(如javax.servlet)。此命令与创建app的命令的不同之处是，多设置了一个属性archetypeArtifacttId，该属性的值为maven-archetype-webapp。即告诉Maven，将要创建的工程是一个Web应用工程。创建app工程时没有使用该属性值，是由于archetype默认创建的是应用程序工程。同样的，执行完该命令之后，会出现如下标准目录布局：<br /></span></span></span><div style="padding-right: 5px; padding-left: 4px; font-size: 13px; padding-bottom: 4px; width: 98%; padding-top: 4px; background-color: #eeeeee; border: #cccccc 1px solid"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br><a href="http://www.CodeHighlighter.com/" target="_blank">http://www.CodeHighlighter.com/</a><br><br>--><span style="font-family: times new roman,times"><span style="font-size: small"><span style="font-family: courier new,courier"><span style="font-size: small"><span><span><span style="font-size: small"><span style="font-family: times new roman,times"><span style="color: #000000">webapp<br />|--&nbsp;pom.xml<br />`--&nbsp;src<br />&nbsp;&nbsp;&nbsp;&nbsp;`--&nbsp;main<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`--&nbsp;webapp<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000"><span style="font-size: x-small">|</span></span></span></span></span></span></span></span></span></span><span style="color: #000000"><span style="font-size: small; font-family: times new roman,times"><span style="font-size: small; font-family: courier new,courier"><span style="font-size: small; font-family: times new roman,times">--&nbsp;index.jsp<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |--&nbsp;WEB-INF<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; `--&nbsp;web.xml</span></span></span></span></div><span style="font-size: small; font-family: times new roman,times"><span style="font-size: small; font-family: courier new,courier"><span style="font-size: small; font-family: times new roman,times">&nbsp;&nbsp;&nbsp; 根据5.1节的构想，webapp工程将只包含一个Servlet，所以我们不需要index.jsp文件，请将其删除。此时大家可以发现，目前的目录布局中并没有放Servlet，即Java源文件的地方。根据参考资源[6]中的附录B.1，以及app工程中Java源文件的布局，可以知道Servlet（它仍然是一个Java类文件）仍然是放在<span style="color: #0000ff">webapp\src\main\java</span>目录中，请新建该目录。此处的Servlet是一个简单HelloServlet，其完整代码如下：<br /></span></span></span><div style="padding-right: 5px; padding-left: 4px; font-size: 13px; padding-bottom: 4px; width: 98%; padding-top: 4px; background-color: #eeeeee; border: #cccccc 1px solid"><span style="font-family: times new roman,times"><span style="font-size: small"><span style="font-family: courier new,courier"><span style="font-size: small"><span><span><span style="font-size: small"><span style="font-family: times new roman,times"><span style="color: #008000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" alt="" /></span><span style="color: #0000ff">package</span></span></span></span></span></span></span></span></span><span style="font-family: times new roman,times"><span style="font-size: small"><span style="font-family: courier new,courier"><span style="font-size: small"><span><span><span style="font-size: small"><span style="font-family: times new roman,times"><span style="color: #000000">&nbsp;hello;<br /><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" alt="" /><br /><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" alt="" /></span><span style="color: #0000ff">import</span></span></span></span></span></span></span></span></span><span style="font-family: times new roman,times"><span style="font-size: small"><span style="font-family: courier new,courier"><span style="font-size: small"><span><span><span style="font-size: small"><span style="font-family: times new roman,times"><span style="color: #000000">&nbsp;java.io.IOException;<br /><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" alt="" /></span><span style="color: #0000ff">import</span></span></span></span></span></span></span></span></span><span style="font-family: times new roman,times"><span style="font-size: small"><span style="font-family: courier new,courier"><span style="font-size: small"><span><span><span style="font-size: small"><span style="font-family: times new roman,times"><span style="color: #000000">&nbsp;java.io.PrintWriter;<br /><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" alt="" /></span><span style="color: #0000ff">import</span></span></span></span></span></span></span></span></span><span style="font-family: times new roman,times"><span style="font-size: small"><span style="font-family: courier new,courier"><span style="font-size: small"><span><span><span style="font-size: small"><span style="font-family: times new roman,times"><span style="color: #000000">&nbsp;javax.servlet.ServletException;<br /><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" alt="" /></span><span style="color: #0000ff">import</span></span></span></span></span></span></span></span></span><span style="font-family: times new roman,times"><span style="font-size: small"><span style="font-family: courier new,courier"><span style="font-size: small"><span><span><span style="font-size: small"><span style="font-family: times new roman,times"><span style="color: #000000">&nbsp;javax.servlet.http.HttpServlet;<br /><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" alt="" /></span><span style="color: #0000ff">import</span></span></span></span></span></span></span></span></span><span style="font-family: times new roman,times"><span style="font-size: small"><span style="font-family: courier new,courier"><span style="font-size: small"><span><span><span style="font-size: small"><span style="font-family: times new roman,times"><span style="color: #000000">&nbsp;javax.servlet.http.HttpServletRequest;<br /><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" alt="" /></span><span style="color: #0000ff">import</span></span></span></span></span></span></span></span></span><span style="font-family: times new roman,times"><span style="font-size: small"><span style="font-family: courier new,courier"><span style="font-size: small"><span><span><span style="font-size: small"><span style="font-family: times new roman,times"><span style="color: #000000">&nbsp;javax.servlet.http.HttpServletResponse;<br /><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" alt="" /><br /><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=