As discussed in detail in my
book, developing EJB clients with Java EE 5 is very easy when the client
application is managed by the EJB container, for example a servlet or a
JSF managed bean. For these types of clients, all that is needed to
access the EJB is to decorate the declaration of the class variable with
the @EJB
annotation, and an instance of a class
implementing the session bean's remote (or local, as the case might be)
interface will be automatically injected at runtime via dependency
injection.
For example, a servlet that acts as a client for a session bean could be coded as illustrated in the following example:
public class MyServlet extends HttpServlet
{
@EJB
private static MySession mySession;
protected void doGet()
{
//we can simply use our session bean since it is
//automatically injected at runtime.
mySession.doSomething();
}
}
Unfortunately, for stand-alone EJB clients, the technique demonstrated in this example does not work, since the client code needs to be executing inside the application server. Instead, we need to do a JNDI lookup to obtain a reference to the session bean's remote or local interface (at least we skip the step of having to lookup the bean's home interface, then obtaining the implementation of the bean's remote or local interface from it, as was the case with older J2EE applications).
Fortunately for those of us using GlassFish to deploy our Java EE 5 applications, when using this application server there are a couple of ways we can use EJB dependency injection when developing a stand alone EJB client.
One way we can use the above technique when we need a stand alone
EJB client is to use the appclient
utility included with
GlassFish. This utility is essentially a "client container", it wraps an
executable JAR file in a container, allowing us to use dependency
injection as illustrated in the example. The appclient executable can be
found in the bin
subdirectory of the directory where
GlassFish was installed.
In order for the appclient
utility to work, our
client must be packaged in an executable JAR file. As experienced Java
developers know, a JAR file can be made executable by creating a file
called MANIFEST.MF
containing the following line:
Main-Class: net.ensode.App
Of course, net.ensode.App
needs to be replaced with
the fully qualified name of the class containing the main()
method we want to execute when executing the JAR file. Most modern IDE's
such as Eclipse, NetBeans, IntelliJ Idea, etc. and build tools such as
ANT or Maven can automate the creation of executable JAR files.
In any case, once we have an executable JAR file, we can "wrap"
it in a client container by passing it as a parameter to the appclient
utility:
appclient myjar.jar
The above command assumes the appclient utility is in the system PATH. Once it is executed, the client JAR file will behave as if it was deployed in the Java EE 5 application server.
The above technique works great, however it has the disadvantage
that we (and our users!) need to remember to use the appclient
utility every time the application is executed. Also, just like most
stand alone applications, and unlike web applications, distributing
updated versions of our application to the users is not trivial nor
automatic.
Fortunately, there is an alternate way we can have EJB dependency injection work with a stand alone, Java Swing based application. A very nice feature of GlassFish version 2 is that it allows any Java Swing application to be deployed as a Java Web Start application.
Java Webstart applications are stand alone Java applications that are distributed via the browser. The first time the user points the web browser to the URL of a Java Web Start application, the application is automatically downloaded and installed in the user's hard drive. On subsequent times, Java Web Start will check to see if a new version of the application has been deployed, and if this is the case the new version is downloaded and installed automatically, if no new version has been deployed, the current version is simply executed.
GlassFish makes it dead easy to deploy an application as a Java
Web Start application, all we need to do is copy an executable JAR file
to the autodeploy
directory under the domain directory
where we wish to deploy our application. Since Java Web Start
applications are considered to be "in the container" EJB dependency
injection works properly.
For more information on GlassFish and Java EE 5 development, please check out my book, Java EE 5 Development using GlassFish Application Server.