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:

2007年11月28日

关于数据持久化的概念

标签:, , — 吴德文 @ 00:39

自从接触J2EE以来,就不停的接受到持久化(Persistence)的概念。虽然不明白这是什么意思,但是为了快速阅读到后面一些实际编程的技术,都是跳过这个概念,假定这是一个数据封装,从业务逻辑那里将数据库源底层操作分离开的技术。

到了现在读JPA的时候,跳不过去了。例如下面的代码:


public void persistAnimal(Animal animal) {
 // 获取EntityManagerFactory
 EntityManagerFactory factory = Persistence
  .createEntityManagerFactory("mysql");
 // 获取EntityManager
 EntityManager em = factory.createEntityManager();
 // 开始事务处理
 em.getTransaction().begin();
// 持久化对象
 em.persist(animal)
// 提交事务
 em.getTransaction().commit();
 // 关闭EntityManager
 em.close();
 // 关闭EntityManagerFactory
 factory.close();
}

专门有一个函数persist来持久化对象。最开始我认为持久化是业务层能够持久使用数据库的数据,为了不频繁读数据库,将数据库的内容以对象的形式放到内存来,并且对象发生变化的时候会同步到数据库去。即我的理解是把数据库持久化为对象,是数据库->对象。

但是这个理解很牵强,很难理解上面的代码,为什么是对一个对象进行持久化的操作。决定还是把持久化的概念搞明白。Google之。

看了Javen-Studio 咖啡小屋学习笔记之什么是持久化和对象关系映射ORM技术之后,才发现原来持久化是把业务数据对象持久化到存储设备上去。我之前的理解完全是南辕北辙,怪不得到了真正代码的时候就理解不过去了。

何谓”持久化”
持久(Persistence),即把数据(如内存中的对象)保存到可永久保存的存储设备中(如磁盘)。持久化的主要应用是将内存中的数据存储在关系型的数据库中,当然也可以存储在磁盘文件中、XML数据文件中等等。

也只有主体是数据对象,才好真正去理解持久化。从序列化(我一直以为是让数据库序列化输出,然而实际上是将对象转化为字节流,通过网络传输或者保存在文件中)到数据库都好理解了。都是将内存里的数据(对象)转储成各种形式的存储结构。在JPA里也就是为什么新建对象后都要执行持久化的函数,其实就相当于一个数据库Insert操作,因为新建的对象如果没有持久化的话,是不会和数据库建立关联联系起来的;而其他从数据库读取出来产生的对象,是有联系的。


Related:

2007年11月27日

终于写出一个基于JPA的程序了

标签:, , , — 吴德文 @ 16:11

发现自己学东西实在太慢了,常常一个月都在读文档,却始终写不出一个有用的东西来。

之前开始学JPA——本来是按照一些PPT和书上的内容学EJB的,当然有也讲Hibernate的书,可是EJB还没有看完呢,也没有空看。后来才发现EJB(2.0)过时了,找了最新的技术,觉得JPA应该是以后的趋势了,就学它了,可是断断续续的这么久,不断的测试平台,也才只是学会怎么将数据库映射成对象(其实很简单,就只是一个JPA Tool->Generate Entities就搞定的事情),下午终于下定决心搞出一个可以连上数据库查询出东西来的sample程序。

经过给persistence.xml添加Properties(openjpa.ConnectURL等),添加Postgresql驱动(这里要说的是驱动URI是org.postgresql.Driver,开始设成了org.postgresql.jdbc.Driver,结果一直出错(org.apache.openjpa.util.StoreException ),还有一个数据库设置的问题,另外其一个题来说吧。附加上主程序吧,实在是简单呢。

EntityManagerFactory factory = Persistence.createEntityManagerFactory("Dali-ME");
// 从 EntityManagerFactory 实例 factory 中获取 EntityManager
EntityManager em = factory.createEntityManager();
Basic basic = em.find(Basic.class, 4);System.out.println("ID: " + basic.getUid());
System.out.println("姓名: " + basic.getXingming());
System.out.println("学号: " + basic.getXuehao());
System.out.println("性别: " + basic.getGender());
em.close ();
factory.close ();


Related:

2007年09月16日

Develop J2EE using Eclipse IDE with WTP & Geronimo Eclipse plug-in

标签:, , , , — 吴德文 @ 15:47

8月中旬的时候开始接触Geronimo,看到这个东西很欣喜。之前学J2EE开发,除了Tomcat的服务器,还得解决JBoss等东西,要集成这个那个太麻烦了,如果用BEA的,系统消耗又太大了。现在一个Geronimo就解决问题了。

只是Geronimo for Eclipse的插件安装起来还是很麻烦,现在还没有一个直接包含Geronimo的WTP版本(据说将来的版本就会包含)。这段时间我是下载了wtp-all-in-one-sdk-R-2.0-200706260303-win32(似乎是3.3版本的)来用,通过添加Server里安装完插件后(等待下载完成是一个漫长的过程,怀念在北大培训时的下载速度),可以添加 1.0 的 server,但是start server就会出错(Geronimo自身启动是没有问题)。如果安装wasce的插件好像也是不能工作的。

试了好多天了,不知道要如何让这二者结合工作起来,目前就只有两个组合是可以用的。一个是在北大培训时老师提供的wtp-all-in-one-sdk-R-1.5.1-200609230508-win32 + wasce_eclipse_plugin-1.1.0.1-deployable,这个可以跑wasce起来;而另一个是笔记本上基于eclipse-platform-3.2.2-win32,又自己加了一堆J2EE的插件,最后也不知道什么时候安装的Geronimo插件,可以跑1.1的服务器,而且也都正常。

真希望Eclipse早点推出包含Geronimo插件的版本,毕竟现在R2.0的版本就已经有Axis的集成,可以少做很多事情。

注(2007-9-17): 根据 Apache Geronimo v1.1 - Developer’s Guide 里一篇文章(J2EE Application Development on Apache Geronimo Simplified using Eclipse)提到 ApacheCon Europe 2007 的一个 presentation 介绍了如何用Eclipse with WTP & Geronimo 来开发J2EE应用程序,并提供了演讲资料(包括ppt和sample)的下载。

根据ppt中的介绍,使用的是1.5.2版本的wtp sdk(而上文中我提到的用于wasce的是1.5.1版的),并依照http://geronimo.apache.org/development-tools.html 的提示来安装Geronimo插件(文中提到Geronimo的插件可以在1.5.2版的WTP上直接安装,应该也是要在1.5.2版以上的WTP才能对它支持)。

到了Eclipse WebTools 的下载页面发现,现在没有1.5.2的WTP的,最新的是1.5.5,下载了以后,发现其一些界面特性还是和Platform322比较相像的。比较了一下各个版本的时间,对我之前一直安装无法成功心里总算清楚了很多。

v1.5.5是07年8月29号的,应该是在以前的版本上集成了最多的东西。而v2.0是一个新的分支,确实有一些新的特性,但是最后的更新日期是07年6月26日。

最后,觉得以后解决一个问题,还是要好好看文档才行,这样才能少走很多弯路。

感谢Shiva Kumar H.R. 在presentation里的介绍,让我找到了最后的安装方法。


Related:

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