2007-11-19

用 GlassFish v2 替换 Tomcat 5.x

关键字: glassfish

用 GlassFish v2 替换 Tomcat 5.x

1. 背景

 

用了很多年的Tomcat, 无论开发环境还是生产环境, 应该说, 大家对它还是基本满意的.
不过, 也不是一点问题没有. 从开发人员的角度来说, Tomcat主要的缺点就是较弱的热部署
(hot deploy)能力. 修改一个Java类, 保存后, Tomcat会重新加载这个类, 但不久就要重
新启动Tomcat才能继续开发. 在企业关键应用的场景下, 若发生急迫的程序缺陷更正, 让众多的用户停止手头的工作, 等待服务器重新启动, 显然十分不便.

 

类似RubyOnRails的技术框架, 其方便之处就是脚本语言不要编译, 保存后直接可以使用.
Java社区显然看到了这个问题, GlassFish v2 的热部署能力就是其主要的一个受大家欢迎的
特性. 这也是我们要用 GlassFish v2 替换 Tomcat 5.x 的主要理由.

 

2. 使用环境

 

本文假设你使用下面所述的开发环境.
(1) JDK 1.5 或 1.6
(2) Eclipse IDE for Java EE Developers (3.3.1.1 M20071023-1652)
(3) 使用 com.sysdeo.eclipse.tomcat_3.2.1 插件

 

如果你没有使用 Eclipse 3.3.1.1 Java EE 版本, 而是正在使用其他版本, 也不影响本文所述的所有操作和效果, 只是不能借助Eclipse 启动和停止 GlassFish v2, 只能自己通过命令行进行操作.

 

有关用 Eclipse 3.3.1.1 Java EE 版本操作 GlassFish v2 的详细说明, 请参见 Eclipse 3.3 and GlassFish Java EE 5 integration.

 

3. 下载并安装 GlassFish v2

 

这方面的资料已经很容易从网上找到, 比较好的文章如下:
(1) 在Glassfish上部署web应用
(2) Glassfish初试
(3) 从tomcat到glashfish(glassfish的安装启动笔记)

 

4. 创建 Tomcat 项目

 

相信你一定也知道如何创建 Tomcat 项目. 本文假设你创建的 Tomcat 项目:
(1) 位于 D:/Sample 目录.
(2) Context name 为 Sample.

 

其他采用默认设置.

 

5. 为测试 GlassFish v2 的热部署能力, 创建首页JSP和Servlet Java类.

 

第1步: 在根目录中创建 index.jsp 文件

 

第2步: 在 WEB-INF\src 中, 创建一个简单的 servlet 类 SampleServlet.java,

 

第3步: 配置web.xml文件.

 

完整的Sample项目, 请参见附件.

 

6. 什么是 GlassFish v2 的目录部署?

 

用Tomcat开发时, JSP/HTML/JS/CSS 等文件, 都是修改后保存, 刷新浏览器就可以使用.
为了使 GlassFish v2 达到同样的效果, 需要使用其目录部署(directory deployment)特性.

这个特性不太容易找, 因为使用象GlassFish这样的全功能应用服务器的开发人员,习惯了
"编辑、编译、部署、运行"这样的步骤. 一开始, 我按照
Eclipse 3.3 and GlassFish Java EE 5 integration.
一文的指引, 发现修改JSP文件后,仍然要经历上面的部署过程. 虽然Eclipse会通过自动检测
文件版本的变化, 触发Ant任务实现部署, 但仍然很浪费时间. 我们需要找到跳过"部署"的方法.
在GlassFish官方论坛上发了几个帖子, 答复者的回帖没有起到什么作用, 但通过搜索论坛基本
知道这个问题已经得到了解决.

 

下面的文章引导我朝着正确的方向前进了一大步(非常感谢该文作者):
GlassFish Auto Deployment and Hot Deployment

 

关于目录部署的详细说明,参见:
Sun Java System Application Server Platform Edition 9.0 Application Deployment Guide
Chapter 1 中 Deployment for Development 一节

 

7. GlassFish v2 的目录部署实战

 

第1步: 启动 GlassFish v2.

 

第2步: 部署 Sample 项目到 GlassFish v2, DOS窗口下执行命令:

GLASS_FISH_HOME/bin/asadmin deploydir D:/Sample
 

其中 GLASS_FISH_HOME 是 GlassFish 的安装目录, 命令执行完毕后,可以看到成功部署信息.

 

