h2. &nbsp;The following instructions are written using Eclipse 3.2. We will refer to the install location of OpenEJB as OPENEJB_HOME

Here are some basic steps you need to perform to get started with OpenEJB
# Download and install OpenEJB
# Setup your development environment
# Write an EJB
# Write an EJB client
# Start the server
# Deploy the EJB
# Run the client
# Stop the server

{quote}

{quote}

h2. &nbsp;1. Download and Install OpenEJB

Follow these&nbsp;[instructions|http://cwiki.apache.org/confluence/display/OPENEJB/Quickstart]

h2. &nbsp;2. Setup your development environment


h3. &nbsp;Eclipse

# Open eclipse and create a new java project. Name it EJBProject
# Add the following jars to the build path of your project
## OPENEJB_HOME/lib/geronimo-ejb_3.0_spec-1.0.jar
# Now create another project named EJBClient. This is where we will write a test client
# Add the following jars to the build path of this project
## OPENEJB_HOME/lib/openejb-client-3.0.0-SNAPSHOT.jar
# Add the EJBProject to the classpath of the EJBClient project

h2. &nbsp;3. Start the Server

Open the command prompt and run the following command:
{noformat}
d:\openejb-3.0.0-SNAPSHOT\bin\openejb start
{noformat}
You will get the following message on the console:
{noformat}
D:\openejb-3.0.0-SNAPSHOT>bin\openejb start
Apache OpenEJB 3.0.0-SNAPSHOT    build: 20070830-07:53
http://openejb.apache.org/
OpenEJB ready.
[OPENEJB:init] OpenEJB Remote Server
  ** Starting Services **
  NAME                 IP              PORT
  httpejbd             0.0.0.0         4204
  admin thread         0.0.0.0         4200
  ejbd                 0.0.0.0         4201
  hsql                 0.0.0.0         9001
  telnet               0.0.0.0         4202
-------
Ready!
{noformat}

h2. &nbsp;4. Write an EJB

In the EJB project create a new interface named Greeting
{code}
package com.myejbs;

import javax.ejb.Remote;

@Remote
public interface Greeting {
  public String greet();
}
{code}
Now create a new class named GreetingBean which implements the above interface (shown below)
{code}
package com.myejbs;

import javax.ejb.Stateless;

@Stateless
public class GreetingBean implements Greeting {

	public String greet() {
		return "My First Remote Stateless Session Bean";
	}

}
{code}

h2. &nbsp; 5. Deploy the EJB

# Export the EJBProject as a jar file. Name it greeting.jar and put it in the OPENEJB_HOME/apps directory.
# Open the command prompt and type in the following command:

{noformat}
d:\openejb-3.0.0-SNAPSHOT > bin\openejb deploy apps\greeting.jar
{noformat}
This should give you the following output:
{noformat}
D:\openejb-3.0.0-SNAPSHOT>bin\openejb deploy apps\greeting.jar

Application deployed successfully at \{0\}

App(id=D:\openejb-3.0.0-SNAPSHOT\apps\greeting.jar)

    EjbJar(id=greeting.jar, path=D:\openejb-3.0.0-SNAPSHOT\apps\greeting.jar)

        Ejb(ejb-name=GreetingBean, id=GreetingBean)

            Jndi(name=GreetingBeanRemote)
{noformat}
{color:#330000}{*}Notice the Jndi(name=GreetingBeanRemote) information. Keep this handy as this is the JNDI name of the bean which the client will use for lookup{*}{color}

h2. &nbsp;6. Write the Client

In the EJBClient project, create a class named Client (shown below)
{code}
package com.myclient;

import com.myejbs.Greeting;

import javax.naming.InitialContext;
import java.util.Properties;

public class Client {
    public static void main(String[] args) {

        try {
            Properties p = new Properties();
            p.put("java.naming.factory.initial", "org.openejb.client.RemoteInitialContextFactory");
            p.put("java.naming.provider.url", "ejbd://127.0.0.1:4201");
            InitialContext ctx = new InitialContext(p);
            Greeting greeter = (Greeting) ctx.lookup("GreetingBeanRemote");
            String message = greeter.greet();
            System.out.println(message);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
{code}

h2. &nbsp;7. Run the Client

Open Client.java in eclipse and run it as a java application. You should see the following message in the console view:
{noformat}
My First Remote Stateless Session Bean
{noformat}

h2. &nbsp;8. Stop the server

There are two ways to stop the server:
# You can press Ctrl+c on the command prompt to stop the server
# On the command prompt type in the following command:
{noformat}
D:\openejb-3.0.0-SNAPSHOT>bin\openejb stop
{noformat}
