阅读:153855次   评论:103条   更新时间:2011-06-01    
工欲善其事,必先利其器。在我们深入Struts2之前,我还是想废一些口舌来讲述一下开发环境的搭建。每个人都会根据自己的习惯来搭建自己的开发环境。开发环境是否便捷,也将直接影响开发的效率。所以对于开发环境已经非常熟悉的朋友可以直接忽略这篇文章。而我在这里给大家介绍一下我的开发和调试环境的搭建,之后所有的章节的代码,也都将建立在这个开发环境之上。

在编写J2EE程序的时候,我们往往需要一个Web容器进行调试,比较常见的Web容器是Tomcat,在Eclipse等IDE中,也有很多针对Tomcat的插件支持,使你可以很轻松地在Tomcat上调试你的J2EE应用。而我所使用的Web容器是更加轻量级的Jetty。利用它进行J2EE的开发和调试,甚至只需要依赖Jetty的jar包即可。

搭建最简单的开发环境 Top

首先我们来看看如何搭建最简单的J2EE项目的开发环境。

1. 我们需要建立的一个空的J2EE项目的目录结构



在这里,我简单解释一下这些目录的作用:

src(source folder):存放所有的Java源代码。
conf(source folder):存放所有的配置文件。
test(source folder):存放所有的Java测试代码和调试代码。
web:web项目的根目录,下面有WEB-INF目录以及在此之下的classes和lib目录。classes目录将会成为所有的source folder的编译对象目录,而lib目录则存放项目所依赖的jar包。
lib:也存放jar包,这些jar包可能仅仅在开发调试时依赖,项目本身则不依赖这些jar文件。

2. 编写IDE相关的文件

在这里,你还能看到classpath文件和project文件。这两个文件是导入到eclipse中所必须的文件,是我为eclipse工程而写的文件。如果你使用其他IDE,可能需要自行编辑与其他IDE相关的项目文件。

在建立了这些目录结构后,你就可以将其导入到eclipse中作为eclipse的工程了。



3. 加入相关调试所需要的jar包,并指定classpath

接下来,我们把Jetty所需要的jar包copy到lib目录下,并在IDE中指定classpath。



4. 添加Jetty启动类

在test下建一个runtime的目录,并添加Jetty启动类。

package runtime;

import org.mortbay.jetty.Connector;
import org.mortbay.jetty.Server;
import org.mortbay.jetty.nio.SelectChannelConnector;
import org.mortbay.jetty.webapp.WebAppContext;

/**
 * Jetty Server starter. Use embedded mode.
 * 
 * @author Downpour
 */
public class JettyStarter {

	/**
	 * @param args
	 * @throws Exception
	 */
	public static void main(String[] args) throws Exception {
		long begin = System.currentTimeMillis();
		Connector connector = new SelectChannelConnector();
		connector.setPort(Integer.getInteger("jetty.port", 8080).intValue());

		WebAppContext webapp = new WebAppContext("web", "/struts-sample");
		webapp.setDefaultsDescriptor("./test/runtime/webdefault.xml");
		
		Server server = new Server();
		server.setConnectors(new Connector[] { connector });
		server.setHandler(webapp);
		server.start();
		System.out.println("Jetty Server started, use " + (System.currentTimeMillis() - begin) + " ms");
	}
}


如果此时,你在WEB-INF下有web.xml,那么你就可以执行上面这个Jetty的启动类。



5. 启动、调试、测试

执行了Jetty的启动类后,可以看到启动界面的日志:

15 [main] INFO org.mortbay.log - Logging to org.slf4j.impl.SimpleLogger(org.mortbay.log) via org.mortbay.log.Slf4jLog
15 [main] INFO org.mortbay.log - jetty-6.1.7
1109 [main] INFO org.mortbay.log - Started SelectChannelConnector@0.0.0.0:8080
Jetty Server started, use 1547 ms


这表示你已经成功启动了Jetty作为你的Web服务器。当然,你可以使用Debug模式来执行Jetty类,这样就进入了调试模式,你可以在代码中设置断点进行调试。

在这里,还有一点需要简单提一下,默认情况下,Jetty会在windows上使用缓存,所以会把js,css等文件进行锁定,使你无法编辑。为了解决这个问题,需要设置一些默认参数。这里,我们可以使用google大法,已经有朋友为我们解决了这个问题:

http://www.blogjava.net/alwayscy/archive/2007/05/27/120305.html

所以,我在runtime的同级目录建立了一个webdefault.xml文件,并且指定Jetty使用该文件作为默认的参数设定。

