3.2.13. 移植 Seam 2.2 应用程序
3.2.13.1. 移植 Seam 2.2 归档到 JBoss EAP 6
当您移植 Seam 2.2 应用程序时,您需要配置数据源并指定任何模块化依赖关系。您也需要确定应用程序是否依赖于 JBoss EAP 6 不附带的归档并将依赖的 JAR 复制到应用程序的 lib/ 目录。
重要
过程 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.5. 添加数据源定义的语法示例
$ 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 里运行。

Where did the comment section go?
Red Hat's documentation publication system recently went through an upgrade to enable speedier, more mobile-friendly content. We decided to re-evaluate our commenting platform to ensure that it meets your expectations and serves as an optimal feedback mechanism. During this redesign, we invite your input on providing feedback on Red Hat documentation via the discussion platform.