Submit your JavaOne abstracts!
I case you hadn't noticed :-) despite the recent transition, JavaOne is indeed happening. The call for papers went out a while ago, and it's it's about to close, so submit your proposal today!.
It promises to be a giant year with JavaOne being just a few blocks from Oracle OpenWorld. That few blocks should provide a gap of sanity (opportunity?) between the Geeks and the BizTypes. San Francisco will be bursting at the seams. TOTD #120: Deployment Descriptor-free Java EE 6 application using JSF 2.0 + EJB 3.1 + Servlets 3.0
Here is trivial Java EE 6 application that is keeping you away from any deployment descriptors. It uses Java Server Faces 2.0, Enterprise Java Beans 3.1, and Servlet 3.0. This application shows the following Java EE 6 features:
- No-interface view for EJB
- EJBs packaged in a WAR file
- Optional "faces-config.xml" for Java Server Faces
- FacesServlet registered using Servlet 3.0 programmatic registration APIs
- Java Server Faces navigation rules using convention-over-configuration
- Optional "web.xml" for Servlets 3.0
The WAR file structure is:
./index.jsp ./index.xhtml ./META-INF ./show.xhtml ./WEB-INF ./WEB-INF/classes ./WEB-INF/classes/org ./WEB-INF/classes/org/glassfish ./WEB-INF/classes/org/glassfish/samples ./WEB-INF/classes/org/glassfish/samples/SimpleBean.class ./WEB-INF/classes/org/glassfish/samples/SimpleEJB.class ./WEB-INF/classes/org/glassfish/samples/SimpleServlet.class
Look ma, no deployment descriptors!
So how do you create this application:
mvn archetype:create -DarchetypeGroupId=org.apache.maven.archetypes -DgroupId=org.glassfish.samples -DartifactId=simplewebapp
This application is purposely not generated as a web application (missing "-DarchetypeArtifactId=maven-archetype-webapp"). If you specify this property then it will generate "WEB-INF/web.xml" which we don't intend to use.
Change "pom.xml" to:
<project xmlns="http://maven.apache.org/POM/4.0.0" Â xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Â xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> Â Â <modelVersion>4.0.0</modelVersion> Â Â <groupId>org.glassfish.samples</groupId> Â Â <artifactId>simplewebapp</artifactId> Â Â <packaging>war</packaging> Â Â <version>1.0-SNAPSHOT</version> Â Â <name>simplewebapp</name> Â Â <url>http://maven.apache.org</url> Â Â <repositories> Â Â Â Â <repository> Â Â Â Â Â Â <id>glassfish-repository</id> Â Â Â Â Â Â <name>Java.net Repository for Glassfish</name> Â Â Â Â Â Â <url>http://download.java.net/maven/glassfish</url> Â Â Â Â </repository> Â Â </repositories> Â Â <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> Â Â Â Â Â Â <plugin> Â Â Â Â Â Â Â Â <groupId>org.apache.maven.plugins</groupId> Â Â Â Â Â Â Â Â <artifactId>maven-war-plugin</artifactId> Â Â Â Â Â Â Â Â <version>2.1-beta-1</version> Â Â Â Â Â Â Â Â <configuration> Â Â Â Â Â Â Â Â Â Â <failOnMissingWebXml>false</failOnMissingWebXml> Â Â Â Â Â Â Â Â </configuration> Â Â Â Â Â Â </plugin> Â Â Â Â </plugins> Â Â </build> Â Â <dependencies> Â Â Â Â <dependency> Â Â Â Â Â Â <groupId>junit</groupId> Â Â Â Â Â Â <artifactId>junit</artifactId> Â Â Â Â Â Â <version>3.8.1</version> Â Â Â Â Â Â <scope>test</scope> Â Â Â Â </dependency> Â Â Â <dependency> Â Â Â Â Â Â <groupId>javax</groupId> Â Â Â Â Â Â <artifactId>javaee-api</artifactId> Â Â Â Â Â Â <version>6.0</version> Â Â Â Â Â Â <scope>provided</scope> Â Â Â </dependency> Â Â </dependencies> </project>
In the above code:
- "maven-compiler-plugin" needs to be specified as the default source level for Maven compile plugin is JDK 1.3. It's been over 9 years JDK 1.3 was released, not even listed on Java SE standard downloads page, EOLed many years ago. Vote/Comment for the issue MCOMPILER-80 if you'd like this bug to be fixed.
- Adding "failOnMissingWebXml" ensures that Maven packages the WAR file even though no "web.xml" is present.
- The complete list of Maven coordinates for GlassFish are available here.
Create the directory structure as:
./src/main ./src/main/java ./src/main/java/org ./src/main/java/org/glassfish ./src/main/java/org/glassfish/samples ./src/main/java/org/glassfish/samples/SimpleBean.java ./src/main/java/org/glassfish/samples/SimpleEJB.java ./src/main/java/org/glassfish/samples/SimpleServlet.java ./src/main/webapp ./src/main/webapp/index.jsp ./src/main/webapp/index.xhtml ./src/main/webapp/show.xhtml
Once again, there are no deployment descriptors, just plain Java files and XHTML/JSP pages.
Here are the different source files with explanation after each one of them:
SimpleBean.java
package org.glassfish.samples;
import javax.faces.bean.ManagedBean;
@ManagedBean(name="simplebean")
public class SimpleBean {
   private String name;
   private int age;
   public String getName() { return name; }
   public void setName(String name) { this.name = name; }
   public int getAge() { return age; }
   public void setAge(int age) { this.age = age; }
}
This is currently a simple JSF managed bean. TOTD #109 explains how to convert a JSF managed bean to use CDI. A future blog will show how to convert this sample to use CDI.
SimpleEJB.java
package org.glassfish.samples;
import javax.ejb.Stateless;
@Stateless
public class SimpleEJB {
   public String sayHello(String name) {
       return "Hello " + name + "!!!";
   }
}
The session bean has no interface, just the @Stateless annotation.
SimpleServlet.java
package org.glassfish.samples;
import javax.ejb.EJB;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.annotation.WebServlet;
import java.io.PrintWriter;
import java.io.IOException;
/**
* Hello world!
*/
@WebServlet(urlPatterns={"/SimpleServlet"})
public class SimpleServlet extends HttpServlet {
@EJB SimpleEJB bean;
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
PrintWriter out = response.getWriter();
out.println("<html><body>");
out.println("<h2>Serving at: " + request.getContextPath() + "</h2>");
out.println("<h2>Invoking EJB: " + bean.sayHello("Duke") + "</h2>");
out.println("</body></html>");
}
}
The servlet injects the EJB in the application, display the servlet context and the result of invoking the business operation of the EJB.
index.jsp
<html> <body> <h2>Hello World!</h2> Invoke the Servlet by clicking <a href="SimpleServlet">here</a>. </body> </html>
This is just a placeholder for invoking the servlet.
index.xhtml
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtm
l1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html">
<h:head>
<title>Enter Name & Age</title>
</h:head>
<h:body>
<h1>Enter Name & Age</h1>
<h:form>
<h:panelGrid columns="2">
<h:outputText value="Name:"/>
<h:inputText value="#{simplebean.name}" title="name" id="name" required="true"/>
<h:outputText value="Age:"/>
<h:inputText value="#{simplebean.age}" title="age" id="age" required="true"/>
</h:panelGrid>
<h:commandButton action="show" value="submit"/>
</h:form>
</h:body>
</html>
JSF 2 uses Facelets as viewing technology and so an ".xhtml" file is used for all the JSF tags. This page is intentionally kept simple and not using any templating, composition, or any other features of Facelets. This page renders an HTML form with two text boxes and a command button, binds the value of text box to the managed bean, and displays the page "show.xhtml" when the command button is clicked. The default JSF 2 navigation handler try to match a view on the disk ("show.xhtml" in this case) based upon the "action" attribute.
show.xhtml
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtm
l1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html">
<h:head>
<title>Show Name & Age</title>
</h:head>
<h:body>
<h1>Show Name & Age</h1>
<h:form action="show">
<h:panelGrid columns="2">
<h:outputText value="Name:"/>
<h:outputText value="#{simplebean.name}" />
<h:outputText value="Age:"/>
<h:outputText value="#{simplebean.age}" />
</h:panelGrid>
</h:form>
</h:body>
</html>
This page reads the bean properties (stored from previous page) and displays them on the page.
How do you build this entire application ?
mvn clean package
Lets deploy the application on a Java EE 6 compliant application server, GlassFish v3 (download here):
./bin/asadmin deploy --force=true ~/samples/javaee6/simplewebapp/target/simplewebapp-1.0-SNAPSHOT.war
And now your application is accessible at "http://localhost:8080/simplewebapp-1.0-SNAPSHOT/index.jsp" and looks like:

