Miles to go ...

Arun Gupta is a Technology Evangelist for Web Services and Web 2.0 Apps at Sun. He was the spec lead for APIs in the Java platform, committer in multiple Open Source projects, participated in standard bodies and contributed to Java EE and SE releases.
« FREE 20-week Ruby-on... | Main | Socialsite @ Enterpr... »

http://blogs.sun.com/arungupta/date/20080521 Wednesday May 21, 2008

Embeddable GlassFish in Action - Servlet in a Maven project

Kohsuke announced the embedability of GlassFish v3 - this is really cool! Now you can run GlassFish inside an existing JVM, without the need to start it externally. The API javadocs are available here. This blog explains how to host a Servlet using these APIs and write a simple Maven test to invoke the Servlet - all within the same VM.

The blog creates a Maven project using NetBeans but Maven CLI can be used as well.

In the NetBeans IDE, if Maven plugin is not already installed, then install it using "Tools", "Plugins","Available Plugins".

  1. Create a new Maven project
    1. Create a new project in NetBeans IDE and select "Maven" types as shown below



      Click on "Next >".
    2. Take the default "Archetype" as shown:



      Click on "Next >".
    3. Enter the "Project Name" and "Artifact Id" as shown below:



      and click on "Finish". The following output is shown in NetBeans Output window:



      This confirms the successful creation of the project.

      The command-line equivalent for all the above steps is:

      mvn archetype:create -DarchetypeGroupId=org.apache.maven.archetypes -DgroupId=org.glassfish.embedded.samples -DartifactId=webtier
  2. Update pom.xml with repositories & dependencies
    1. Expand "Project Files" and open "pom.xml". Add the following repositories (right after <url>...</url> tags)

      <repositories>
          <repository>
            <id>glassfish-repository</id>
            <name>Java.net Repository for Glassfish</name>
            <url>http://download.java.net/maven/glassfish</url>
          </repository>
          <repository>
            <id>download.java.net</id>
            <name>Java.net Maven Repository</name>
            <url>http://download.java.net/maven/2</url>
          </repository>
        </repositories>
    2. Add the following fragment after "<repositories>" to set the target JDK as 1.5:

      <build>
          <plugins>
            <plugin>
              <groupId>org.apache.maven.plugins</groupId>
              <artifactId>maven-compiler-plugin</artifactId>
              <version>2.0.2</version>
              <configuration>
                <source>1.5</source>
                <target>1.5</target>
             </configuration>
           </plugin>
         </plugins>
       </build>
    3. Add the following dependencies (inside "<dependencies>" and after "</dependency>")

      <dependency>
            <groupId>org.glassfish.distributions</groupId>
            <artifactId>web-all</artifactId>
            <version>10.0-build-20080430</version>
          </dependency>
          <dependency>
            <groupId>org.glassfish.embedded</groupId>
            <artifactId>gf-embedded-api</artifactId>
            <version>1.0-alpha-4</version>
          </dependency>
  3. Add Servlet class
    1. Right-click on "Source packages", select "New", "Java Class..." and enter the value as shown below



      and click on "Finish".
    2. Replace the template class with the following Servlet

      package org.glassfish.embedded.samples.webtier;

      import java.io.IOException;
      import java.io.PrintWriter;
      import javax.servlet.ServletException;
      import javax.servlet.http.HttpServlet;
      import javax.servlet.http.HttpServletRequest;
      import javax.servlet.http.HttpServletResponse;

      /**
       * @author Arun Gupta
       */
      public class SimpleServlet extends HttpServlet {

          @Override
          protected void doGet(HttpServletRequest request,
                  HttpServletResponse response)
                  throws ServletException, IOException {
              PrintWriter out = response.getWriter();
              out.println("Wow, I'm embedded!");
          }
      }

      This is a simple Servlet class.
  4. Add deployment descriptor (this step could be made optional with possibly a default mapping)
    1. In the "Files" window, expand "src", "main", right-click and select "New", "Folder..." as shown below ...



      and give the folder name as "resources" as shown ...



      ... click on "Finish".
    2. Using the same mechanism, create a new folder "WEB-INF" in "resources". Right-click on "WEB-INF" and select "New", "XML Document..." as shown:

    3. Enter the name as "web" as shown


    4. Click on "Next >", take defaults and click on "Finish". Replace the content of generated "web.xml" with the following ...

      <?xml version="1.0" encoding="UTF-8"?>
      <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
          <servlet>
              <servlet-name>SimpleServlet</servlet-name>
              <servlet-class>org.glassfish.embedded.samples.webtier.SimpleServlet</servlet-class>
          </servlet>
          <servlet-mapping>
              <servlet-name>SimpleServlet</servlet-name>
              <url-pattern>/SimpleServlet</url-pattern>
          </servlet-mapping>
      </web-app>

  5. Add a new test to invoke the Servlet
    1. In "Projects", expand "Test Packages" and open "org.glassfish.embedded.samples.webtier.AppTest" as shown:

    2. Add the following fragment at end of the class:

          private final String NAME = "AppTest";

          public void testServlet() throws Exception {
              int port = 9999;
              GlassFish glassfish = newGlassFish(port);
              URL url = new URL("http://localhost:" + port + "/" + NAME + "/SimpleServlet");
              BufferedReader br = new BufferedReader(
                      new InputStreamReader(
                      url.openConnection().getInputStream()));
              assertEquals("Wow, I'm embedded!", br.readLine());
              glassfish.stop();
          }

          private GlassFish newGlassFish(int port) throws Exception {
              GlassFish glassfish = new GlassFish(port);
              ScatteredWar war = new ScatteredWar(NAME,
                      new File("src/main/resources"),
                      new File("src/main/resources/WEB-INF/web.xml"),
                      Collections.singleton(new File("target/classes").toURI().toURL()));
              glassfish.deploy(war);
              System.out.println("Ready ...");
              return glassfish;
          }
    3. Right-click in the editor window and select "Fix Imports" as shown


    4. Take all the defaults as shown



      and click on "OK".
    5. The complete project structure looks like:

  6. Run the Test (mvn test)
    1. In Projects window, right-click the project and select "Test" as shown:

    2. The Output window shows the result as:



      Notice how GlassFish v3 started in 598 milliseconds (around 0.5 sec) and all the tests passed.
