﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-Jerome Kwok-文章分类-Struts2</title><link>http://www.blogjava.net/JeromeKwok/category/34889.html</link><description>仁者不忧，知者不惑，勇者不惧</description><language>zh-cn</language><lastBuildDate>Tue, 07 Jul 2009 07:51:03 GMT</lastBuildDate><pubDate>Tue, 07 Jul 2009 07:51:03 GMT</pubDate><ttl>60</ttl><item><title>Struts2开发环境搭建----（转自JavaEye）</title><link>http://www.blogjava.net/JeromeKwok/articles/284539.html</link><dc:creator>Jerome Kwok</dc:creator><author>Jerome Kwok</author><pubDate>Mon, 29 Jun 2009 00:13:00 GMT</pubDate><guid>http://www.blogjava.net/JeromeKwok/articles/284539.html</guid><wfw:comment>http://www.blogjava.net/JeromeKwok/comments/284539.html</wfw:comment><comments>http://www.blogjava.net/JeromeKwok/articles/284539.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/JeromeKwok/comments/commentRss/284539.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/JeromeKwok/services/trackbacks/284539.html</trackback:ping><description><![CDATA[<span style="font-size: 10pt"><span style="font-family: Courier">&nbsp;&nbsp;&nbsp; 工欲善其事，必先利其器。在我们深入Struts2之前，我还是想废一些口舌来讲述一下开发环境的搭建。每个人都会根据自己的习惯来搭建自己的开发环境。开发环境是否便捷，也将直接影响开发的效率。所以对于开发环境已经非常熟悉的朋友可以直接忽略这篇文章。而我在这里给大家介绍一下我的开发和调试环境的搭建，之后所有的章节的代码，也都将建立在这个开发环境之上。 <br />
<br />
在编写J2EE程序的时候，我们往往需要一个Web容器进行调试，比较常见的Web容器是Tomcat，在Eclipse等IDE中，也有很多针对Tomcat的插件支持，使你可以很轻松地在Tomcat上调试你的J2EE应用。而我所使用的Web容器是更加轻量级的Jetty。利用它进行J2EE的开发和调试，甚至只需要依赖Jetty的jar包即可。<br />
</span></span>
<h4><span style="font-size: 10pt"><span style="font-family: Courier">目 录 </span></span><a title="隐藏/显示目录" onclick="$$('#wiki_menu ol')[0].toggle();return false;" href="http://www.javaeye.com/wiki/struts2/1321-struts2-development-environment-to-build#"><small><span style="font-size: 10pt"><span style="font-family: Courier">[ - ]</span></span></small></a></h4>
<ol>
    <li><a href="http://www.javaeye.com/wiki/struts2/1321-struts2-development-environment-to-build#1538"><span style="font-size: 10pt"><span style="font-family: Courier">搭建最简单的开发环境</span></span></a><span style="font-size: 10pt"><span style="font-family: Courier"> </span></span>
    <li><a href="http://www.javaeye.com/wiki/struts2/1321-struts2-development-environment-to-build#1539"><span style="font-size: 10pt"><span style="font-family: Courier">完善Library的管理方式</span></span></a><span style="font-size: 10pt"><span style="font-family: Courier"> </span></span></li>