Clicking on "here" looks like:

The JSF page is accessible at "http://localhost:8080/simplewebapp-1.0-SNAPSHOT/index.jsf" and looks like (after entering the values):

Notice that even though the page is named "index.xhtml", it's accessed as "index.jsf". This is because the JSF specification provides recommended mapping for FacesServlet to "*.faces" and "/faces/*". In addition, Mojarra (Reference Implementation of JSF2 in GlassFish) also adds a mapping to "*.jsf". Any views using these URL pattersn are routed through FacesServlet. So alternative URLs for our page are "http://localhost:8080/simplewebapp-1.0-SNAPSHOT/index.faces" and "http://localhost:8080/simplewebapp-1.0-SNAPSHOT/faces/index.xhtml".
Clicking on "Submit" shows the following page:

That's it!
Here are several other useful entries:
- TOTD #109 : How to convert a JSF managed bean to JSR 299 bean (Web Beans) ?
- TOTD #108 : Java EE 6 web application (JSF 2.0 + JPA 2.0 + EJB 3.1) using Oracle, NetBeans, and GlassFish
- TOTD #102 : Java EE 6 (Servlet 3.0 and EJB 3.1) wizards in Eclipse
- TOTD #99 : Creating a Java EE 6 application using MySQL, JPA 2.0 and Servlet 3.0 with GlassFish Tools Bundle for Eclipse
- TOTD #98 : Create a Metro JAX-WS Web service using GlassFish Tools Bundle for Eclipse
- TOTD #95 : EJB 3.1 + Java Server Faces 2.0 + JPA 2.0 web application - Getting Started with Java EE 6 using NetBeans 6.8 M1 & GlassFish v3
- TOTD #94 : A simple Java Server Faces 2.0 + JPA 2.0 application - Getting Started with Java EE 6 using NetBeans 6.8 M1 & GlassFish v3
- TOTD #93 : Getting Started with Java EE 6 using NetBeans 6.8 M1 & GlassFish v3 - A simple Servlet 3.0 + JPA 2.0 app
The next follow up blog will show "Hello World"s of Context & Dependency Injection, Bean Validation, Java API for Restful Web services, Java Persistence API, Interceptors, and other Java EE 6 specifications in this application.
Technorati: totd javaee glassfish v3 javaserverfaces servlet3 ejb maven
The ‘Bottom Line’ in the Maven – Ant Debate
Much has been said in the blogosphere about the differences between Maven and Ant. Lines have been drawn between tech bloggers, and one thing has become clear; people love to argue about Maven versus Ant. And we love the debate. Constructive criticism is what keeps companies fresh, and products user-friendly. Here is another chapter in the debate:
To read the full post, click here.
P2 in Final Round of Eclipse Community Awards!
Sonatype is excited to announce that p2 is one of the finalists for the Eclipse Community Award! P2 is a finalist in the ‘most open project’ category. The winners will be announced at EclipseCon 2010 on March 22. Sonatype’s Pascal Rapicault was also nominated in the ‘Top Committer’ category. To watch a screencast of Sonatype’s p2 support, click here.
Surviving GlassFish Without your IDE
Yesterday morning the USERS mailing list of GlassFish had a thread asking
How to start and run GlassFishV3 without Netbeans...
so, Alexis wrote and posted a
quick Survival Guide
on using GlassFish without an IDE
.
From question to documentation in a few hours: self-publishing, no webmaster to contact, all links to online documentation... and no lawyer to check with :-)
JPA with MySQL, EclipseLink, and GlassFish
This is a quick overview of new JPA features coupled with a NetBeans demo for which I put together a mapping from a MySQL database schema to JPA.
The replay is now available here.
GlassFish Jobs Spike at Indeed.COM after CiC
Indeed.COM shows a spike
in the number of GlassFish-related jobs around end of January
(snapshot,
live);
the date roughly coincides with the
reassuring noises
from Oracle on CiC.
The absolute job numbers are still small, but I expect them to continue to grow, specially as
we release our detailed Roadmap.
In other good adoption indicators:
• Mail traffic at USERS@GlassFish
;
see
MarkMail
• Google Trends
(snapshot,
live).
And, before you ask; the roadmap is very close...
Remembering Felipe Gaúcho
Our friend
Felipe Gaúcho
died of a heart attack this last Friday
.
Felipe was one of the founders of
CEJUG,
the Ceará JUG,
and created the
Premio Universitario Java.
You probably know Felipe from his active
blog
where he covered many topics - his last post was
just Thursday.
I last saw Felipe during JavaOne - full of enthusiasm as always - and we had exchanged email this Tuesday; we will all miss him sorely. Many other people also had the luck to work with him - see the notes from Hildeberto, PeterP, Claudio and Kevin.
My condolences to Felipe's family. If you knew Felipe, please consider leaving a comment in the CEJUG Notice.
TOTD #118: Managing OSGi bundles in GlassFish v3 - asadmin, filesystem, telnet console, web browser, REST, osgish
GlassFish v3 and OSGi integration is now known for almost two years. Several blogs have been published on this topic and googling on "glassfish osgi" shows 817,000 results. This blog has published four entries on the topic so far.
This Tip Of The Day (TOTD) will show the different ways you can manage OSGi bundles in GlassFish v3.
The first part is to create a trivial OSGi bundle as explained in TOTD #36.
-
Create a simple Maven project using the command as shown below:
~/samples/v3/osgi >mvn archetype:create -DarchetypeGroupId=org.apache.maven.archetypes -DgroupId=org.glassfish.samples.osgi.helloworld -DartifactId=helloworld [INFO] Scanning for projects... [INFO] Searching repository for plugin with prefix: 'archetype'. [INFO] ------------------------------------------------------------------------ [INFO] Building Maven Default Project [INFO] task-segment: [archetype:create] (aggregator-style) [INFO] ------------------------------------------------------------------------ [INFO] Setting property: classpath.resource.loader.class => 'org.codehaus.plexus.velocity.ContextClassLoaderResourceLoader'. [INFO] Setting property: velocimacro.messages.on => 'false'. [INFO] Setting property: resource.loader => 'classpath'. [INFO] Setting property: resource.manager.logwhenfound => 'false'. [INFO] [archetype:create] [WARNING] This goal is deprecated. Please use mvn archetype:generate instead [INFO] Defaulting package to group ID: org.glassfish.samples.osgi.helloworld [INFO] artifact org.apache.maven.archetypes:maven-archetype-quickstart: checking for updates from central [INFO] ---------------------------------------------------------------------------- [INFO] Using following parameters for creating OldArchetype: maven-archetype-quickstart:RELEASE [INFO] ---------------------------------------------------------------------------- [INFO] Parameter: groupId, Value: org.glassfish.samples.osgi.helloworld [INFO] Parameter: packageName, Value: org.glassfish.samples.osgi.helloworld [INFO] Parameter: package, Value: org.glassfish.samples.osgi.helloworld [INFO] Parameter: artifactId, Value: helloworld [INFO] Parameter: basedir, Value: /Users/arungupta/samples/v3/osgi [INFO] Parameter: version, Value: 1.0-SNAPSHOT [INFO] ********************* End of debug info from resources from generated POM *********************** [INFO] OldArchetype created in dir: /Users/arungupta/samples/v3/osgi/helloworld [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESSFUL [INFO] ------------------------------------------------------------------------ [INFO] Total time: 11 seconds [INFO] Finished at: Wed Jan 20 14:12:41 PST 2010 [INFO] Final Memory: 12M/80M [INFO] ------------------------------------------------------------------------
-
Change the generated App class in "src/main/java/org/glassfish/samples/osgi/helloworld" folder so that it looks like:
package org.glassfish.samples.osgi.helloworld; import org.osgi.framework.BundleActivator; import org.osgi.framework.BundleContext; /** * Hello world! * */ public class App implements BundleActivator { public void start(BundleContext context) throws Exception { System.out.println("Hey!"); } public void stop(BundleContext context) throws Exception { System.out.println("Bye!"); } }This is a trivial Activator class but sitll shows the key methods. The changes are highlighted in bold. -
Update "pom.xml" with the following changes:
- Change <packaging> to "bundle" from the default value of "jar".
- Add <dependency> on "org.osgi.core".
-
Add the <plugin> maven-bundle-plugin and provide <instructions> to generate the appropriate MANIFEST.MF.
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.glassfish.samples.osgi.helloworld</groupId> <artifactId>helloworld</artifactId> <packaging>bundle</packaging> <version>1.0-SNAPSHOT</version> <name>helloworld</name> <url>http://maven.apache.org</url> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> <dependency> <groupId>org.apache.felix</groupId> <artifactId>org.osgi.core</artifactId> <version>1.0.0</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.felix</groupId> <artifactId>maven-bundle-plugin</artifactId> Â Â Â Â Â Â <extensions>true</extensions> Â Â Â Â Â Â <configuration> Â Â Â Â Â Â Â Â <instructions> Â Â Â Â Â Â Â Â Â Â <Export-Package>${pom.groupId}</Export-Package> Â Â Â Â Â Â Â Â Â Â <Bundle-SymbolicName>${pom.artifactId}</Bundle-SymbolicName> Â Â Â Â Â Â Â Â Â Â <Bundle-Activator>${pom.groupId}.App</Bundle-Activator> Â Â Â Â Â Â Â Â </instructions> Â Â Â Â Â Â </configuration> Â Â Â Â </plugin> Â Â </plugins> </build> </project>
-
Generate the OSGi bundle as shown below:
~/samples/v3/osgi/helloworld >mvn install [INFO] Scanning for projects... [INFO] ------------------------------------------------------------------------ [INFO] Building helloworld [INFO] task-segment: [install] [INFO] ------------------------------------------------------------------------ [INFO] [resources:resources] [INFO] Using default encoding to copy filtered resources. [INFO] [compiler:compile] [INFO] Compiling 1 source file to /Users/arungupta/samples/v3/osgi/helloworld/target/classes [INFO] [resources:testResources] [INFO] Using default encoding to copy filtered resources. [INFO] [compiler:testCompile] [INFO] Compiling 1 source file to /Users/arungupta/samples/v3/osgi/helloworld/target/test-classes [INFO] [surefire:test] [INFO] Surefire report directory: /Users/arungupta/samples/v3/osgi/helloworld/target/surefire-reports ------------------------------------------------------- T E S T S ------------------------------------------------------- Running org.glassfish.samples.osgi.helloworld.AppTest Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.06 sec Results : Tests run: 1, Failures: 0, Errors: 0, Skipped: 0 [INFO] [bundle:bundle] [INFO] [install:install] [INFO] Installing /Users/arungupta/samples/v3/osgi/helloworld/target/helloworld-1.0-SNAPSHOT.jar to /Users/arungupta/.m2/repository/org/glassfish/samples/osgi/helloworld/helloworld/1.0-SNAPSHOT/helloworld-1.0-SNAPSHOT.jar [INFO] [bundle:install] [INFO] Parsing file:/Users/arungupta/.m2/repository/repository.xml [INFO] Installing org/glassfish/samples/osgi/helloworld/helloworld/1.0-SNAPSHOT/helloworld-1.0-SNAPSHOT.jar [INFO] Writing OBR metadata [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESSFUL [INFO] ------------------------------------------------------------------------ [INFO] Total time: 8 seconds [INFO] Finished at: Wed Jan 20 14:18:31 PST 2010 [INFO] Final Memory: 20M/80M [INFO] ------------------------------------------------------------------------
The generated "target/helloworld-1.0-SNAPSHOT.jar" has the following contents:
META-INF/MANIFEST.MF META-INF/ META-INF/maven/ META-INF/maven/org.glassfish.samples.osgi.helloworld/ META-INF/maven/org.glassfish.samples.osgi.helloworld/helloworld/ META-INF/maven/org.glassfish.samples.osgi.helloworld/helloworld/pom.properties META-INF/maven/org.glassfish.samples.osgi.helloworld/helloworld/pom.xml org/ org/glassfish/ org/glassfish/samples/ org/glassfish/samples/osgi/ org/glassfish/samples/osgi/helloworld/ org/glassfish/samples/osgi/helloworld/App.class
And the generated "MANIFEST.MF" looks like:
Manifest-Version: 1.0 Export-Package: org.glassfish.samples.osgi.helloworld;uses:="org.osgi. framework" Built-By: arungupta Tool: Bnd-0.0.357 Bundle-Name: helloworld Created-By: Apache Maven Bundle Plugin Bundle-Version: 1.0.0.SNAPSHOT Build-Jdk: 1.6.0_17 Bnd-LastModified: 1264025910352 Bundle-ManifestVersion: 2 Bundle-Activator: org.glassfish.samples.osgi.helloworld.App Import-Package: org.glassfish.samples.osgi.helloworld,org.osgi.framewo rk;version="1.3" Bundle-SymbolicName: helloworld
Lets install this newly created OSGi bundle in GlassFish v3. First, fire up GlassFish as:
~/tools/glassfish/v3/74b/glassfishv3/glassfish >./bin/asadmin start-domain -v
Jan 20, 2010 2:30:39 PM com.sun.enterprise.admin.launcher.GFLauncherLogger info
INFO: JVM invocation command line:
/System/Library/Frameworks/JavaVM.framework/Versions/1.6/Home/bin/java
-cp
/Users/arungupta/tools/glassfish/v3/74b/glassfishv3/glassfish/modules/glassfish.jar
-XX:+UnlockDiagnosticVMOptions
-XX:MaxPermSize=192m
-XX:NewRatio=2
-XX:+LogVMOutput
. . .
Jan 20, 2010 2:30:40 PM com.sun.enterprise.admin.launcher.GFLauncherLogger info
INFO: Successfully launched in 52 msec.
Jan 20, 2010 2:30:40 PM com.sun.enterprise.glassfish.bootstrap.ASMain main
INFO: Launching GlassFish on Felix platform
Welcome to Felix
================
[#|2010-01-20T14:30:49.437-0800|INFO|glassfishv3.0|com.sun.grizzly.config.GrizzlyServiceListener|_ThreadID=11;_ThreadName=FelixStartLevel;|Perform lazy SSL initialization for the listener 'http-listener-2'|#]
[#|2010-01-20T14:30:49.527-0800|INFO|glassfishv3.0|com.sun.grizzly.config.GrizzlyServiceListener|_ThreadID=12;_ThreadName=Thread-11;|Starting Grizzly Framework 1.9.18-k - Wed Jan 20 14:30:49 PST 2010|#]
. . .
[#|2010-01-20T14:30:58.668-0800|INFO|glassfishv3.0|javax.enterprise.system.std.com.sun.enterprise.v3.services.impl|_ThreadID=21;_ThreadName={felix.fileinstall.poll=5000, felix.fileinstall.bundles.new.start=true, felix.fileinstall.dir=/Users/arungupta/tools/glassfish/v3/74b/glassfishv3/glassfish/modules/autostart/, felix.fileinstall.debug=1};|Started bundle: file:/Users/arungupta/tools/glassfish/v3/74b/glassfishv3/glassfish/modules/autostart/org.apache.felix.scr.jar|#]
[#|2010-01-20T14:30:58.786-0800|INFO|glassfishv3.0|javax.enterprise.system.std.com.sun.enterprise.v3.services.impl|_ThreadID=21;_ThreadName={felix.fileinstall.poll=5000, felix.fileinstall.bundles.new.start=true, felix.fileinstall.dir=/Users/arungupta/tools/glassfish/v3/74b/glassfishv3/glassfish/modules/autostart/, felix.fileinstall.debug=1};|Started bundle: file:/Users/arungupta/tools/glassfish/v3/74b/glassfishv3/glassfish/modules/autostart/osgi-web-container.jar|#]
[#|2010-01-20T14:31:00.436-0800|INFO|glassfishv3.0|null|_ThreadID=23;_ThreadName=ping;|Total number of available updates : 0|#]
There are several ways to manage the OSGi bundles in GlassFish v3:
- The "asadmin" command (explained here)
- Filesystem operations using the pre-installed Apache Felix File Install bundle (explained here)
- A Telnet shell using pre-installed Apache Felix Remote Shell (explained here and TOTD #103)
- A Web browser using the Apache Felix Web Console (needs to be installed separately and more details below)
- A RESTful client by installing the REST console (need to be installed separately and more details below)
Lets explore each option in detail now.
Option 1: Manage the OSGi bundle using the "asadmin" command
-
Deploy the generated OSGi bundle using asadmin command:
~/samples/v3/osgi/helloworld/target >~/tools/glassfish/v3/74b/glassfishv3/glassfish/bin/asadmin deploy --type osgi helloworld-1.0-SNAPSHOT.jar Application deployed successfully with name helloworld-1.0-SNAPSHOT. Command deploy executed successfully.
The server log shows the following output:
[#|2010-01-20T16:15:10.553-0800|INFO|glassfishv3.0|javax.enterprise.system.std.com. sun.enterprise.v3.services.impl|_ThreadID=36;_ThreadName=http-thread-pool-4848-(2); |Hey!|#]
Notice "Hey!" message in the server log as the bundle gets started. -
Verify the installed bundle as:
~/samples/v3/osgi/helloworld/target >~/tools/glassfish/v3/74b/glassfishv3/glassfish/bin/asadmin list-applications helloworld-1.0-SNAPSHOT Command list-applications executed successfully.
Or if there are multiple applications deployed then only the OSGi bundles can be queried as:
~/samples/v3/osgi/helloworld/target >~/tools/glassfish/v3/74b/glassfishv3/glassfish/bin/asadmin list-applications --type osgi helloworld-1.0-SNAPSHOT Command list-applications executed successfully.
-
The bundle can be undeployed as:
~/samples/v3/osgi/helloworld/target >~/tools/glassfish/v3/74b/glassfishv3/glassfish/bin/asadmin undeploy helloworld-1.0-SNAPSHOT Command undeploy executed successfully.
And then the following message is shown on the console:
[#|2010-01-20T16:22:19.554-0800|INFO|glassfishv3.0|javax.enterprise.system.std.com. sun.enterprise.v3.services.impl|_ThreadID=37;_ThreadName=http-thread-pool-4848-(1); |Bye!|#]
Notice "Bye!" message in second line of the log output indicating the bundle is stopped.
Option 2: Manage the OSGi bundle using file system operations
-
Copy the generated jar (target/helloworld-1.0-SNAPSHOT.jar) in "modules/autostart" directory as:
~/tools/glassfish/v3/74b/glassfishv3/glassfish >cp ~/samples/v3/osgi/helloworld/target/helloworld-1.0-SNAPSHOT.jar modules/autostart/
and that shows the log output as:
[#|2010-01-20T16:29:04.625-0800|INFO|glassfishv3.0|javax.enterprise.system.std.com. sun.enterprise.v3.services.impl|_ThreadID=21;_ThreadName={felix.fileinstall.poll=5000, felix.fileinstall.bundles.new.start=true, felix.fileinstall.dir=/Users/arungupta/tools/glassfish/v3/74b/glassfishv3/glassfish /modules/autostart/, felix.fileinstall.debug=1};|Installed /Users/arungupta/tools/glassfish/v3/74b/glassfishv3/glassfish/modules/autostart/ helloworld-1.0-SNAPSHOT.jar|#] [#|2010-01-20T16:29:04.635-0800|INFO|glassfishv3.0|javax.enterprise.system.std.com. sun.enterprise.v3.services.impl|_ThreadID=21;_ThreadName={felix.fileinstall.poll=5000, felix.fileinstall.bundles.new.start=true, felix.fileinstall.dir=/Users/arungupta/tools/glassfish/v3/74b/glassfishv3/glassfish /modules/autostart/, felix.fileinstall.debug=1};|Hey!|#] [#|2010-01-20T16:29:04.636-0800|INFO|glassfishv3.0|javax.enterprise.system.std.com. sun.enterprise.v3.services.impl|_ThreadID=21;_ThreadName={felix.fileinstall.poll=5000, felix.fileinstall.bundles.new.start=true, felix.fileinstall.dir=/Users/arungupta/tools/glassfish/v3/74b/glassfishv3/glassfish /modules/autostart/, felix.fileinstall.debug=1};|Started bundle: file:/Users/arungupta/tools/glassfish/v3/74b/glassfishv3/glassfish/modules/autostart /helloworld-1.0-SNAPSHOT.jar|#]Notice "Hey!" message in the second line of log output as the bundle gets started. -
The bundle can be undeployed by removing the JAR file from "modules/autostart" directory as:
~/tools/glassfish/v3/74b/glassfishv3/glassfish >rm modules/autostart/helloworld-1.0-SNAPSHOT.jar
that shows the following output:
~/tools/glassfish/v3/74b/glassfishv3/glassfish >[#|2010-01-20T16:32:04.677-0800|INFO|glassfishv3.0|javax.enterprise.system.std.com. sun.enterprise.v3.services.impl|_ThreadID=21;_ThreadName={felix.fileinstall.poll=5000, felix.fileinstall.bundles.new.start=true, felix.fileinstall.dir=/Users/arungupta/tools/glassfish/v3/74b/glassfishv3/glassfish /modules/autostart/, felix.fileinstall.debug=1};|Uninstalling bundle 224 (helloworld)|#] [#|2010-01-20T16:32:04.679-0800|INFO|glassfishv3.0|javax.enterprise.system.std.com. sun.enterprise.v3.services.impl|_ThreadID=21;_ThreadName={felix.fileinstall.poll=5000, felix.fileinstall.bundles.new.start=true, felix.fileinstall.dir=/Users/arungupta/tools/glassfish/v3/74b/glassfishv3/glassfish /modules/autostart/, felix.fileinstall.debug=1};|Bye!|#] [#|2010-01-20T16:32:04.682-0800|INFO|glassfishv3.0|javax.enterprise.system.std.com. sun.enterprise.v3.services.impl|_ThreadID=21;_ThreadName={felix.fileinstall.poll=5000, felix.fileinstall.bundles.new.start=true, felix.fileinstall.dir=/Users/arungupta/tools/glassfish/v3/74b/glassfishv3/glassfish /modules/autostart/, felix.fileinstall.debug=1};|Uninstalled /Users/arungupta/tools/glassfish/v3/74b/glassfishv3/glassfish/modules/autostart /helloworld-1.0-SNAPSHOT.jar|#]Notice "Bye!" message in second line of the log output indicating the bundle is stopped.
Option 3: Manage the OSGi bundle using a remote Telnet Shell
-
Connecting to the Felix Remote Shell as:
~/tools/glassfish/v3/74b/glassfishv3/glassfish >telnet localhost 6666 Trying ::1... telnet: connect to address ::1: Connection refused Trying fe80::1... telnet: connect to address fe80::1: Connection refused Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. Felix Remote Shell Console: ============================ ->
-
Install the bundle as:
-> install file:///Users/arungupta/samples/v3/osgi/helloworld/target/helloworld-1.0-SNAPSHOT.jar Bundle ID: 225
The command output shows "225" as the bundle id. This id is used to start / stop / uninstall the bundle.
-
Check the bundle status as:
-> find hello START LEVEL 1 ID State Level Name [ 225] [Installed ] [ 1] helloworld (1.0.0.SNAPSHOT)
and then start, stop, and uninstall the bundle as:
-> start 225 -> stop 225 -> uninstall 225 -> find hello No matching bundles found
which shows following output in the logs:
[#|2010-01-20T16:43:45.399-0800|INFO|glassfishv3.0|javax.enterprise.system.std.com. sun.enterprise.v3.services.impl|_ThreadID=38;_ThreadName=telnetconsole.shell remote=/127.0.0.1:4894;|Hey!|#] [#|2010-01-20T16:43:58.516-0800|INFO|glassfishv3.0|javax.enterprise.system.std.com. sun.enterprise.v3.services.impl|_ThreadID=38;_ThreadName=telnetconsole.shell remote=/127.0.0.1:4894;|Bye!|#]
Notice "Hey!" and "Bye!" messages in the log output as the bundle is started and stopped.
Option 4 - Manage the OSGi bundle using a Web browser
Lets see how the OSGi bundles in GlassFish can be managed using Apache Felix Web Console. This is originally explained in Sahoo's blog.
-
Copy GlassFish OSGi HTTP Service bundle from here (latest) and save it in the "modules/autostart" directory.
-
Copy Apache Felix Web Console bundle from here (latest) and save it in the "modules/autostart" directory.
-
Ignore the "NoClassDefFoundError" in the server log. The key is to look for the following message in server log:
Started bundle: file:/Users/arungupta/tools/glassfish/v3/74b/glassfishv3/glassfish/modules/autostart/org.apache.felix.webconsole-2.0.4.jar|#]
-
Open the URL "http://localhost:8080/osgi/system/console/bundles" in a browser and use "admin" as the username and "admin" as the password as shown below:

I had to enter the credentials couple of times for the login to work but finally the following window showed up:
It shows a complete summary of all the OSGi bundles available/installed/active etc in GlassFish v3. A new OSGi bundle can be installed by clicking on "Choose File" button. Several administration commands such as Start/Stop, Update, Uninstall, Refresh Import Packages can be issued for each bundle by clicking on associated buttons. -
Install the OSGi bundle by clicking on "Choose File" and selecting "helloworld-1.0.-SNAPSHOT.jar" and then click on "Install or Update" button. The following message is shown in the server log:
[#|2010-01-20T17:04:46.654-0800|INFO|glassfishv3.0|javax.enterprise.system.std.com. sun.enterprise.v3.services.impl|_ThreadID=39;_ThreadName=Background Install /var/folders/+E/+E6YtSvGGEKNwOA77I-9Fk+++TI/-Tmp-/install1657418488877506078.tmp; |Hey!|#]
The bundle gets installed and started as identified by "Hey!" message.
The recently installed "HelloWorld" bundle looks like:
Clicking on "helloworld" shows the complete status about the bundle as shown below:
 -
The bundle can be stopped by clicking on the Stopped, Refreshed Package Imports, Updated, and Uninstalled by clicking on the respective buttons in the "Actions" column. Clicking on the Stop button shows the following message:
[#|2010-01-20T17:10:56.359-0800|INFO|glassfishv3.0|javax.enterprise.system.std.com .sun.enterprise.v3.services.impl|_ThreadID=25;_ThreadName=http-thread-pool-8080-(2); |Bye!|#]
Notice "Bye!" message indicating the bundle has stopped.
Option 5: Manage the OSGi bundle using a REST console
- If not done already, copy GlassFish OSGi HTTP Service bundle from here (latest) and save it in the "modules/autostart" directory.
- Download the REST console bundle (latest) in "modules/autostart" directory.
-
The complete list of bundles is available in Text or XML format by accessing the URL "http://localhost:8080/osgi/restconsole/bundles/.txt" or "http://localhost:8080/osgi/restconsole/bundles" respectively. Here is how the text output looks like:
% Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 16198 0 16198 0 0 1173k 0 --:--:-- --:--:-- --:--:-- 1173kbundles bundle id 0 symbolic-name org.apache.felix.framework . . . description Generated using Pax-Construct vendor version 1.0.0.SNAPSHOT location file:/Users/arungupta/tools/glassfish/v3/74b/glassfishv3/glassfish/modules/autostart/ com.knokode.osgi.restconsole.main-1.0-PREVIEW01.jar state ACTIVE -
The OSGi bundle should be installed by issuing the following command:
curl -X PUT file:///Users/arungupta/samples/v3/osgi/helloworld/target/helloworld-1.0-SNAPSHOT.jar http://localhost:8080/osgi/restconsole/bundles
but it's giving a "Segmentation fault". Am following with @fdiotalevi.
Anyway, the complete usage information of the REST console is described here.
So how do you manage OSGi bundles in GlassFish v3 - asadmin, file system operations, telnet console, web browser, or REST ?
UPDATE: Osgish is a command-line shell for OSGi and implemented in Perl. See the complete installation instructions and it can be used to manage OSGi runtime in GlassFish as well.
A complete archive of all the TOTDs is available here.
Technorati: totd glassfish v3 osgi apache felix bundles maven
Hotsos 2010 – About swag, the Oscars and other stuff
Behind the Spring Security Namespace
Sonatype Maven Meetup in Philadelphia
Register today for the Sonatype Maven Meetup being held this April. The meetup will take place in Philadelphia at the Sheraton Society Hill, on April 7, 2010.
The meetup will focus on development infrastructure technologies, offering talks and workshops led by core contributors and package maintainers.
Sessions in two tracks will cover tools such as the Apache Maven build and release manager, Hudson continuous integration engine, Nexus repository manager, Sonar quality server and other technologies widely used by software developers around the world.
Register for the Sonatype Maven Meetup at www.sonatype.com/meetup2010
Oracle at EclipseCon 2010 - Java EE 6, OSGi, GlassFish, EclipseLink, JPA 2.0/Dali, ...
Oracle is a strategic developer & board member of the Eclipse Foundation and is a gold sponsor of Eclipse Con 2010. See the complete list of Eclipse projects at Oracle.
When ? Mar 22nd - 25th, 2010
Where ? Santa Clara, California
How to register ? Register Now - Use the coupon code ORACLE10 (before Mar 2) for 10% off registration.
What ? Program Schedule
Oracle certainly has a lot to talk about Java EE 6, OSGi/GlassFish, JPA 2.0 and Dali, Future of App Servers, Future of Enterprise Java, Eclipse RT and WTP Reloaded tutorials and many other sessions. See the complete details about Oracle's participation here.
Also don't miss the keynote by Steve Harris and Jeet Kaul on Community and Adaptation. Hear these two industry leaders and prolific speakers talk about how Java has empowered community, engendered new forms of adaptation and will continue to blaze the trails.
And then there is Members and Committers reception on Monday evening sponsored by Oracle. Visit us at booth #8 to speak with technical experts, see demos and get information about Oracle's Eclipse technology and Project participation.
OSGi DevCon 2010 is happening on the same dates/venue and is covered with Eclipse Con registration.
And last, but not the least, let that runner in you have some fun and run with fellow attendees. Yep, there are even prizes!
Keep checking eclipsecon.org for the latest updates.
Unfortunately, I'll be speaking elsewhere in a different part of the world during exact same dates and so will miss all the fun. More on that later but here are some key members of the Eclipse Foundation:

Feel free to greet and thank them for running the show :-)
Read about 2009 participation here.
Technorati: conf oracle glassfish javaee oepe eclipsecon santaclara
New Extension - Check ADF Code Quality
Simplifying Development via Inheritance with ADF Business Components
GlassFish in February
The breadth and depth of the community is nicely illustrated by the variety of recent GlassFish-related blog posts. First, long time GlassFish supporter Masoud has a very detailed (it's actually a chapter of a book) OpenMQ from A to Z entry. On the operations side, Byron has a set of two posts on How to Run GlassFish V3 as a Service on Linux Ubuntu/Debian and a follow-up on using a non-root Service (see also thisGentoo variation by Jason), while Felipe's on provisioning GlassFish v3 resources with asadmin.
In the "nice words" category, Juliano has a nicely written "Java Enterprise Development - 2010 style" piece and Maksim says "GlassFish is becoming new de facto standard in Java applications. Development with new GlassFish v3 server and Eclipse now is really fast and comfortable. Server starts within a second, JEE6 is fully supported and hot code replacement works as it should.".
On the Java EE 6 and web tier side we have Bobby sharing a tool for exploring the platform, Aleksey discussing a "Grizzly 2.0: simple authentication example", while Justin puts GlassFish embedded to work with Wicket. Rene has a two-part article on running a Java EE 6 Client Application with Netbeans 6.8 and GlassFish V3 - Part 1: Creating a Basic Application and Part 2: Enhancing and Deploying the Application while Jacob goes through the simple setup to have GlassFish and Intellij 9 work together.
So while we wait for the GlassFish roadmap, we've seen one of the busiest month ever for February on the user mailing list and this recent message from the GlassFish Product Management "GlassFish, and by extension, Metro, are strategic Oracle products". Exciting times ahead!
The Inside Scoop on Maven and JRuby Integration
Today Charles Nutter, core member of JRuby, discussed two projects that integrate JRuby and Maven, and the implications of this interoperability. The first is a prototype Maven server that will make any Java library installable as a gem.
The second project is Polyglot Maven, which was started by Jason van Zyl and the folks at Sonatype.
That project intends to provide standard DSLs for popular JVM languages, allowing you to use those languages in place of the XML-based POM files so many people hate.To read the entire interview with JRuby’s Charles Nutter, click here.
Share Your JDeveloper Knowledge and Get a Free Pass to OOW
The call for papers for both Oracle Open World and Oracle Develop is now open here.
This is your chance to share your experience with JDeveloper and ADF with your peers, and get a free pass to the conference. From past conferences we know that sessions where customers talk about their real world experience with the tool, and summarize what they learn and what other people should look for, are always a success. This is your chance to shine and add the "presenter in conferences" section to your resume.
The call for papers ends on March 21st - so don't miss your window of opportunity.