级别: 中级 Stephen B Morris, 独立作家/顾问, Omey Communications
2009 年 9 月 03 日 想要将您的 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 的第一次更改
<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 插件)来自动化部分或全部代码更改。在此之前,我希望本文能够帮助您顺利完成代码迁移。
参考资料 学习
获得产品和技术
讨论
关于作者  | |  | Stephen Morris 是爱尔兰的一名独立作家/顾问。凭借在企业开发和网络应用程序方面的丰富经验,Stephen 曾在一些世界最大的网络公司参与过各种软件项目,包括基于 J2EE/J2SE 的网络管理系统,帐单编制应用程序、财务系统、移植和开发 SNMP 实体、网络设备技术和一些移动计算应用程序。他拥有计算机科学的硕士学位,并且拥有三项网络管理方面的专利。他是 Moving Your Career Up the Value Chain: Building Specialized Development Skills in a Global Economy 一书的作者,并且发表过多篇有关网络管理和其他主题的文章。 |
对本文的评价
|