技巧: 从 JBoss 4 迁移到 JBoss 5
更改 XML 配置顺利完成代码迁移
简介: 想要将您的 EJB 代码迁移到 JBoss 5 吗?不能使代码部署和运行吗?如果是这样,这个技巧就是为您准备的。或者,您是一个 JBoss 5 新手但是您想感受一下 EJB 3 环境?这个技巧详细介绍了在 JBoss5 上构建、部署和运行 EJB3 代码需要的 XML 部署文件。
发布日期: 2009 年 9 月 03 日
根据我的实践经验,构建 Java™ 源代码时总是会遇到一些问题。事实的确如此,当我试图在 JBoss5 上运行我的 EJB3 代码时,我发现了几个问题,但是我最终解决了这些问题,我将在本文中介绍我是如何解决它们的。如果您想要跟随本文一起操作,我建议您安装 JBoss 的两个版本:版本 4 和版本 5(参见 参考资料 中的链接)。而且,您需要安装 JDK 1.5 版,且 JAVA_HOME 变量指向安装文件夹 — 例如 JAVA_HOME= C:\java\jdk1.5.0_06。
开始迁移之前,首先检查一下 JBoss4 上当前运行的 EJB3 代码。清单 1 展示了一个简单的 EJB3 实体类,称为 GreetingCard
。
清单 1. EJB3 GreetingCard 类
@Entity @Table(name="GREETING_CARD") public class GreetingCard implements java.io.Serializable { private int id; private String greeting; private int colour; @Id @Column(name="ID") public int getId() { return id; } public void setId(int pk) { id = pk; } @Column(name="NAME") public String getGreeting() { return greeting; } public void setGreeting(String str) { greeting = str; } @Column(name="COLOUR") public int getColour() { return colour; } public void setColour(int colour) { this.colour = colour; } } |
清单 2 展示了一个无状态 bean 类。
清单 2. 一个无状态实体 bean
@Stateless public class CardShopBean implements CardShopRemote { @PersistenceContext(unitName="cardshop") private EntityManager manager; public void createGreetingCard(GreetingCard greetingCard) { manager.persist(greetingCard); } public GreetingCard findGreetingCard(int pKey) { return manager.find(GreetingCard.class, pKey); } public void removeGreetingCard(GreetingCard greetingCard) { manager.remove(greetingCard); } public void flushGreetingCard() { manager.flush(); } public void mergeGreetingCard(GreetingCard greetingCard) { manager.merge(greetingCard); } } |
清单 3 中的这个简单的 program
类运行代码。
清单 3. 运行代码
public static void main(String [] args) { try { Context jndiContext = getInitialContext(); Object ref = jndiContext.lookup("CardShopBean/remote"); CardShopRemote dao = (CardShopRemote)ref; GreetingCard oldGreetingCard = dao.findGreetingCard(1); if (oldGreetingCard != null) { dao.mergeGreetingCard(oldGreetingCard); dao.removeGreetingCard(oldGreetingCard); dao.flushGreetingCard(); } GreetingCard greetingCard_1 = new GreetingCard(); greetingCard_1.setId(1); greetingCard_1.setGreeting("Seasons Greetings from Terry Dactyll"); greetingCard_1.setColour(1); dao.createGreetingCard(greetingCard_1); GreetingCard greetingCard_2 = dao.findGreetingCard(1); System.out.println("Greeting card name: " + greetingCard_2.getGreeting()); System.out.println("Greeting card colour: " + greetingCard_2.getColour()); } catch (javax.naming.NamingException ne) { ne.printStackTrace(); } } |
当您在 JBoss 版本 4 中运行这段代码时,您得到的客户端结果如 清单 4 所示。
清单 4. 在 JBoss 4 中运行 EJB3 代码
ant run.client Buildfile: build.xml run.client: [java] Greeting card name: Seasons Greetings from Terry Dactyll [java] Greeting card colour: 1 BUILD SUCCESSFUL Total time: 10 seconds |
没有什么奇怪的事情发生。现在,尝试在 JBoss 5 下运行同样的代码。在这两个环境之间移动很简单。第一步就是修改 JBOSS_HOME 环境变量的值。在我的系统上,这意味着我需要将 JBOSS_HOME=C:\java\jboss4\JEMS-jboss-4.0.5.GA 修改为 JBOSS_HOME=C:\java\jboss5\jboss-5.0.0.GA。
现在,当您运行 ant -p
时,您得到 清单 5 中的结果。
清单 5. JBoss 5 中的路径问题
build.xml:35: C:\java\jboss5\jboss-5.0.0.GA\server\default\deploy\ejb3.deployer not found. |
对 build.xml 的微小更改(如 清单 6 所示)修复了 清单 5 中的问题。
清单 6. 对 build.xml 的第一次更改
<fileset dir="${jboss.home}/server/default/deployers/ejb3.deployer"> |
运行 ant -p
又出现了另一个(类似的)错误,如 清单 7 所示。
清单 7. 又一个路径问题
build.xml:35: C:\java\jboss5\jboss-5.0.0.GA\server\default\deploy\jboss-aop-jdk50.deployer not found. |
就像上一次更改一样,这个问题也很容易修复(参见 清单 8)。
清单 8. 对 build.xml 的第二次更改
<fileset dir="${jboss.home}/server/default/deployers/jboss-aop-jboss5.deployer"> |
这时,运行 ant -p
没有出现问题。现在可以在 JBoss 5 中构建 EJB3 代码了。不幸的是,运行 ant compile
导致 清单 9 中显示的错误。(注意,清单 9 是实际输出的一小部分摘要。)
清单 9. 编译问题
ant compile compile: [javac] Compiling 4 source files to C:\java\jbossmigration\mycode-jboss5\build\classes [javac] C:\java\jbossmigration\mycode-jboss5\src\main\com\cardsrus\cardshop\ CardShopBean.java:3: package javax.ejb does not exist [javac] import javax.ejb.Stateless; [javac] ^ [javac] C:\java\jbossmigration\mycode-jboss5\src\main\com\cardsrus\cardshop\ CardShopBean.java:4: package javax.persistence does not exist [javac] import javax.persistence.EntityManager; [javac] ^ |
清单 9 中的问题是由于缺少一个库导入而导致的。要修复问题,需要再次修改 build.xml,如 清单 10 所示。将 清单 10 中的代码添加到类路径构造目标中的 <fileset>
元素。
清单 10. 添加一个库导入
<fileset dir="${jboss.home}/common/lib"> <include name="*.jar"/> </fileset> |
进行 清单 10 中的更改后,这个 Java 代码成功编译了。它部署到 JBoss 5 之上了吗?遗憾的是,没有,正如 清单 11 中的服务器端日志摘要所示。
清单 11. 部署问题
16:44:03,093 ERROR [AbstractKernelController] Error installing to Parse: name=vfszip:/C:/java/jboss5/jboss-5.0.0.GA/server/default/deploy/cardsrus.jar state=Not Installed mode=Manual requiredState=Parse org.jboss.deployers.spi.DeploymentException: Error creating managed object for vfszip:/C:/java/jboss5/jboss-5.0.0.GA/server/default/deploy/cardsrus.jar at org.jboss.deployers.spi.DeploymentException.rethrowAsDeploymentException (DeploymentException.java:49) at org.jboss.deployers.spi.deployer.helpers.AbstractParsingDeployerWithOutput. createMetaData (AbstractParsingDeployerWithOutput.java:337) |
要修复这个部署问题,需要修改 persistence.xml 文件,如 清单 12 所示。在原始 persistence.xml 文件中,需要使用清单 12 中的内容替换 <persistence>
这一行。
清单 12. 修改 persistence.xml
<persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" version="1.0" > |
进行了 清单 12 中的更改后,这个代码在 JBoss 5 下部署和运行,客户端输出类似于先前您看到的 清单 4 中的内容。
这样,您最终走出迷雾,将您的 EJB3 代码从 JBoss 4 迁移到了 JBoss 5。
在 JBoss 4 和 JBoss 5 之间移动 EJB3 代码并不是一件简单的事情。您可能需要一个迁移工具(比如一个 Eclipse 插件)来自动化部分或全部代码更改。在此之前,我希望本文能够帮助您顺利完成代码迁移。
学习
- IBM XML 认证:了解如何才能成为一名 IBM 认证的 XML 和相关技术的开发人员。
- XML 技术库:developerWorks XML 专区提供了大量技术文章和技巧、教程、标准以及 IBM 红皮书。
- 技术书店:浏览有关这些技术和其他技术的各种书籍。
- developerWorks 技术活动 和 网络广播:随时关注技术的最新进展。
- developerWorks 播客:收听针对软件开发人员的有趣访谈和讨论。
获得产品和技术
- JBoss:了解并下载您需要的 JBoss 产品。
- IBM 产品评估试用版软件:下载或 探索 IBM SOA Sandbox 中的在线试用软件,并试用来自 DB2®、Lotus®、Rational®、 Tivoli® 和 WebSphere® 的应用程序开发工具和中间件产品。
讨论
- XML 专区讨论论坛:参与几个与 XML 有关的讨论。
- developerWorks 博客:阅读这些博客并加入 developerWorks 社区。