 | Nível: Intermediário Stephen B. Morris, CTO, Omey Communications
21/Jul/2009 Tentando migrar seu código EJB para JBoss 5? Não é possível implementar e executar o código? Nesse caso, esta dica é para você. Ou você é principiante no JBoss 5, mas deseja sentir o ambiente EJB 3? Esta dica detalha os arquivos de implementação XML necessários para construir, implementar e executar código EJB3 em JBoss5.
Minha própria experiência me ensinou a sempre esperar problemas quando construo código de origem Java™ . Com certeza encontrei alguns problemas ao tentar executar meu código EJB3 no JBoss5, mas consegui contornar todos eles e contarei como fiz isso neste artigo. Se quiser acompanhar, sugiro instalar duas cópias do JBoss: versão 4 versão 5 (consulte Recursos para obter links). Além disso, é necessário ter o JDK versão 1.5 instalado, com a variável JAVA_HOME apontando para a pasta de instalação—por exemplo, JAVA_HOME= C:\java\jdk1.5.0_06.
Questão de Upgrade de Caminhos
Antes de iniciar a migração, inicie dando uma olhada no código EJB3 atualmente em execução no JBoss4. A Lista 1 mostra uma classe de entidade EJB3 simples chamada GreetingCard.
Lista 1. A Classe 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;
}
} |
A Lista 2 mostra uma classe de bean stateless.
Lista 2. Um Bean de Entidade Stateless
@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);
}
} |
A classe program simples na Lista 3 executa esse código.
Lista 3. Executando o Código
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();
}
}
|
Ao executar esse código no JBoss versão 4, você obtém os resultados do lado do cliente na Lista 4.
Lista 4. Executando o Código EJB3 no JBoss 4
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
|
Isso não é nenhuma surpresa! Agora, tente executar o mesmo código sob JBoss 5. É muito fácil alternar entre os dois ambientes. A primeira etapa é simplesmente modificar o valor da variável de ambiente JBOSS_HOME. Em meu sistema, isso significa alterar de JBOSS_HOME=C:\java\jboss4\JEMS-jboss-4.0.5.GA para JBOSS_HOME=C:\java\jboss5\jboss-5.0.0.GA.
Agora, ao executar ant -p, obtém-se o resultado da Lista 5.
Lista 5. Problemas com Caminho no JBoss 5
build.xml:35: C:\java\jboss5\jboss-5.0.0.GA\server\default\deploy\ejb3.deployer not found.
|
A pequena mudança em build.xml ilustrada na Lista 6 corrige o problema da Lista 5.
Lista 6. Primeira Mudança em build.xml
<fileset dir="${jboss.home}/server/default/deployers/ejb3.deployer">
|
Executar ant -p novamente desvenda outro erro (semelhante), ilustrado na Lista 7.
Lista 7. Mais um Problema de Caminho
build.xml:35:
C:\java\jboss5\jboss-5.0.0.GA\server\default\deploy\jboss-aop-jdk50.deployer
not found.
|
Como para a mudança anterior, isso também é facilmente corrigido (consulte a Lista 8).
Lista 8. Segunda Mudança em build.xml
<fileset dir="${jboss.home}/server/default/deployers/jboss-aop-jboss5.deployer">
|
Neste ponto, ant -p é executado sem nenhum problema. Agora chegou a hora de construir o código EJB3 no JBoss 5. Infelizmente, executar ant compile resulta no problema ilustrado na Lista 9. (Observe que a Lista 9 é um pequeno trecho da saída em si.)
Lista 9. Problemas de Compilação
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] ^
|
O problema da Lista 9 é causado pela ausência da importação de uma biblioteca. A correção requer outra mudança em build.xml, ilustrada na Lista 10. Inclua o código da Lista 10 nos elementos <fileset> no destino da construção do caminho de classe.
Lista 10. Incluindo uma Importação de Biblioteca
<fileset dir="${jboss.home}/common/lib">
<include name="*.jar"/>
</fileset>
|
Após efetuar a mudança na Lista 10, o código Java é compilado com êxito. Este código é implementado no JBoss 5? Infelizmente, não, conforme ilustrado no trecho de log do servidor na Lista 11.
Lista 11. Problemas de Implementação
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)
|
Para corrigir o problema de implementação, é necessária uma modificação no arquivo persistence.xml, conforme ilustrado na Lista 12. No arquivo persistence.xml original, foi necessário substituir a linha <persistence> pelo conteúdo da Lista 12.
Lista 12. Modificação em 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" >
|
Após efetuar a mudança na Lista 12, o código é implementado e executado sob o JBoss 5, com saída do cliente semelhante ao que foi visto anteriormente na Lista 4.
Portanto, você finalmente achou seu caminho, tendo migrado o código EJB3 do JBoss 4 para o JBoss 5.
Conclusão
Mover código EJB3 entre o JBoss 4 e o JBoss 5 não é uma questão simples. Pode ser necessário usar uma ferramenta de migração, como um plug-in do Eclipse, para automatizar algumas ou todas as mudanças de código necessárias. Até lá, espero que este artigo ajude a tornar sua migração suave.
Recursos Aprender
Obter produtos e tecnologias
Discutir
Sobre o autor  | |  | Stephen Morris é um escritor/consultor independente que vive na Irlanda. Com grande experiência em desenvolvimento corporativo e aplicativos de rede, Stephen já trabalhou para para algumas das maiores empresas de rede do mundo em projetos como sistemas de gerenciamento de redes baseadas em Java EE e J2SE, aplicativos de faturamento, sistemas financeiros, entidades SNMP de portabilidade/desenvolvimento, tecnologias de dispositivos de rede e diversos aplicativos de computação remota. Possui mestrado em ciência da computação e três patentes na área de gerenciamento de rede. Ele é o autor de Moving Your Career Up the Value Chain: Building Specialized Development Skills in a Global Economy , assim como de diversos artigos sobre gerenciamento de rede e outros tópicos. |
Avalie esta página
|  |