Deploy manual de Session EJB no Jboss

Alguém poderia confirmar esse passo a passo pra mim?
Eu tentei uma vez e não deu certo, mas acho que o .xml estavam errados.
Estou tentando fazer o deploy assim:

Crio um novo projeto no eclipse, adiciono o j2ee.jar, jbossall-client.jar e (outro .jar do jboss que nao lembro, nao estou em casa agora) como external jars, mando o eclipse separar os .java no diretorio src e .class no diretorio bin.

Crio as classes: home, remota, e o bean (estou adicionando elas no package com.luizfar.ejb)

Aqui vem a maior dúvida, crio o diretório META-INF e lá dentro eu tenho q colocar dois arquivos xml certo? O ejb-jar.xml e o jboss.xml.

O ejb-jar.xml deve ser algo do tipo…

<?xml version="1.0" encoding="UTF-8"?>

<ejb-jar>
   <enterprise-beans>
      <session>
         <ejb-name>MeuEJB</ejb-name>
         <home>com.luizfar.ejb.MeuEJBHome</home>
         <remote>com.luizfar.ejb.MeuEJBBean</remote>         
         <ejb-class>com.luizfar.MeuEJB</ejb-class>
         <session-type>Stateless</session-type>
         <transaction-type>Container</transaction-type>
      </session>
    </enterprise-beans> 
</ejb-jar>

O jboss.xml:

<?xml version="1.0" encoding="UTF-8"?>
<jboss>
    <enterprise-beans>
        <session>
            <ejb-name>MeuEJB</ejb-name>
            <jndi-name>MeuEJB</jndi-name>
        </session>
    </enterprise-beans>
</jboss>

Depois compacto a pasta bin, src e META-INF com o nome MeuEJB, renomeio a extensão para jar, coloco o jar na pasta JBOSS_HOME\server\default\deploy (isso com o jboss ja rodando)

automaticamente o jboss reconhece o .jar e faz o deploy do ejb (isso nao acontece comigo)

Bom, supondo que o deploy ocorra com sucesso. Como crio um cliente para acessar esse EJB? O cliente deve estar no mesmo projeto no eclipse? No mesmo .jar? Ou não tem nada a ver?

Se precisarem, to usando o eclipse 2.1, tenho o lomboz, mas não queria utilizá-lo, jdk 1.4.8 e quanto ao jboss, tentei com as versões 3.2.1 e 4.0.1sp1

Obrigado :slight_smile:

Olá,

o arquivos arquivos de configuração estão corretos. Uma observação q tenho a fazer é com relação ao j2ee.jar, teoricamente se você adicionar este jar no classpath do seu projeto ele deveria funcionar, mas já tive problemas uma vez e fui obrigado a substitur por jboss-j2ee.jar (muito raro de acontecer).

Quanto ao client, ele pode ser independente do seu projeto EJB, você pode por exemplo criar um app swing que acesse seu EJB, para isso basta configurar um locator, e utiliza-lo para capturar o referencia para o seu home, e ai já viu, vc tem a instancia. segue abaixo um simples service-locator:

public class ServiceLocator {
  public static Context getInitialContext() throws NamingException{
    Hashtable props = new Hashtable();
    props.put(Context.INITIAL_CONTEXT_FACTORY,     "org.jnp.interfaces.NamingContextFactory");
    props.put(Context.PROVIDER_URL, "localhost:1099");
    props.put("java.naming.rmi.security.manager", "yes");
    props.put(Context.URL_PKG_PREFIXES, "org.jboss.naming");
		return new InitialContext(props);
  }
}