This is a work in progress and we would like to hear your feedback at users@glassfish and GlassFish Forum.

How are you using GlassFish embeddability ?

Technorati: glassfish v3 embedded servlet netbeans

del.icio.us | furl | simpy | slashdot | technorati | digg
Comments:

Wow! This is kinda cool!

Posted by Jason on May 23, 2008 at 11:10 AM PDT #

[Trackback] GlassFish v3 is a modular (OSGi compliant), embeddable (runs in-VM) and extensible (supports non-Java apps) Application Server. The extensible part is demonstrated by deployment of Rails and Grails applications. An example of embeddability is an in-VM...

Posted by Arun Gupta's Blog on June 26, 2008 at 06:17 AM PDT #

Really cool! Do you by chance know how to hook up a datasource to an embedded glassfish instance?

Posted by Justin Spradlin on June 26, 2008 at 12:50 PM PDT #

[Trackback] I presented on GlassFish at Utah JUG yesterday,&nbsp;slides are available. The topic provided insight into GlassFish v2, the current production version, and GlassFish v3 - the upcoming&nbsp;modular, embeddable &amp; extensible version. There were close...

Posted by Arun Gupta's Blog on July 18, 2008 at 07:11 AM PDT #

[Trackback] Would you like to influence the quality of GlassFish ? The GlassFish Quality Group is starting Community Acceptance Testing - a community based testing of upcoming GlassFish v3. This is your chance to provide an early feedback on stability...

Posted by Arun Gupta's Blog on August 13, 2008 at 06:23 AM PDT #

Post a Comment:
  • HTML Syntax: NOT allowed
« FREE 20-week Ruby-on... | Main | Socialsite @ Enterpr... »

Valid HTML! Valid CSS!

This is a personal weblog, I do not speak for my employer.

--> ajax ajaxworld conf eclipse fitness gem glassfish glassfishday hyderabad india indigo interoperability javaone javaone2008 jax-ws jmaki jpa jruby mac marathon metro microsoft mysql netbeans phobos photography presos railsconf ruby rubyonrails running runninglog runsfm screencast siliconvalleymarathon sun suntechdays swdp tango theserverside totd training traveltips v3 vista wcf web2.0 webservices webtier windows wsaddressing wsit youtube
Locations of visitors to this page

calendar

« September 2008
SunMonTueWedThuFriSat
 
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
    
       
Today
www.flickr.com
This is a Flickr badge showing public photos from ArunGupta. Make your own badge here.
Add to Technorati Favorites

Last 50