THE MOMENT, THE MEMENTO

2010年07月30日

如何创建与Eclipse WTP平台兼容的GWT项目

标签:, — 吴德文 @ 03:28

说到GWT(嗯,就是Google Web Tookit),真是个神奇的东西,令我即将成为GWT的重度使用者。

不过最近发现,要在Eclipse JEE里把GWT项目和其它Enterprise Application Project集成在一起的时候会遇到麻烦,甚至只是简单的把GWT项目通过Eclipe的Server管理发布到Tomcat上也是不可能的。那是因为用GWT插件创建出来的GWT项目并不是一个JavaWeb项目(准确的说是不包含jst.web组件的项目),它除了最基本的Java项目信息以外,就只剩下gwt的模块信息了,所以Eclipse就只把它当作最普通的Java项目来对待。当它被设置成从属于EAR项目的时候,Eclipse会把他转变成JavaUtility项目,而不能发布成Web项目;当它单独为一个项目时,不能在Server里添加删除这个项目,也不能直接导出为WAR文件(手工使用jar是可以的,ant应该也可以,但那是Eclipse之外的方法了);甚至于,它的项目属性里连“Project Facets”设置项都没有,无法添加“Dynamic Web Module”或者是“Geronimo Deployment”或者是“Java Persistence”的特性。

这可怎么办呢?虽然GWT很好用,但是如果只能作为一个简单的Java项目是不行的,毕竟是用它来做Web项目的,我需要它能很好的和WTP兼容,这样我才不需要在Eclipse之外又做很多工作。

这个问题的关键就是项目的属性缺少Web项目应有的特性“Dynamic Web Module”,解决的思路有两个:一就是创建默认的GWT项目,然后通过修改项目属性文件.classpath以及org.eclipse.wst.common.*文件,把jst.web的项目特性加上去;再一种就是创建一个Dynamic Web Project,然后再把Google Web Toolkit的特性加到项目中去,当然还要按照GWT的规则设置一下build的输出目录以及一些注意事项。

第一种方法,我试了以后不是很安全,或者说不是很靠谱。因为毕竟对项目属性文件不是很精通,哪些要改,哪些不要改不是很了解,可能改错,也可能漏改,已知上改后的项目也没达到我的目的,无法变成一个真正的Dynamic Web项目。

第二种方法,好像还不错,只不过现在只在Tomcat上通过,还没有做关于Geronimo发布的测试。这里说说第二种方法怎么操作。

首先,创建一个默认的Dynamic Web Project;创建时最好是将Target Runtime设置为<None>(后面会解释);而Content directory可以使用默认的WebContent,也可以设置为GWT风格的war目录;重要的是Default output folder必须是<Content directory>/WEB-INF/classes。

接着,右键点击项目后出现的快捷菜单里,选择Google - Web Toolkit settings…,将Use Google Web Toolkit的Checkbox选上。如果,你的Content directory不是GWT需要的war,比如是默认的WebContent的话,还必须在项目属性的Google中设置Web Application中的WAR directory目录,否则在以GWT方式(Web Application)运行的时候会弹出“Could not find any host pages in project”的提示。

然后,需要增加一个名为test的Source folder,并把其Output folder设置为test-classes(点击Allow output folders for source folders),这样GWT项目里的test代码就有容身之处了。

最后,就可以从一个标准的GWT项目那里把src以及test目录下的代码复制过来,同时需要复制的还有WebContent目录下的html文件以及web.xml文件。

这样一个和WTP兼容的项目就完成了,可以开发GWT,然后用GWT方式运行来测试或者是通过WTP发布到Tomcat Server上了。

注1:如果创建项目是选择Tomcat作为Target Runtime的话,以GWT方式来运行时,会提示下面的错误信息:

Starting Jetty on port 8888

[WARN] failed jsp

java.lang.NoClassDefFoundError: org/apache/juli/logging/LogFactory

……

[WARN] failed com.google.gwt.dev.shell.jetty.JettyLauncher$WebAppContextWithReload@ccc588{/,D:\Eclipse\Training\GWTTomcat\WebContent}