e agora como obter a referencia do HOME através do Service Locator:

    try {
      Context context=ServiceLocator.getInitialContext();
      Object objref = context.lookup("MeuEJB");
      MeuEJB ab = null;
      MeuEJBHome ejbHome = null;
      objref =  (MeuEJBHome)PortableRemoteObject.narrow(objref, MeuEJBHomeHome.class);
      if (objref instanceof MeuEJBHome) {
        ejbHome = (MeuEJBHOME)objref;
      } else {
        txtResposta.setText("Erro ao processar: casting" );
      }
      ab = ejbHome.create();
      ......//agora vc já sabe o q fazer :D

Espero q possa ser util.

abraços.

Uma observação, Seria interessante trabalhar com scripts ant, pois facilitam muito o seu trabalho.

Segue abaixo um exemplo de um build.xml:

<project name="My Project" default="all" basedir=".">

  <property name="app.name"       value="EJBdiscovery"/>
  <property name="deploy.home"    value="classes"/> 
  <property name="jars.dir"       value="bin"/> 

  <target name="all" depends="prepare,compile"/>

  <target name="prepare">
    <mkdir  dir="${deploy.home}"/>
    <mkdir  dir="${jars.dir}"/>
    <!-- <mkdir  dir="${deploy.home}/WEB-INF"/> 
    <mkdir  dir="${deploy.home}/WEB-INF/classes"/>  -->

  </target>

  <target name="compile" depends="prepare">
    <javac srcdir="src" destdir="${deploy.home}" classpath="${deploy.home}"
           debug="on" optimize="off" deprecation="on"/>
  </target>

  <target name="clean">
    <delete dir="${deploy.home}"/>
    <delete dir="${jars.dir}"/>
  </target>

</project>

Obrigado pelas respostas!

Bom, eu tentei mais uma vez fazer o deploy, e consegui o seguinte erro:

03:01:26,902 WARN  [verifier] EJB spec violation:
Bean   : MeuEJBBean
Section: 22.2
Warning: The Bean Provider must specify the fully-qualified name of the Java cla
ss that implements the enterprise bean's business methods in the <ejb-class> ele
ment.
Info   : Class not found on 'com.luizfar.ejb.MeuEJBBean': No ClassLoaders found
for: com.luizfar.ejb.MeuEJBBean

03:01:26,912 ERROR [MainDeployer] could not create deployment: file:/C:/jboss-4.
0.1sp1/server/default/deploy/MeuEJB.jar
org.jboss.deployment.DeploymentException: Verification of Enterprise Beans faile
d, see above for error messages.
        at org.jboss.ejb.EJBDeployer.create(EJBDeployer.java:553)
        at org.jboss.deployment.MainDeployer.create(MainDeployer.java:918)
        at org.jboss.deployment.MainDeployer.deploy(MainDeployer.java:774)
        at org.jboss.deployment.MainDeployer.deploy(MainDeployer.java:738)
        at sun.reflect.GeneratedMethodAccessor48.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAcces
sorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:324)
        at org.jboss.mx.interceptor.ReflectedDispatcher.invoke(ReflectedDispatch
er.java:144)
        at org.jboss.mx.server.Invocation.dispatch(Invocation.java:80)
        at org.jboss.mx.interceptor.AbstractInterceptor.invoke(AbstractIntercept
or.java:122)
        at org.jboss.mx.server.Invocation.invoke(Invocation.java:74)
        at org.jboss.mx.interceptor.ModelMBeanOperationInterceptor.invoke(ModelM
BeanOperationInterceptor.java:131)
        at org.jboss.mx.server.Invocation.invoke(Invocation.java:74)
        at org.jboss.mx.server.AbstractMBeanInvoker.invoke(AbstractMBeanInvoker.
java:249)
        at org.jboss.mx.server.MBeanServerImpl.invoke(MBeanServerImpl.java:642)
        at org.jboss.mx.util.MBeanProxyExt.invoke(MBeanProxyExt.java:177)
        at $Proxy8.deploy(Unknown Source)
        at org.jboss.deployment.scanner.URLDeploymentScanner.deploy(URLDeploymen
tScanner.java:305)
        at org.jboss.deployment.scanner.URLDeploymentScanner.scan(URLDeploymentS
canner.java:481)
        at org.jboss.deployment.scanner.AbstractDeploymentScanner$ScannerThread.
doScan(AbstractDeploymentScanner.java:204)
        at org.jboss.deployment.scanner.AbstractDeploymentScanner$ScannerThread.
loop(AbstractDeploymentScanner.java:215)
        at org.jboss.deployment.scanner.AbstractDeploymentScanner$ScannerThread.
run(AbstractDeploymentScanner.java:194)

Alguem sabe o q pode ser? Obrigado novamente! :slight_smile:
Vou procurar algo sobre o ant
valeu

Olá,

Cara, dificil dizer assim, você implementou os beans certinhos ? não esqueceu dos metodos ejbCreate()?

[]s

Luiz, essa linha do seu ejb-jar.xml está correta? A classe MeuEJB está no pacote “com.luizfar” ou no pacote “com.luizfar.ejb”?

eh, realmente estava errado o endereço.
O que acontece é que o pacote das classes era com.luizfar.ejb, mas o eclipse colocava automaticamente esse pacote dentro da pasta bin, por isso nao estava achando

obrigado pela ajuda de todos valeu mesmo!

Agora tou tentando fazer um cliente se conectar ao EJB, vou tentar hj a noite ou amanha, valeu :smiley:

olha só, eu consegui fazer o deploy.
Mas agora não está dando mais.
Eu coloco o MeuEJB.jar na pasta /server/default/deploy com o JBoss executando e nada acontece…

???

Obrigado :slight_smile: