Posted by
arungupta on May 22, 2008 at 6:15 AM PDT
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".
- Create a new Maven project
- Create a new project in NetBeans IDE and select "Maven"
types as shown below

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

Click on "Next >".
- 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 |
- Update pom.xml with repositories
& dependencies
- 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> |
- 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> |
- 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> |
- Add Servlet class
- Right-click on "Source packages", select "New", "Java
Class..." and
enter the value as shown below

and click on "Finish".
- 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.
- Add deployment descriptor (this step could be made optional
with possibly a default mapping)
- 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".
- Using the same mechanism, create a new folder
"WEB-INF" in "resources". Right-click on "WEB-INF" and select "New",
"XML Document..." as shown:

- Enter the name as "web" as shown

- 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> |
- Add a new test to invoke the Servlet
- In "Projects", expand "Test Packages" and open
"org.glassfish.embedded.samples.webtier.AppTest" as shown:

- 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;
} |
- Right-click in the editor window and select "Fix Imports"
as shown

- Take all the defaults as shown

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

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

- 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 embeddable
servlet
netbeans