3.2.13. 移植 Seam 2.2 应用程序
3.2.13.1. 移植 Seam 2.2 归档到 JBoss EAP 6
介绍
当您移植 Seam 2.2 应用程序时,您需要配置数据源并指定任何模块化依赖关系。您也需要确定应用程序是否依赖于 JBoss EAP 6 不附带的归档并将依赖的 JAR 复制到应用程序的 lib/
目录。
重要
直接使用 Hibernate 的 Seam 2.2 应用程序可以使用包裹在应用程序里的一个 Hibernate 3 版本。而通过 JBoss EAP 6 的 org.hibernate 模块提供的 Hibernate 4,不被 Seam 2.2 支持。这个例子将帮助您在 JBoss EAp 6 运行应用程序。请注意,将 Hibernate 3 包裹在 Seam 2.2 应用程序不是被支持的配置。
过程 3.25. 移植 Seam 2.2 归档
更新数据源配置
某些 Seam 2.2 示例使用名为java:/ExampleDS
的默认 JDBC 数据源。JBoss EAP 6 里已经修改了这个默认的数据源为java:jboss/datasources/ExampleDS
。如果您的应用程序使用了 example 数据库,您可以:关于如何配置数据源的更多信息,请参考 第 3.1.6.2 节 “更新数据源配置”。- 如果您想使用 JBoss EAP 6 附带的示例数据库,请修改
META-INF/persistence.xml
文件以替换现有的jta-data-source
元素为示例数据库数据源 JNDI 名:<!-- <jta-data-source>java:/ExampleDS</jta-data-source> --> <jta-data-source>java:jboss/datasources/ExampleDS</jta-data-source>
- 如果您像保留现有的数据库,您可以在
EAP_HOME/standalone/configuration/standalone.xml
文件里添加数据源定义。重要
要使修改在服务器重启后仍然生效,您必须在编辑服务器配置文件前停止服务器。下面是在 JBoss EAP 6 里定义的默认 HSQL 数据源定义:<datasource name="ExampleDS" jndi-name="java:/ExampleDS" enabled="true" jta="true" use-java-context="true" use-ccm="true"> <connection-url>jdbc:h2:mem:test;DB_CLOSE_DELAY=-1</connection-url> <driver>h2</driver> <security> <user-name>sa</user-name> <password>sa</password> </security> </datasource>
- 您也可以用管理 CLI 命令行接口添加数据源定义。下面是您添加数据源所必须使用的语法。结尾的 "\" 表示下一行仍是命令行的一部分。
例 3.3. 添加数据源定义的语法示例
$ EAP_HOME/bin/jboss-cli --connect [standalone@localhost:9999 /] data-source add --name=ExampleDS --jndi-name=java:/ExampleDS \ --connection-url=jdbc:h2:mem:test;DB_CLOSE_DELAY=-1 --driver-name=h2 \ --user-name=sa --password=sa
添加所需的依赖关系
因为 Seam 2.2 应用程序使用了 JSF 1.2,您需要添加 JSF 1.2 模块的依赖关系并排除 JSF 2.0 模块。为了实现这一点,您需要在包含下列数据的 EAR 的META-INF/
目录下创建一个jboss-deployment-structure.xml
文件:<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.0"> <deployment> <dependencies> <module name="javax.faces.api" slot="1.2" export="true"/> <module name="com.sun.jsf-impl" slot="1.2" export="true"/> </dependencies> </deployment> <sub-deployment name="jboss-seam-booking.war"> <exclusions> <module name="javax.faces.api" slot="main"/> <module name="com.sun.jsf-impl" slot="main"/> </exclusions> <dependencies> <module name="javax.faces.api" slot="1.2"/> <module name="com.sun.jsf-impl" slot="1.2"/> </dependencies> </sub-deployment> </jboss-deployment-structure>
如果您的应用程序使用了第三方的日志框架,您需要添加如下这些依赖关系:第 3.1.4.1 节 “修改日志依赖关系”.如果您的应用程序使用了 Hibernate 3.x,请首先用 Hibernate 4 库来运行应用程序。
如果您的应用程序没有使用 Seam Managed Persistence Context、Hibernate search、validation 或其他 Hibernate 4 里已修改的功能,您应该可以用 Hibernate 4 库来运行它。然而,如果您看到指向 Hiberante 类的ClassNotFoundExceptions
或ClassCastExceptions
,或者看到类似于下面的错误信息,您就可能需要遵循下一步的说明并修改应用程序以使用 Hibernate 3.x 库。Caused by: java.lang.LinkageError: loader constraint violation in interface itable initialization: when resolving method "org.jboss.seam.persistence.HibernateSessionProxy.getSession(Lorg/hibernate/EntityMode;)Lorg/hibernate/Session;" the class loader (instance of org/jboss/modules/ModuleClassLoader) of the current class, org/jboss/seam/persistence/HibernateSessionProxy, and the class loader (instance of org/jboss/modules/ModuleClassLoader) for interface org/hibernate/Session have different Class objects for the type org/hibernate/Session used in the signature
从外部框架或其他位置复制依赖的归档
如果您的应用程序使用了 Hibernate 3.x 且您无法成功使用 Hibernate 4,您需要像下面这样复制 Hibernate 3.x JAR 到/lib
目录并在META-INF/jboss-deployment-structure.xml
里的 deployment 部分排除 Hibernate 库:<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.0"> <deployment> <exclusions> <module name="org.hibernate"/> </exclusions> <deployment> </jboss-deployment-structure>
当您的应用程序捆绑 Hibernate 3.x 时您还必须采取一些其他的步骤。相关的信息,请参考 第 3.2.2.2 节 “修改使用 Hibernate 和 JPA 的应用程序的配置”。调试和解决 Seam 2.2 JNDI 错误
当您移植 Seam 2.2 应用程序时,您可能会在日志里使用javax.naming.NameNotFoundException
错误:javax.naming.NameNotFoundException: Name 'jboss-seam-booking' not found in context ''
如果您不想修改代码里的 JNDI 查找,您可以修改应用程序的components.xml
文件:替换现有的 core-init 元素
首先,您需要替换现有的 core-init 元素:<!-- <core:init jndi-pattern="jboss-seam-booking/#{ejbName}/local" debug="true" distributable="false"/> --> <core:init debug="true" distributable="false"/>
找到服务器日志里的 JNDI 绑定 INFO 消息
然后,在服务器日志里找到应用程序部署时的 JNDI 绑定 INFO 消息。JNDI 绑定消息应该类似于:INFO org.jboss.as.ejb3.deployment.processors.EjbJndiBindingsDeploymentUnitProcessor (MSC service thread 1-1) JNDI bindings for session bean named AuthenticatorAction in deployment unit subdeployment "jboss-seam-booking.jar" of deployment "jboss-seam-booking.ear" are as follows: java:global/jboss-seam-booking/jboss-seam-booking.jar/AuthenticatorAction!org.jboss.seam.example.booking.Authenticator java:app/jboss-seam-booking.jar/AuthenticatorAction!org.jboss.seam.example.booking.Authenticator java:module/AuthenticatorAction!org.jboss.seam.example.booking.Authenticator java:global/jboss-seam-booking/jboss-seam-booking.jar/AuthenticatorAction java:app/jboss-seam-booking.jar/AuthenticatorAction java:module/AuthenticatorAction
添加组件元素
对于日志里的每个 JNDI 绑定 INFO 消息,添加匹配的component
元素components.xml
文件:<component class="org.jboss.seam.example.booking.AuthenticatorAction" jndi-name="java:app/jboss-seam-booking.jar/AuthenticatorAction" />
关于如何调试和解决移植问题的更多信息,请参考 第 4.2.1 节 “调试和解决移植问题”。关于 Seam 2 归档的已知移植问题列表,请参考 第 3.2.13.2 节 “Seam 2.2 归档移植的问题”。
结果
Seam 2.2 归档成功地在 JBoss EAP 6 里运行。