</ol>
<p><span style="font-size: 10pt"><span style="font-family: Courier">&nbsp;</span></span></p>
<span style="font-size: 10pt"><span style="font-family: Courier">搭建最简单的开发环境<br />
</span></span>
<div class="content"><span style="font-size: 10pt"><span style="font-family: Courier">首先我们来看看如何搭建最简单的J2EE项目的开发环境。 <br />
<br />
<strong>1. 我们需要建立的一个空的J2EE项目的目录结构</strong> <br />
<br />
<img src="http://downpour.javaeye.com/upload/attachment/61763/09233f22-e160-3be6-9540-d1c89a5b9e09.gif"  alt="" /> <br />
<br />
在这里，我简单解释一下这些目录的作用： <br />
<br />
<strong>src(source folder)</strong>：存放所有的Java源代码。 <br />
<strong>conf(source folder)</strong>：存放所有的配置文件。 <br />
<strong>test(source folder)</strong>：存放所有的Java测试代码和调试代码。 <br />
<strong>web</strong>：web项目的根目录，下面有WEB-INF目录以及在此之下的classes和lib目录。classes目录将会成为所有的source folder的编译对象目录，而lib目录则存放项目所依赖的jar包。 <br />
<strong>lib</strong>：也存放jar包，这些jar包可能仅仅在开发调试时依赖，项目本身则不依赖这些jar文件。 <br />
<br />
<strong>2. 编写IDE相关的文件</strong> <br />
<br />
在这里，你还能看到classpath文件和project文件。这两个文件是导入到eclipse中所必须的文件，是我为eclipse工程而写的文件。如果你使用其他IDE，可能需要自行编辑与其他IDE相关的项目文件。 <br />
<br />
在建立了这些目录结构后，你就可以将其导入到eclipse中作为eclipse的工程了。 <br />
<br />
<img src="http://downpour.javaeye.com/upload/attachment/61765/b0380d6d-2634-3ba1-bd41-100be3f3be07.gif"  alt="" /> <br />
<br />
<strong>3. 加入相关调试所需要的jar包，并指定classpath</strong> <br />
<br />
接下来，我们把Jetty所需要的jar包copy到lib目录下，并在IDE中指定classpath。 <br />
<br />
<img class="magplus" title="点击查看原始大小图片" height="457" src="http://downpour.javaeye.com/upload/attachment/61767/2b527db3-298b-3dbe-9500-5deee6ed7548.gif" width="650"  alt="" /> <br />
<br />
<strong>4. 添加Jetty启动类</strong> <br />
<br />
在test下建一个runtime的目录，并添加Jetty启动类。 <br />
<br />
</span></span>
<div class="dp-highlighter"><span style="font-size: 10pt"><span style="font-family: Courier">Java代码&nbsp;</span></span>&nbsp;
<ol class="dp-j">
    <li><span><span style="font-size: 10pt"><span style="font-family: Courier"><span class="keyword">package</span><span>&nbsp;runtime; &nbsp;&nbsp;</span></span></span></span></li>
    <li><span><span style="font-size: 10pt"><span style="font-family: Courier">&nbsp;&nbsp;</span></span></span></li>
    <li><span style="font-size: 10pt"><span style="font-family: Courier"><span class="keyword">import</span><span>&nbsp;org.mortbay.jetty.Connector; &nbsp;&nbsp;</span></span></span></span></li>
    <li><span style="font-size: 10pt"><span style="font-family: Courier"><span class="keyword">import</span><span>&nbsp;org.mortbay.jetty.Server; &nbsp;&nbsp;</span></span></span></span></li>
    <li><span style="font-size: 10pt"><span style="font-family: Courier"><span class="keyword">import</span><span>&nbsp;org.mortbay.jetty.nio.SelectChannelConnector; &nbsp;&nbsp;</span></span></span></span></li>
    <li><span style="font-size: 10pt"><span style="font-family: Courier"><span class="keyword">import</span><span>&nbsp;org.mortbay.jetty.webapp.WebAppContext; &nbsp;&nbsp;</span></span></span></span></li>
    <li><span><span style="font-size: 10pt"><span style="font-family: Courier">&nbsp;&nbsp;</span></span></span></li>
    <li><span style="font-size: 10pt"><span style="font-family: Courier"><span class="comment">/** </span>&nbsp;</span></span></span></li>
    <li><span><span style="font-size: 10pt"><span style="font-family: Courier"><span class="comment">&nbsp;*&nbsp;Jetty&nbsp;Server&nbsp;starter.&nbsp;Use&nbsp;embedded&nbsp;mode. </span>&nbsp;</span></span></span></li>
    <li><span><span style="font-size: 10pt"><span style="font-family: Courier"><span class="comment">&nbsp;*&nbsp; </span>&nbsp;</span></span></span></li>
    <li><span><span style="font-size: 10pt"><span style="font-family: Courier"><span class="comment">&nbsp;*&nbsp;@author&nbsp;Downpour </span>&nbsp;</span></span></span></li>
    <li><span><span style="font-size: 10pt"><span style="font-family: Courier"><span class="comment">&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></span></span></li>
    <li><span style="font-size: 10pt"><span style="font-family: Courier"><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;JettyStarter&nbsp;{ &nbsp;&nbsp;</span></span></span></span></li>
    <li><span><span style="font-size: 10pt"><span style="font-family: Courier">&nbsp;&nbsp;</span></span></span></li>
    <li><span style="font-size: 10pt"><span style="font-family: Courier"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">/** </span>&nbsp;</span></span></span></li>
    <li><span><span style="font-size: 10pt"><span style="font-family: Courier"><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;args </span>&nbsp;</span></span></span></li>
    <li><span><span style="font-size: 10pt"><span style="font-family: Courier"><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@throws&nbsp;Exception </span>&nbsp;</span></span></span></li>
    <li><span><span style="font-size: 10pt"><span style="font-family: Courier"><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></span></span></li>
    <li><span style="font-size: 10pt"><span style="font-family: Courier"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;main(String[]&nbsp;args)&nbsp;</span><span class="keyword">throws</span><span>&nbsp;Exception&nbsp;{ &nbsp;&nbsp;</span></span></span></span></li>
    <li><span style="font-size: 10pt"><span style="font-family: Courier"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">long</span><span>&nbsp;begin&nbsp;=&nbsp;System.currentTimeMillis(); &nbsp;&nbsp;</span></span></span></span></li>
    <li><span style="font-size: 10pt"><span style="font-family: Courier"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Connector&nbsp;connector&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;SelectChannelConnector(); &nbsp;&nbsp;</span></span></span></span></li>
    <li><span style="font-size: 10pt"><span style="font-family: Courier"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;connector.setPort(Integer.getInteger(</span><span class="string">"jetty.port"</span><span>,&nbsp;</span><span class="number">8080</span><span>).intValue()); &nbsp;&nbsp;</span></span></span></span></li>
    <li><span><span style="font-size: 10pt"><span style="font-family: Courier">&nbsp;&nbsp;</span></span></span></li>
    <li><span style="font-size: 10pt"><span style="font-family: Courier"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WebAppContext&nbsp;webapp&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;WebAppContext(</span><span class="string">"web"</span><span>,&nbsp;</span><span class="string">"/struts-sample"</span><span>); &nbsp;&nbsp;</span></span></span></span></li>
    <li><span style="font-size: 10pt"><span style="font-family: Courier"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;webapp.setDefaultsDescriptor(</span><span class="string">"./test/runtime/webdefault.xml"</span><span>); &nbsp;&nbsp;</span></span></span></span></li>
    <li><span><span style="font-size: 10pt"><span style="font-family: Courier">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></span></span></li>
    <li><span style="font-size: 10pt"><span style="font-family: Courier"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Server&nbsp;server&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;Server(); &nbsp;&nbsp;</span></span></span></span></li>
    <li><span style="font-size: 10pt"><span style="font-family: Courier"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;server.setConnectors(</span><span class="keyword">new</span><span>&nbsp;Connector[]&nbsp;{&nbsp;connector&nbsp;}); &nbsp;&nbsp;</span></span></span></span></li>
    <li><span><span style="font-size: 10pt"><span style="font-family: Courier">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;server.setHandler(webapp); &nbsp;&nbsp;</span></span></span></li>
    <li><span><span style="font-size: 10pt"><span style="font-family: Courier">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;server.start(); &nbsp;&nbsp;</span></span></span></li>
    <li><span style="font-size: 10pt"><span style="font-family: Courier"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span class="string">"Jetty&nbsp;Server&nbsp;started,&nbsp;use&nbsp;"</span><span>&nbsp;+&nbsp;(System.currentTimeMillis()&nbsp;-&nbsp;begin)&nbsp;+&nbsp;</span><span class="string">"&nbsp;ms"</span><span>); &nbsp;&nbsp;</span></span></span></span></li>
    <li><span><span style="font-size: 10pt"><span style="font-family: Courier">&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></span></span></li>
    <li><span><span style="font-size: 10pt"><span style="font-family: Courier">}&nbsp;&nbsp;</span></span></span></li>
</ol>
</div>
<pre class="java" style="display: none" name="code">&nbsp;</pre>
<span style="font-size: 10pt"><span style="font-family: Courier">如果此时，你在WEB-INF下有web.xml，那么你就可以执行上面这个Jetty的启动类。 <br />
<br />
<img class="magplus" title="点击查看原始大小图片" style="width: 788px; height: 442px" height="442" src="http://downpour.javaeye.com/upload/attachment/61769/2776a3d4-3879-3676-8518-56f022fbce41.gif" width="788"  alt="" /> <br />
<br />
<strong>5. 启动、调试、测试</strong> <br />
<br />
执行了Jetty的启动类后，可以看到启动界面的日志<br />
<br />
<br />
<span style="font-size: 10pt"><span style="font-family: Courier">Java代码</span></span></span></span>
<div class="dp-highlighter">
<ol class="dp-j">
    <li><span><span style="font-size: 10pt"><span style="font-family: Courier"><span class="number">15</span><span>&nbsp;[main]&nbsp;INFO&nbsp;org.mortbay.log&nbsp;-&nbsp;Logging&nbsp;to&nbsp;org.slf4j.impl.SimpleLogger(org.mortbay.log)&nbsp;via&nbsp;org.mortbay.log.Slf4jLog &nbsp;&nbsp;</span></span></span></span></li>
    <li><span style="font-size: 10pt"><span style="font-family: Courier"><span class="number">15</span><span>&nbsp;[main]&nbsp;INFO&nbsp;org.mortbay.log&nbsp;-&nbsp;jetty-</span><span class="number">6.1</span><span>.</span><span class="number">7</span><span>&nbsp;&nbsp;</span></span></span></span></li>
    <li><span style="font-size: 10pt"><span style="font-family: Courier"><span class="number">1109</span><span>&nbsp;[main]&nbsp;INFO&nbsp;org.mortbay.log&nbsp;-&nbsp;Started&nbsp;SelectChannelConnector</span><span class="annotation">@0</span><span>.0.</span><span class="number">0.0</span><span>:</span><span class="number">8080</span><span>&nbsp;&nbsp;</span></span></span></span></li>
    <li><span style="font-size: 10pt"><span style="font-family: Courier"><span>Jetty&nbsp;Server&nbsp;started,&nbsp;use&nbsp;</span><span class="number">1547</span><span>&nbsp;ms&nbsp;&nbsp;</span></span></span></span></li>
</ol>
</div>
<pre class="java" style="display: none" name="code">&nbsp;</pre>
<span style="font-size: 10pt"><span style="font-family: Courier">这表示你已经成功启动了Jetty作为你的Web服务器。当然，你可以使用Debug模式来执行Jetty类，这样就进入了调试模式，你可以在代码中设置断点进行调试。 <br />
<br />
在这里，还有一点需要简单提一下，默认情况下，Jetty会在windows上使用缓存，所以会把js，css等文件进行锁定，使你无法编辑。为了解决这个问题，需要设置一些默认参数。这里，我们可以使用google大法，已经有朋友为我们解决了这个问题： <br />
<br />
</span></span><a href="http://www.blogjava.net/alwayscy/archive/2007/05/27/120305.html" target="_blank"><span style="font-size: 10pt"><span style="font-family: Courier">http://www.blogjava.net/alwayscy/archive/2007/05/27/120305.html</span></span></a><span style="font-size: 10pt"><span style="font-family: Courier"> <br />
<br />
所以，我在runtime的同级目录建立了一个webdefault.xml文件，并且指定Jetty使用该文件作为默认的参数设定。 <br />
<br />
<strong>【小结】</strong> <br />
在上面我介绍了我个人的开发调试环境，这种开发环境的好处可能有一下这些： <br />
<br />
1. 开发环境不依赖于任何IDE或者相关的插件，只需要运行Java文件即可进行调试。（当然，你可能需要编写IDE相关的project文件来获取IDE的工程支持） <br />
<br />
2. 开发环境不依赖于任何外部的Web服务器，与环境无关，所以无论将项目迁移到哪里，都可以直接运行。 <br />
<br />
3. 不需要开发人员额外学习如何搭建开发环境，开发环境已经内置，降低了开发人员的学习成本。 </span></span></div>
<h2><span style="font-size: 10pt"><span style="font-family: Courier">完善Library的管理方式 </span></span><a href="http://www.javaeye.com/wiki/struts2/1321-struts2-development-environment-to-build#top" name="1539"><span style="font-size: 10pt"><span style="font-family: Courier"><img alt="Top" src="http://www.javaeye.com/images/wiki/top.gif?1229402183" /></span></span></a><span style="font-size: 10pt"><span style="font-family: Courier"> </span></span></h2>
<div class="content"><span style="font-size: 10pt"><span style="font-family: Courier">在上面搭建环境的过程中，我们发现，Library的管理存在着一定问题。这个问题主要表现为： <br />
<br />
1. 不容易做Library的版本管理。如果Library的版本需要升级，那么我们不得不重新copy一份新的jar包，并且借助IDE重新指定项目的classpath。这种劳动，对于一个项目还可以接受，如果你有10多个项目，那么jar包的复制工作会让你很头疼。 <br />
<br />
2. 每个项目都会有Library的副本。这一点让人非常恼火。实际上，对于一个公司或者一个项目组而言，使用的技术体系基本不变。然而，每个项目的Library却是分开的。不仅如此，每个项目都要从svn中下载大量的相同的Library文件，给我们的硬盘造成极大的空间浪费。对于那些频繁使用Branch的项目来说，这些Library的下载简直就是噩梦。 <br />
<br />
所以，我们需要一个<strong>集中式的Library管理方式</strong>。而这一点曾经在Javaeye的海阔天空版激烈得讨论过使用maven来进行管理还是自行管理。 <br />
<br />
</span></span>
<div class="quote_title"><span style="font-size: 10pt"><span style="font-family: Courier">Readonly 写道</span></span></div>
<div class="quote_div"><br />
<span style="font-size: 10pt"><span style="font-family: Courier">共享类库可以用IDE reference project解决，公司内部项目给常用的lib建立一个project，从CVS上check out，其他工程项目都依赖这个project就可以了，ant build也直接引用这个项目的jar就可以，项目体积照样只有几百K。 <br />
<br />
——一个讨厌ant，更加讨厌maven的人 <br />
</span></span></div>
<br />
<br />
<span style="font-size: 10pt"><span style="font-family: Courier">我比较赞同Readonly老大的说法而倾向于自行管理。maven这样的高级货，偶实在是用不来啊。那么我们就来看看如何使用共享类库来进行Library管理。 <br />
<br />
</span></span><strong><br />
<span style="font-size: 10pt"><span style="font-family: Courier">1. 首先建立一个共享类库</span></span></strong><span style="font-size: 10pt"><span style="font-family: Courier"> <br />
<br />
建立一个共享类库，将项目中需要共享的Library进行恰当的分类。同时，为每个加入到Library中的jar包进行统一的格式化的命名方式。例如：spring/spring-2.5.5.jar等等。这样的好处在于，一旦jar包的版本有更新，可以加入新的jar包而保留原来的。在项目中，就可以通过引用不同版本的jar包来对Library进行版本管理。 <br />
<br />
以下就是我个人建立的一个共享类库，大家可以参考： <br />
<br />
</span></span><a href="svn://www.demo2do.com/library" target="_blank"><span style="font-size: 10pt"><span style="font-family: Courier">svn://www.demo2do.com/library</span></span></a><span style="font-size: 10pt"><span style="font-family: Courier"> <br />
<br />
<strong>2. checkout共享类库，并将其导入到IDE中作为一个Library工程</strong> <br />
<br />
<img src="http://downpour.javaeye.com/upload/attachment/61771/8cea5d64-2499-3e66-9154-88b740a47381.gif"  alt="" /> <br />
<br />
<strong>3. 为你的项目指定classpath，引用的jar包存在于Library工程中</strong> <br />
<br />
<img src="http://downpour.javaeye.com/upload/attachment/61775/2f7f3e8e-2450-3d5f-a2e9-84dff03c11f8.gif"  alt="" /> <br />
<br />
在这里，我们可以看到，原来项目中的lib目录被删除，jar包也被删除。在项目中所引用的jar包是Library项目中的jar包。 <br />
<br />
<strong>【小结】</strong> <br />
完成了上述所有的步骤之后，Library就被集中管理起来，而每个项目也不会再变得那么庞大。当然，开发环境的搭建完全取决于个人的习惯，所以使用各自喜欢的方式吧，不要让环境问题束缚你们的手脚。</span></span></div>
<img src ="http://www.blogjava.net/JeromeKwok/aggbug/284539.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/JeromeKwok/" target="_blank">Jerome Kwok</a> 2009-06-29 08:13 <a href="http://www.blogjava.net/JeromeKwok/articles/284539.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>