【小结】
在上面我介绍了我个人的开发调试环境,这种开发环境的好处可能有一下这些:

1. 开发环境不依赖于任何IDE或者相关的插件,只需要运行Java文件即可进行调试。(当然,你可能需要编写IDE相关的project文件来获取IDE的工程支持)

2. 开发环境不依赖于任何外部的Web服务器,与环境无关,所以无论将项目迁移到哪里,都可以直接运行。

3. 不需要开发人员额外学习如何搭建开发环境,开发环境已经内置,降低了开发人员的学习成本。

完善Library的管理方式 Top

在上面搭建环境的过程中,我们发现,Library的管理存在着一定问题。这个问题主要表现为:

1. 不容易做Library的版本管理。如果Library的版本需要升级,那么我们不得不重新copy一份新的jar包,并且借助IDE重新指定项目的classpath。这种劳动,对于一个项目还可以接受,如果你有10多个项目,那么jar包的复制工作会让你很头疼。

2. 每个项目都会有Library的副本。这一点让人非常恼火。实际上,对于一个公司或者一个项目组而言,使用的技术体系基本不变。然而,每个项目的Library却是分开的。不仅如此,每个项目都要从svn中下载大量的相同的Library文件,给我们的硬盘造成极大的空间浪费。对于那些频繁使用Branch的项目来说,这些Library的下载简直就是噩梦。

所以,我们需要一个集中式的Library管理方式。而这一点曾经在Javaeye的海阔天空版激烈得讨论过使用maven来进行管理还是自行管理。

Readonly 写道

共享类库可以用IDE reference project解决,公司内部项目给常用的lib建立一个project,从CVS上check out,其他工程项目都依赖这个project就可以了,ant build也直接引用这个项目的jar就可以,项目体积照样只有几百K。

——一个讨厌ant,更加讨厌maven的人


我比较赞同Readonly老大的说法而倾向于自行管理。maven这样的高级货,偶实在是用不来啊。那么我们就来看看如何使用共享类库来进行Library管理。


1. 首先建立一个共享类库


建立一个共享类库,将项目中需要共享的Library进行恰当的分类。同时,为每个加入到Library中的jar包进行统一的格式化的命名方式。例如:spring/spring-2.5.5.jar等等。这样的好处在于,一旦jar包的版本有更新,可以加入新的jar包而保留原来的。在项目中,就可以通过引用不同版本的jar包来对Library进行版本管理。

以下就是我个人建立的一个共享类库,大家可以参考:

svn://www.demo2do.com/library

2. checkout共享类库,并将其导入到IDE中作为一个Library工程



3. 为你的项目指定classpath,引用的jar包存在于Library工程中



在这里,我们可以看到,原来项目中的lib目录被删除,jar包也被删除。在项目中所引用的jar包是Library项目中的jar包。

【小结】
完成了上述所有的步骤之后,Library就被集中管理起来,而每个项目也不会再变得那么庞大。当然,开发环境的搭建完全取决于个人的习惯,所以使用各自喜欢的方式吧,不要让环境问题束缚你们的手脚。
评论 共 103 条 请登录后发表评论
103 楼 rthfdh 2013-03-22 09:10
楼主啊!svn地址连不上啊!
102 楼 zyengogo 2011-12-22 16:57
jetty还没得用过喃
101 楼 codeone 2011-11-17 10:01
请教楼主一个问题,我用的是jetty6.1.21,但是使用零配置的struts2的时候,导致struts2.xml加载了两遍,项目启动不起来,不知道楼主遇到过这个问题没有
100 楼 ytsmtxxi 2011-08-18 09:16
maven好。
99 楼 ppboyhai 2011-07-19 11:14
真的 很乱
98 楼 downpour 2011-06-09 16:03
liu.anxin 写道
使用 Jetty 绝对不是败笔! 但是, 为什么不用 Maven ?

以后会往maven上迁移,以前对maven的理解有偏颇。
97 楼 liu.anxin 2011-06-09 15:56
使用 Jetty 绝对不是败笔! 但是, 为什么不用 Maven ?
96 楼 kaminlee 2011-05-20 16:10

