技巧: 从 JBoss 4 迁移到 JBoss 5

转自:http://www.ibm.com/developerworks/cn/xml/x-tipjb5ejb3/

技巧: 从 JBoss 4 迁移到 JBoss 5 想要将您的 EJB 代码迁移到 JBoss 5 吗?不能使代码部署和运行吗?如果是这样,这个技巧就是为您准备的。或者,您是一个 JBoss 5 新手但是您想感受一下 EJB 3 环境?这个技巧详细介绍了在 JBoss5 上构建、部署和运行 EJB3 代码需要的 XML 部署文件。 常用缩略词 * EJB:企业级 Java 组件(Enterprise Java Bean) * JDK:Java 开发工具箱(Java Development Kit) * XML:可扩展标记语言(Extensible Markup Language) 根据我的实践经验,构建 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 的第一次更改 运行 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 的第二次更改 这时,运行 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 中的代码添加到类路径构造目标中的 元素。 清单 10. 添加一个库导入 进行 清单 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 中的内容替换 这一行。 清单 12. 修改 persistence.xml 进行了 清单 12 中的更改后,这个代码在 JBoss 5 下部署和运行,客户端输出类似于先前您看到的 清单 4 中的内容。 这样,您最终走出迷雾,将您的 EJB3 代码从 JBoss 4 迁移到了 JBoss 5。 另外:@RemoteBinding等的所在包也不一样了. org.jboss.annotation.ejb.RemoteBinding --> org.jboss.ejb3.annotation.RemoteBinding 结束语 在 JBoss 4 和 JBoss 5 之间移动 EJB3 代码并不是一件简单的事情。您可能需要一个迁移工具(比如一个 Eclipse 插件)来自动化部分或全部代码更改。在此之前,我希望本文能够帮助您顺利完成代码迁移。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值