java.lang.NoClassDefFoundError: org/apache/juli/logging/LogFactory

……

这时虽然GWT运行了,但是打开网页会出现错误如下:

HTTP ERROR: 404

NOT_FOUND

我能想到Target Runtime对项目的影响就是Build Path里面多了Tomcat的Lib。因此,如果把这个Runtime去掉,或者是直接在Build Path里去掉Tomcat的Lib,项目就可以运行在GWT下了。不过如果此时再重新把Runtime设为Tomcat,似乎也可以正常运行了(诡异的现象),也许是多个重复的Lib的先后顺序问题。

注2:经测试证实,就是Build Path中Lib顺序的问题,只要GWT在前,那么以GWT方式运行就不会出错。

注3:测试证实,如果项目的Runtime设置成Apache Geronimo,不论GWT的顺序如何,以GWT方式来Run的时候,仍会提示下面的错误信息:

[WARN] Server class ‘org.apache.geronimo.kernel.log.GeronimoLogFactory’ could not be found in the web app, but was found on the system classpath

[WARN] Adding classpath entry ‘file:/D:/Tools/Web/geronimo-tomcat6-javaee5-2.1.4/lib/geronimo-kernel-2.1.4.jar’ to the web app classpath for this session

For additional info see: file:/D:/Tools/Eclipse/plugins/com.google.gwt.eclipse.sdkbundle.2.0.3_2.0.3.v201002191036/gwt-2.0.3/doc/helpInfo/webAppClassPath.html

但是,程序还是可以运行的,至少目前在浏览器里没发现什么错。

Related:

2010年07月17日

钓鱼?

吴德文 @ 15:12

突然QQ跳出一个框,说我有一封邮件,打开一看,是如下内容:

发件人:网易通行证 <passport@service.netease.com>

亲爱的网易通行证用户,您好:
请您点击下面链接来验证您的网易通行证的QQ号码:
http://reg.163.com/getpasswd/activateSecMailBox.jsp?mailType=qq&sid=…………………….
为了确保您的帐号安全,该链接仅7天内访问有效。

如果该链接已经失效,请您点击下面链接来重新获取激活保密邮箱的邮件:
http://reg.163.com/activatemail.jsp?mailType=qq
如果点击链接不工作…

请您选择并复制整个链接,打开浏览器窗口并将其粘贴到地址栏中。然后单击”转到”按钮或按键盘上的 Enter 键。
请勿直接回复该邮件,有关 网易通行证 的更多帮助信息,请访问:http://reg.163.com/help/help.shtml
网易通行证

这个邮件突然把我搞傻了,什么叫做我的“网易通行证的QQ号码”?

Google了一下,才知道原来现在网易通行证可以“绑定”QQ号码,或者是说通过QQ号码来找回密码。可是我没有忘记密码,不需要也没有进行过忘记密码的操作呀,为什么会收到这封邮件呢?

一种可能,这个是一封钓鱼邮件,骗我点链接,然后盗取我的密码,不过上面的所有链接都是真是的呀,而且邮件的协议层原文也是正常的。

还有一种可能,就是网易邮箱看我好久没去登录(我的Gmail已经很久没法pop3网易的邮件了),寂寞了,就发封邮箱骚扰我一下,让我做点什么操作。这个貌似有点靠谱。

不过还有一个很大的问题,怎么会知道我的QQ号呢?我从没在上面设置过这些信息呀。。。。

总之,问题还是很大很大,上面的链接我是不敢点的,不晓得会发生什么。地球太危险了。。。

2010年07月7日

电影《Kate & Leopold》的台词

吴德文 @ 14:51

当然,这是照着中文字幕记下来的。如果能找到英文原文是最好了。

“我发现自己正在向不知情的公众推销垃圾。”

“当一个人发现自己正在努力参与一项毫无价值的事情,他可以退出。”

“有些时候,你不得不做一些你不喜欢做的事,有时候你必须坚持并完成你所开始的事情,这是生活的一部分。”

Valid XHTML 1.1 Valid CSS! Creative Commons License WordPress 所驱动