更改 XML 配置从 JBoss 4 迁移到 JBoss 5顺利完成代码迁移

技巧: 从 JBoss 4 迁移到 JBoss 5

更改 XML 配置顺利完成代码迁移

Stephen B Morris, 独立作家/顾问, Omey Communications

简介: 想要将您的 EJB 代码迁移到 JBoss 5 吗?不能使代码部署和运行吗?如果是这样,这个技巧就是为您准备的。或者,您是一个 JBoss 5 新手但是您想感受一下 EJB 3 环境?这个技巧详细介绍了在 JBoss5 上构建、部署和运行 EJB3 代码需要的 XML 部署文件。

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

发布日期: 2009 年 9 月 03 日 

常用缩略词

  • 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 的第一次更改
				
<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 播客:收听针对软件开发人员的有趣访谈和讨论。

获得产品和技术

讨论

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值