= Hello World
:index-group: Unrevised
:jbake-date: 2018-12-05
:jbake-type: page
:jbake-status: published

This page shows the basic steps required to create, build, and
run an EJB and EJB client in its most minimum form. It does not hide
steps or rely on special build tools or IDEs and is about the most
stripped down you can get.

_See the link:examples.html[Examples] page for a full list of examples
that range from [`@Stateles`|Simple Stateless Example] and
[@Stateful|Simple Stateful Example] beans, to [Dependency
Injection|Injection of env-entry Example] , JDBC [DataSources|Injection
of DataSource Example] , JPA [EntityManagers|Injection of EntityManager
Example] and more._

== A basic EJB example

Here are some basic steps you need to perform to get started with
OpenEJB

[arabic]
. 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

== Download and install OpenEJB

This example pertains to OpenEJB 3.0 which can be
http://archive.apache.org/dist/openejb/3.0[downloaded here] . Once you
have downloaded OpenEJB, you can then simply extract the contents of the
downloaded file to whichever directory you want to install OpenEJB in.

After extracting the file contents, you should now see a directory named
openejb-3.0. If you look under this directory, you will find a few more
directories: - _bin_: Contains commands to start/stop the server (You
can also do a lot of other stuff like deploy/undeploy, but we will just
talk about things needed to get you started) - _lib_: Contains several
jar files (you only need of few of these jars in your classpath to do
EJB development) - _apps_: Once you create your EJB's and jar them up,
you can place your jar file in this directory and start the server. The
server will automatically deploy all the EJB's contained in this JAR. -
_conf_: This directory contains all the configuration files. Although
you may not see any file except for a README.txt file right now, but
after you start the server, the required configuration files will be
automatically created. It is highly recommended to read the README.txt
file under this directory - _logs_: Contains log files.

== Setup your development environment

=== Create a working directory Assuming you are in your home directory,
create a directory named projects

[source,bash]
----
karan@poweredge:~$ mkdir projects
----

Go to the projects directory

[source,bash]
----
karan@poweredge:~$ cd projects
----

We will do all our work in this directory. ### Install Java Download and
install Java (version 5 or higher). Also set it up so that you can run
the java and javac commands from any directory ### Set OPENEJB_HOME We
will set up this variable to refer to the openejb install location.

[source,bash]
----
karan@poweredge:~/projects$ export
----

OPENEJB_HOME=/home/karan/install/openejb-3.0

== Write an EJB Whatever files you create should be placed under the
projects directory ### Create the Remote Interface Using your favorite
editor, create a file named Hello.java (shown below)

[source,java]
----
package org.acme;
import jakarta.ejb.Remote;
@Remote
public interface Hello{
    public String sayHello();
}
----

=== Create the Bean Class Now create a file named HelloBean.java (shown
below)

[source,java]
----
package org.acme;
import jakarta.ejb.Stateless;
@Stateless
public class HelloBean implements Hello{
    public String sayHello(){
        return "Hello World!!!!";
    }
}
----

=== Compile the source code Since we have imported the
jakarta.ejb.Stateless and jakarta.ejb.Remote annotations, we need these in
our classpath to compile our source code. These annotations can be found
in the $OPENEJB_HOME/lib/javaee-5.0-1.jar. Let's compile our source (make
sure you are in the projects directory)

[source,bash]
----
karan@poweredge:~/projects$ javac -cp $OPENEJB_HOME/lib/javaee-5.0-1.jar -d
----

. *.java

The above will compile all the .java files and also create the required
packages. You should now see a package named org under the project's
directory. All class files should be under org/acme directory. ###
Package the EJB To package the EJB into a JAR, run the following command
while you are in the projects directory

[source,bash]
----
karan@poweredge:~/projects$ jar cvf hello.jar org
----

The above command will package everything under the org directory
(including the org directory itself) into a jar file named hello.jar.
Below is the output from running the above command:

