Seam 2.1.0.SP1 版本中包含了一个新的参考指南章节,描述了Seam与GlassFish v2的集成。与大多数容器集成一样,大部分工作都是协调库差异、数据源和部署描述符更改。在这一点上,Glassfish没有不同,但是与我所写的其他容器相比,集成和与GlassFish一起工作要容易得多。
为了展示与GlassFish集成的简便性,我将向您展示如何部署2个不同的Seam示例,并将一个seam-gen应用程序迁移到一个博客中 - 而且不会很长 - 好吧,不会太长 ;-)
GlasshFish 版本和设置
对于这篇博客,我在Linux机器上使用GlassFish v2ur4-b04和JDK6。安装GlassFish的说明在下载页面的底部,相当简单。我假设您已经安装了它,并且已经按照下载页面上的说明创建了一个域。
注意:以下所有示例都需要启动GlassFish附带的嵌入式javaDB数据库。要启动和停止数据库,请执行
$ asadmin start-database $ asadmin stop-database
Thejee5/booking示例
此示例基于Seam Booking示例,展示了如何构建符合Java EE 5规范的Seam应用程序。要构建和部署它,请按照以下步骤操作。
- 导航到$SEAM_HOME/examples/jee5/booking目录
- 执行ant
- 示例将构建的ear文件存放到$SEAM_HOME/examples/jee5/booking/dist目录。
- 使用GlassFish 管理控制台以默认设置部署jboss-seam-jee5.ear作为企业应用程序。
- 导航到 http://localhost:8080/seam-jee5/ 并查看示例。
就是这样,不需要其他任何东西。
Thejpa示例
这是使用Seam POJOs和Hibernate JPA实现的酒店预订示例。构建和部署这个示例几乎和jee5/booking示例一样。
- 导航到$SEAM_HOME/examples/jpa目录
- 执行ant glassfish
- 示例将构建的war文件存放到$SEAM_HOME/examples/jpa/dist-glassfish目录。
- 使用GlassFish 管理控制台以默认设置部署jbosseam-jpa.war以所有默认设置作为Web应用程序。
- 导航到 http://localhost:8080/jboss-seam-jpa/ 并查看示例。
这些示例构建和部署相当简单直接。这部分是因为它们考虑到了GlassFish集成。你可能想知道部署到GlassFish需要哪些实际更改。下一节将详细介绍这一点。
将seam-gen项目迁移到GlassFish
Seam框架使用seam-gen作为开发人员快速启动应用程序的工具,并为添加自己的功能提供基础。seam-gen创建部署到JBoss AS的应用程序。本节将详细说明需要更改的内容,以便您可以在GlassFish中部署。
初始项目设置
第一步是获取seam-gen设置和创建基础项目。在$SEAM_HOME目录中执行./seam setup。这将启动一个有关您的应用程序的命令行调查问卷。根据您的喜好设置JBoss home和工作空间。将项目名称设置为 seamgen_example,使用RichFaces(而不是IceFaces),并想要创建ear项目。对于所有其他条目,您可以使用默认值。
然后执行以下操作来创建项目:seam-gen./seam new-project。然后导航到新项目以进行其余步骤。配置文件更改
以下是需要更改默认配置文件的各项更改。
resources/META-INF/persistence-dev.xml
将
- jta-data-source更改为jdbc/__default用以下内容替换所有持久性属性
- resources/GlassFishDerbyDialect.class
<property name="hibernate.dialect" value="GlassFishDerbyDialect"/> <property name="hibernate.hbm2ddl.auto" value="update"/> <property name="hibernate.show_sql" value="true"/> <property name="hibernate.format_sql" value="true"/> <property name="hibernate.cache.provider_class" value="org.hibernate.cache.HashtableCacheProvider"/> <property name="hibernate.transaction.manager_lookup_class" value="org.hibernate.transaction.SunONETransactionManagerLookup"/>
我们需要从
示例中复制此文件以解决GlassFish中包含的Derby (javaDB) 的问题。从jpaseamgen_example项目基本执行以下操作。resources/WEB-INF/components.xml
cp $SEAM_HOME/examples/jpa/resources-glassfish/WEB-INF/classes/GlassFishDerbyDialect.class ./resources
我们希望GlassFish管理我们的事务,因此需要添加
- <transaction:ejb-transaction />和其命名空间xmlns:transaction="http://jboss.com/products/seam/transaction"在文件顶部。jndi-pattern
- jta-data-source更改为java:comp/env/seamgen_example/#{ejbName}resources/WEB-INF/web.xml
我们需要在
web.xml底部添加以下内容,以便GlassFish正确绑定EJBs正确。resources/META-INF/application.xml
<ejb-local-ref> <ejb-ref-name>seamgen_example/EjbSynchronizations</ejb-ref-name> <ejb-ref-type>Session</ejb-ref-type> <local-home></local-home> <local>org.jboss.seam.transaction.LocalEjbSynchronizations</local> </ejb-local-ref>
我们的基础应用程序还没有任何自己的
,并且GlassFish不喜欢当应用程序声明一个包含没有正确。的EJB模块时。正确。因此,我们需要删除以下内容
<module> <ejb>seamgen_example.jar</ejb> </module>
更新构建文件
现在,唯一剩下的事情是更新build.xml文件为项目基本执行以下操作。项目。
添加GlassFishDerbyDialect.class到构建
为此,找到jar目标并添加以下<include name="GlassFishDerbyDialect.class" />如以下所示。
<target name="jar" depends="compile,copyclasses" description="Build the distribution .jar file"> <copy todir="${jar.dir}"> <fileset dir="${basedir}/resources"> <include name="seam.properties" /> <include name="*.drl" /> <include name="GlassFishDerbyDialect.class" /> </fileset> </copy> ...
添加依赖库
找到ear目标并将以下<include .../>元素添加到<copy todir="${ear.dir}/lib">,以便<fileset dir="${lib.dir}">看起来像这样
<fileset dir="${lib.dir}"> <includesfile name="deployed-jars-ear.list" /> <!-- Hibernate and deps --> <include name="hibernate.jar"/> <include name="hibernate-commons-annotations.jar"/> <include name="hibernate-annotations.jar"/> <include name="hibernate-entitymanager.jar"/> <include name="hibernate-validator.jar"/> <include name="jboss-common-core.jar" /> <!-- 3rd party and supporting jars --> <include name="javassist.jar" /> <include name="dom4j.jar" /> <include name="concurrent.jar" /> <include name="cglib.jar" /> <include name="asm.jar" /> <include name="antlr.jar" /> <include name="commons-logging.jar" /> <include name="commons-collections.jar" /> </fileset>
构建和部署
此时,唯一剩下的事情是构建和部署应用程序。
要构建它,您只需在目录中运行ant archive项目基本执行以下操作。即可。这将创建一个seamgen_example/dist包含seamgen_example.ear文件的目录。
按照我们部署其他示例的方式部署此示例。jee5/booking示例一样。
在http://localhost:8080/seamgen_example查看你的劳动成果。
总结
所以,这篇博客比预期的要长一些,但我们部署了3个应用程序,而不仅仅是1个,就像其他互操作性博客一样 ;-) 这应该为你基于GlassFish的Seam应用程序提供了一个良好的起点。
有关安装GlassFish的更多详细信息以及我们所做的某些更改,请参阅Seam on GlassFish应用服务器参考指南章节。
更新:最近对参考指南章节进行了一些更改和修复。本博客包含最新信息,更新将在Seam 2.1.1.CR1版本中提供。