Board logo

标题: 从 JBoss 4 迁移到 JBoss 5(1) [打印本页]

作者: look_w    时间: 2018-7-11 08:43     标题: 从 JBoss 4 迁移到 JBoss 5(1)

根据我的实践经验,构建 Java™ 源代码时总是会遇到一些问题。事实的确如此,当我试图在 JBoss5 上运行我的 EJB3 代码时,我发现了几个问题,但是我最终解决了这些问题,我将在本文中介绍我是如何解决它们的。如果您想要跟随本文一起操作,我建议您安装 JBoss 的两个版本:版本 4 和版本 5(参见  中的链接)。而且,您需要安装 JDK 1.5 版,且 JAVA_HOME 变量指向安装文件夹 — 例如 JAVA_HOME= C:\java\jdk1.5.0_06。
升级路径开始迁移之前,首先检查一下 JBoss4 上当前运行的 EJB3 代码。 展示了一个简单的 EJB3 实体类,称为 GreetingCard。
清单 1. EJB3 GreetingCard 类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
@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;
    }
}




展示了一个无状态 bean 类。
清单 2. 一个无状态实体 bean
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
@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);
    }
}




中的这个简单的 program 类运行代码。
清单 3. 运行代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
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. 在 JBoss 4 中运行 EJB3 代码
1
2
3
4
5
6
7
8
9
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. JBoss 5 中的路径问题
1
build.xml:35: C:\java\jboss5\jboss-5.0.0.GA\server\default\deploy\ejb3.deployer not found.




对 build.xml 的微小更改(如  所示)修复了  中的问题。
清单 6. 对 build.xml 的第一次更改
1
<fileset dir="${jboss.home}/server/default/deployers/ejb3.deployer">




运行 ant -p 又出现了另一个(类似的)错误,如  所示。
清单 7. 又一个路径问题
1
2
3
build.xml:35:
    C:\java\jboss5\jboss-5.0.0.GA\server\default\deploy\jboss-aop-jdk50.deployer
    not found.




就像上一次更改一样,这个问题也很容易修复(参见 )。
清单 8. 对 build.xml 的第二次更改
1
<fileset dir="${jboss.home}/server/default/deployers/jboss-aop-jboss5.deployer">




这时,运行 ant -p 没有出现问题。现在可以在 JBoss 5 中构建 EJB3 代码了。不幸的是,运行 ant compile 导致  中显示的错误。(注意,清单 9 是实际输出的一小部分摘要。)
清单 9. 编译问题
1
2
3
4
5
6
7
8
9
10
11
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]                          ^




中的问题是由于缺少一个库导入而导致的。要修复问题,需要再次修改 build.xml,如  所示。将  中的代码添加到类路径构造目标中的 <fileset> 元素。
清单 10. 添加一个库导入
1
2
3
<fileset dir="${jboss.home}/common/lib">
     <include name="*.jar"/>
</fileset>




进行  中的更改后,这个 Java 代码成功编译了。它部署到 JBoss 5 之上了吗?遗憾的是,没有,正如  中的服务器端日志摘要所示。
清单 11. 部署问题
1
2
3
4
5
6
7
8
9
10
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 文件,如  所示。在原始 persistence.xml 文件中,需要使用清单 12 中的内容替换 <persistence> 这一行。
清单 12. 修改 persistence.xml
1
2
3
4
5
6
<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" >




进行了  中的更改后,这个代码在 JBoss 5 下部署和运行,客户端输出类似于先前您看到的  中的内容。
这样,您最终走出迷雾,将您的 EJB3 代码从 JBoss 4 迁移到了 JBoss 5。
结束语在 JBoss 4 和 JBoss 5 之间移动 EJB3 代码并不是一件简单的事情。您可能需要一个迁移工具(比如一个 Eclipse 插件)来自动化部分或全部代码更改。在此之前,我希望本文能够帮助您顺利完成代码迁移。




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0