第3步: 打开浏览器, 输入http://localhost:8080/Sample/index.jsp, 看到页面内容.

 

第4步: 打开浏览器, 输入 http://localhost:8080/Sample/servlet/Sample, 看到页面内容.

 

8. 体验 GlassFish v2 的热部署特性

 

第1步: 修改 index.jsp 文件内容, 保存后, 刷新浏览器, 你就能马上看到新的内容.
( http://localhost:8080/Sample/index.jsp)

 

第2步: 修改 SampleServlet.java, 保存后, 等待片刻, Eclipse 已经自动编译这个类, 但 GlassFish v2 控制台中没有任何提示, 刷新浏览器, 看不到新的内容.
( http://localhost:8080/Sample/servlet/Sample)

 

第3步: 现在, 在 Sample 项目根目录中创建文件名为".reload"的文件(内容为空).

 

第4步: 观察GlassFish v2 控制台, 可以看到重新加载信息,刷新浏览器


(http://localhost:8080/Sample/servlet/Sample)

到了新的内容.

 

第5步: 再次修改 SampleServlet.java 的内容, 保存后, 遇到和第2步同样的问题.

 

第6步: 再次打开 .reload 文件, 输入任意内容, 然后保存.

 

第7步: 再次出现与第4步同样的效果.

 

总结上述操作, GlassFish v2 对于非Java类的加载, 达到了和Tomcat同样的效果, 但Java类的
加载, 需要通过 .reload 文件的时间戳来控制. 这种做法对开发有好处, 在调试改错时, 可以修改
多个 Java 类文件, 然后让 GlassFish v2 一次加载全部修过的类.

 

9. 自动化 .reload 文件时间戳刷新

 

上一节中, 手工打开 .reload 文件, 通过修改其内容刷新其时间戳, 这种做法太麻烦.

在 unix/linux 平台下, 通过命令 touch 刷新 .reload 文件的时间戳. 在 Window 平台, 也有
人实现了 touch. 我在 CodeProject 网站找到一个 touch.exe:
Touch for Windows - The Code Project - Free Tools,很好用, 并且可以集成到 Eclipse 的工具条按钮中来执行 touch 命令(touch.exe 已经包括在附件中).

 

第1步: 拷贝下载的 touch.exe 到 Sample 项目根目录.

 

第2步: 在 Eclipse 下, 选择 Run > External Tools > Open External Tools Dialog.

 

第3步: 选中左侧 Program 节点, 右击, 选择New菜单项.

 

第4步: 在右侧出现的对话框中, 填入下面的内容


Name: SampleTouch
Main[页面]
Localtion: ${workspace_loc:/Sample/touch.exe}
Working Directory: ${workspace_loc:/Sample}
Arguments: .reload
Common[页面]
Display in favorites menu: 选中External Tools

保存后, 你可以在Eclipse的Run工具条按钮中看到新创建的项.

 

10. 结语

 

用 GlassFish v2 可以完全替换 Tomcat 5.x, 在开发中它保留了 Tomcat 好的特性的
同时,给我们带来了强壮的热部署功能, 显著地提高了开发效率.

 

感谢GlassFish v2, 感谢为之付出心血的Java社区成员, 是他们让我们感受到了技术
进步的喜悦.

  • Sample.rar (23.6 KB)
  • 描述: 测试用Tomcat项目
  • 下载次数: 391
评论
goodfifa07 2008-07-03
怎么我在安装Glassfish执行 ant -f setup.xml 后,在bin目录下是空目录
gml520 2008-06-30
terranhao 写道
问题是myeclipse不支持richfaces的标签,没代码自动完成,我崩溃了。
怎么就没一个工具来得全一点,都是有一样没一样


试一试NetBeans 6.1 然后安装一个richfaces 的插件!
或许你会喜欢的!
fangzhouxing 2008-06-28
引用
我咋在 windowsxp 里 建不了 .reload 的文件.. 命名不合法..


要这样子做:
1)启动DOS命令行窗口。
2)输入命令 copy con .reload。
3)按 CTRL+Z。
zdllionheart 2008-06-28
..... 我咋在 windowsxp 里 建不了 .reload 的文件.. 命名不合法..
hong608608 2008-06-26
请问有谁知道glassfish是通过哪个jar包,获得诸如连接池的用户名和密码去验证数据库的用户名和密码是否相符,请问有谁知道在哪里,谢谢!
e_ville 2008-06-25
使用eclipse等IDE远程调试WebLogic的时候改了代码也可以马上生效啊(添加新的方法之类的不行,未实现)而且不用Reload整个个应用,其实也很爽的。