楼主的办法是好办法,管理JAR来是不错的,当项目越来越多JAR包时,JAR包管理是一个问题了,JAR包互相之间的依赖关系。
95 楼 yin_bp 2011-05-04 11:52
复杂啊,看看bbossgroups中的mvc框架环境搭建方法吧,非常简单,有兴趣的朋友可以试一下:
《搭建自己的bbossmvc eclipse开发工程,编写第一个实例》
http://yin-bp.iteye.com/admin/blogs/1026261
94 楼 沈冠军 2011-05-01 17:05
不是很懂,没有用过jetty,所以感觉有点抽象了,可能是自己的水平有限吧
93 楼 馨木头 2011-04-01 19:48
非常感谢这样的总结性文章,学习了。
92 楼 laibin1320 2011-03-17 17:16
Library管理也是有问题的,每次搭建开发环境时,都要寻找并导入依赖的jar包,如果有几十个jar包时,真是太浪费时间了!
91 楼 zweichxu 2011-03-06 16:26
这个,单纯搭建struts2的开发环境,有那么复杂吗?新建一个web工程,引入struts2的依赖包就行了。
单纯搭建环境的话,看看struts2网站提供的开发指导就行了。
90 楼 qrg 2011-02-28 23:31
不明白为什么楼主非要用MyEclipse........尽管可以破解。
89 楼 xiexiaolong 2011-01-07 15:51
Jetty小巧方便,Library管理值得借鉴!
88 楼 yangchaoem 2010-12-20 16:39
87 楼 油炸大龙虾 2010-11-10 23:22
1 引入jetty绝对不是败笔。项目是分环境的,dev/ut/sit/uat/prod,jetty的用处太大了!dev/sit都要用。强烈建议“baibi”的人看看junit in action的Containering testing。
2 java世界配置的复杂度,到了maven,真是达到了“精华”;不用ide插件写maven的人会吐吧。lib怎么管理,依赖关系,看作浮云是可以的,毕竟经验在那里;但是那个配置文件不是人写的。我build写吐了,最近一直坚持用Gant,写起来有点爽。但是:我坚决沾都不沾gmaven。
3 坚决不用IDE,有gant/gradle + sublime text,足够了。我喜欢用上网本折腾jee。
4 强烈建议看看Gradle。
5 S1/S2,特别是s2-validation直接让人吐,还是Groovlet好,甚至可以玩出PHP的风格(当然,markupbuilder的php风格)。

支持ant-ivy……
86 楼 shijianfeng 2010-11-08 10:37
jerry 写道
引入 Jetty 是败笔

85 楼 crisdy 2010-10-09 09:30
xici_magic 写道
太乱了 新手看的话也许会看不明白。

84 楼 xhalg 2010-08-24 10:50
觉得写得太粗糙了
83 楼 litaisheng001 2010-08-16 15:59
还没用过这个jetty做web服务器哈。需要提高。
82 楼 lz958942 2010-08-10 09:28
这是Jetty环境搭建吧?
81 楼 hongliyujing1988 2010-08-08 10:51
1.一个是maven管理,一个自行管理,看清本质之后,其实是一样的!
方便之处有,依赖的增加也未必是好事!
2.开发环境的搭配对于个每个开发者来说都可以自创,但在一个团队来说,应该统一!
不排除你的环境搭配得简单,好用!
3.如果这贴是教初学者的话,应该更加详细一些,谢谢!
80 楼 zhenglongfei 2010-07-30 08:56
大哥我新手、、照顾下,有点染!!
79 楼 zhouqiugang 2010-06-08 13:12
楼主 你好
我按照你写的JettyStarter 也写了个Class但是输出的是
2010-06-08 13:15:35.191::INFO:  Logging to STDERR via org.mortbay.log.StdErrLog
Jetty Server started, use 25301ms
好像和你的不同啊。
还有webdefault.xml 这个里面应该写什么呢?
谢谢!
78 楼 zxp8216 2010-06-07 10:25
云里雾里啊,不好懂
77 楼 zyh_1986 2010-05-03 10:34
新手看不太懂,有点迷糊
76 楼 albertbb 2010-04-08 22:29
我新手.
到现在还只会搭建S1.2(2.0残疾版)S2.0H3.1.
写的太深了新手看不太明白.
我建议先出一个简单的框架的搭建和简易的入门步骤.
(就是一步一步的如何搭建.虽然很傻瓜.但是对于新手来说却很实用)
然后一点一点深入.
一开始就深入看那些内部代码觉得很迷糊.
75 楼 刘新华 2010-01-28 14:57
谢谢了!收藏!
74 楼 foreverke01 2010-01-24 20:15
其实没怎么看明白!

发表评论

您还没有登录,请您登录后再发表评论

文章信息

  • downpour在2008-12-22创建
  • downpour在2011-06-01更新
  • 标签: struts2 开发环境
Global site tag (gtag.js) - Google Analytics