[source,bash]
----
karan@poweredge:~/projects$ jar cvf hello.jar org
added manifest
adding: org/(in = 0) (out= 0)(stored 0%)
adding: org/acme/(in = 0) (out= 0)(stored 0%)
adding: org/acme/Hello.class(in = 203) (out= 168)(deflated 17%)
adding: org/acme/HelloBean.class(in = 383) (out= 275)(deflated 28%)
----

== Write an EJB Client Now we will write a Client class which will
lookup the EJB , invoke the sayHello() business method and print the
value returned from the method. While you are in the projects directory,
create a new file named HelloClient.java . Add the following to this
file:

[source,java]
----
package org.acme;
import java.util.Properties;
import javax.naming.InitialContext;
import javax.naming.Context;
import javax.rmi.PortableRemoteObject;
public class HelloClient{
        public static void main(String[]
----

args) throws Exception\{ Properties props = new Properties();

props.put(Context.INITIAL_CONTEXT_FACTORY,"org.apache.openejb.client.RemoteInitialContextFactory");
props.put(Context.PROVIDER_URL,"ejbd://127.0.0.1:4201"); Context ctx =
new InitialContext(props); Object ref = ctx.lookup("HelloBeanRemote");
Hello h = (Hello)PortableRemoteObject.narrow(ref,Hello.class); String
result = h.sayHello(); System.out.println(result); } }

=== Compile HelloClient.java Run the following command:

[source,bash]
----
karan@poweredge:~/projects$ javac  -d . HelloClient.java
----

== Start the Server Go to the OpenEJB install directory (i.e.
OPENEJB_HOME) and run the following command:

[source,bash]
----
karan@poweredge:~/install/openejb-3.0$ bin/openejb start
----

Once the Server starts, you will see an output similar to the below in
your console:

[source,bash]
----
karan@poweredge:~/install/openejb-3.0$ bin/openejb start
Apache OpenEJB 3.0    build: 20070926-12:34
http://tomee.apache.org/
OpenEJB ready.
[OPENEJB:init]
----

OpenEJB Remote Server ** Starting Services ** NAME IP PORT +
httpejbd 0.0.0.0 4204 +
telnet 0.0.0.0 4202 +
ejbd 0.0.0.0 4201 +
hsql 0.0.0.0 9001 +
admin thread 0.0.0.0 4200 +
------- Ready!

Take out a minute to browse through the conf and logs directories. You
should now see some configuration and log files under the respective
directories. ## Deploy the EJB We will now use the deploy command to
deploy the EJB in hello.jar. While you are in the projects directory,
run the following command:

[source,bash]
----
karan@poweredge:~/projects$ $OPENEJB_HOME/bin/openejb deploy hello.jar
----

The above command should give you the following output:

[source,bash]
----
karan@poweredge:~/projects$ $OPENEJB_HOME/bin/openejb deploy hello.jar
Application deployed successfully at "hello.jar"
App(id=/home/karan/projects/hello.jar)
    EjbJar(id=hello.jar, path=/home/karan/projects/hello.jar)
    Ejb(ejb-name=HelloBean, id=HelloBean)
        Jndi(name=HelloBeanRemote)
----

Notice how the output neatly lays out various deployment details. One
thing you might want to note from the output is the JNDI name. This is
the JNDI name we used in the client to lookup the EJB ## Run the Client
While you are in the projects directory, run the following command to
run the client:

[source,bash]
----
karan@poweredge:~/projects$ java -cp
----

latexmath:[$OPENEJB_HOME/lib/openejb-client-3.0.jar:$]OPENEJB_HOME/lib/javaee-5.0-1.jar:.
org.acme.HelloClient

The above should give you the following output:

[source,properties]
----
Hello World!!!!
----

== Help! It didn't work for me!!. No problem, we are here to help.
Just send us an email at users@tomee.apache.org. If possible, send us
the contents of logs/openejb.log file in the email.

= Looking for more?

More EJB 3.0 examples, sample applications, tutorials and howtos
available link:examples.html[here] .