Glassfish民用还可以,商用估计相当一段时间内无人考虑……将来发展如何,咱拭目以待!
sjbwylbs 2008-06-19
现在有Tomcat6.0.16了,还要不要替换呢?性能是不是差不了太多了吧?
terranhao 2008-06-18
问题是myeclipse不支持richfaces的标签,没代码自动完成,我崩溃了。
怎么就没一个工具来得全一点,都是有一样没一样
melin 2008-06-16
写了这么多,其实只要结合myeclipse,起用调试模式就可以了。
softwin 2008-06-11
glassfish怎么配置传递中文get参数
fiolvivi 2008-06-09
抱歉~ 必须得重新说一下~

独立启动的glassfish确实存在上面所说的问题,不过,在myeclipse用debug方式启动以后,修改controller立刻就可以看到效果,不用捅它一下,也不用重部署或者发生长时间404,已经是新的一天了,先玩到这,明天还加班……
fiolvivi 2008-06-08
和楼上仁兄存在同样的疑问,事实上404的时间远超过tomcat重新加载或者重启的时间,session同样会丢失……
plmqaz098 2008-06-04
我测试了一下,修改一个class编译之后,touch .reload,结果整个webapp都reload了一次,中间还是有差不多几十秒的时间404 service unaviable?
好像跟tomcat差不多,没有发现什么区别啊!!
judytang 2008-05-21
你好fangzhouxing,非常高兴在JAVAEYE看到你写的这篇文章,写的很好,我是GLASSFISH的管理人员,邀请你来参加我们的社区,希望能跟你交流,谢谢先 !


http://glassfish.group.javaeye.com/group/topic/5579
dmewy 2008-04-12
写的很好.
可惜公司现在官网打不开,
下载不下来.郁闷的很...
sunrie 2008-04-02
请问glassfish在用spring的时候是不是不能有多个配置文件啊?
比如manager在ApplicationContext-Manager.xml中,
而dao在ApplicationContext-Dao.xml中,
设置了default-autowire="byName",
但manager中的dao为空,调用时会产生空指针错误
而当将dao和manager配置到一个配件中时,就不会出问题
寄生虫 2008-03-31
试过用glassfish,但是在ww和s2的标签中遇到的问题是OGNL的解析,不知各位是否遇到过?何种解决方法?
<s:select list="#{'nnn','1','mmm','2'}">

我用了比较笨的方法是
<s:select list="#@java.util.HashMap@{'nnn','1','mmm','2'}">


不过我见过有朋友提出的解决方式是:
<jsp-config>   
    <jsp-property-group>   
      <url-pattern>*.jsp</url-pattern>   
      <el-ignored>true</el-ignored>   
    </jsp-property-group>   
</jsp-config> 

但是我尝试了这种方式不行
yingwuhahahaha 2008-03-31
请问楼主个问题,我在glass fish 下部署我的war包时报错,但在tomcat下就没有问题,tomcat5.5和6.0我都试过,甚至部署Mapxtreme的官方包都不行,报的错和我的包一样:
-----------------------------
An error has occurred
Deploying application in domain failed; Error loading deployment descriptors for module [mapxtreme480] -- Invalid URL Pattern: [ /servlet/mapxtreme ] Error loading deployment descriptors for module [mapxtreme480] -- Invalid URL Pattern: [ /servlet/mapxtreme ]
------------------------------------
难道还需要对servlet映射做改动么?
iseeiconquer 2008-02-05
谢谢楼主分享经验!!
我发现如果在debug模式下,任何变更都会自动reload,包括servlet等java文件的改动,
不用touch了。。。
phpxer 2008-01-11
现在,我回到了tomcat,因为使用GlassFish的过程中出现了很多问题:
1. 多项目下的目录结构的问题。我的一个Web工程需要引用另外两个工程,于是classes里包含的文件就不全。
2.Log日志十分丑劣,没有Tomcat下控制台的便于浏览和直接连接到源代码位置的优点。
发表评论

提醒: 该博客已发表在公共论坛,博客所有留言会成为论坛回贴,留言请注意遵守论坛发贴规则

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

fangzhouxing
搜索本博客
存档
最新评论