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>
<!-- <jta-data-source>java:/ExampleDS</jta-data-source> --> <jta-data-source>java:jboss/datasources/ExampleDS</jta-data-source>Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 如果您像保留现有的数据库,您可以在
EAP_HOME/standalone/configuration/standalone.xml文件里添加数据源定义。重要
要使修改在服务器重启后仍然生效,您必须在编辑服务器配置文件前停止服务器。下面是在 JBoss EAP 6 里定义的默认 HSQL 数据源定义:Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 您也可以用管理 CLI 命令行接口添加数据源定义。下面是您添加数据源所必须使用的语法。结尾的 "\" 表示下一行仍是命令行的一部分。
例 3.5. 添加数据源定义的语法示例
EAP_HOME/bin/jboss-cli --connect
$ 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=saCopy to Clipboard Copied! Toggle word wrap Toggle overflow
添加所需的依赖关系
因为 Seam 2.2 应用程序使用了 JSF 1.2,您需要添加 JSF 1.2 模块的依赖关系并排除 JSF 2.0 模块。为了实现这一点,您需要在包含下列数据的 EAR 的META-INF/目录下创建一个jboss-deployment-structure.xml文件:如果您的应用程序使用了第三方的日志框架,您需要添加如下这些依赖关系:第 3.1.4.1 节 “修改日志依赖关系”.Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果您的应用程序使用了 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
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 signatureCopy to Clipboard Copied! Toggle word wrap Toggle overflow 从外部框架或其他位置复制依赖的归档
如果您的应用程序使用了 Hibernate 3.x 且您无法成功使用 Hibernate 4,您需要像下面这样复制 Hibernate 3.x JAR 到/lib目录并在META-INF/jboss-deployment-structure.xml里的 deployment 部分排除 Hibernate 库:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 当您的应用程序捆绑 Hibernate 3.x 时您还必须采取一些其他的步骤。相关的信息,请参考 第 3.2.2.2 节 “修改使用 Hibernate 和 JPA 的应用程序的配置”。调试和解决 Seam 2.2 JNDI 错误
当您移植 Seam 2.2 应用程序时,您可能会在日志里使用javax.naming.NameNotFoundException错误:如果您不想修改代码里的 JNDI 查找,您可以修改应用程序的javax.naming.NameNotFoundException: Name 'jboss-seam-booking' not found in context ''
javax.naming.NameNotFoundException: Name 'jboss-seam-booking' not found in context ''Copy to Clipboard Copied! Toggle word wrap Toggle overflow 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"/><!-- <core:init jndi-pattern="jboss-seam-booking/#{ejbName}/local" debug="true" distributable="false"/> --> <core:init debug="true" distributable="false"/>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 找到服务器日志里的 JNDI 绑定 INFO 消息
然后,在服务器日志里找到应用程序部署时的 JNDI 绑定 INFO 消息。JNDI 绑定消息应该类似于:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 添加组件元素
对于日志里的每个 JNDI 绑定 INFO 消息,添加匹配的component元素components.xml文件:<component class="org.jboss.seam.example.booking.AuthenticatorAction" jndi-name="java:app/jboss-seam-booking.jar/AuthenticatorAction" />
<component class="org.jboss.seam.example.booking.AuthenticatorAction" jndi-name="java:app/jboss-seam-booking.jar/AuthenticatorAction" />Copy to Clipboard Copied! Toggle word wrap Toggle overflow
关于如何调试和解决移植问题的更多信息,请参考 第 4.2.1 节 “调试和解决移植问题”。关于 Seam 2 归档的已知移植问题列表,请参考 第 3.2.13.2 节 “Seam 2.2 归档移植的问题”。
结果
Seam 2.2 归档成功地在 JBoss EAP 6 里运行。