SeamFramework.orgCommunity Documentation
GlassFish is an open source application server which fully implements Java EE 5. The latest stable release is v2 UR2.
First, we'll discuss the GlassFish environment. Then we will go over the how you deploy the jee5 example. Next, we will deploy the JPA example application. Finally we show how to get a seam-gen's generated application running on GlassFish.
All of the examples and information in this chapter are based on the the latest version of GlassFish at the time of this writing.
After downloading GlassFish, install it:
$ java -Xmx256m -jar glassfish-installer-v2ur2-b04-linux.jar
After installing, setup GlassFish:
$ cd glassfish; ant -f setup.xml
            The created domain's name is domain1.
         
Next, we start the embedded JavaDB server:
$ bin/asadmin start-database
JavaDB is an embedded database that is included with GlassFish, just as HSQLDB is included in JBoss AS.
Now, start the GlassFish server:
$ bin/asadmin start-domain domain1
            The web adminstration console is available at http://localhost:4848/.
            You can access the web admin console with the default username 
            (admin) and password (adminadmin).
            Alternatively, you could copy EAR/WAR file to 
            glassfish/domains/domain1/autodeploy to deploy 
            it.
         
You can stop the server and database using:
$ bin/asadmin stop-domain domain1; bin/asadmin stop-database
         The jee5/booking example is based on the Hotel 
         Booking example (which runs on JBoss AS). Out of the box it is also 
         designed to run on GlassFish. It is located in
         $SEAM_DIST/examples/jee5/booking.
      
We will deploy the application on GlassFish using the GlassFish admin console.
                  Log in to the admin console at http://localhost:4848 
               
                  Access the Enterprise Applications in the
                  menu option under the Applications left 
                  side menu.
               
                  At the top of the Enterprise Application
                  table select Deploy. Follow through the
                  wizard, using these hints:
               
                        Preparing for the application installation
                     
                              Browse to examples/jee5/booking/dist/jboss-seam-jee5.ear.
                           
                              Select the OK button.
                           
                  You can now access the application at
                  http://localhost:8081/seam-jee5/.
               
This is the Hotel Booking example implemented in Seam POJOs and using Hibernate JPA with JPA transactions. It does not require EJB3 support to run on application server.
The example already has a break-out of configurations and build scripts for many of the common containers including GlassFish.
            To build the example, use the glassfish target:
         
$ ant glassfish
            This will create the container specific dist-glassfish
            and exploded-archives-glasfish directories.
         
            This is very similar to the jee5 example at
            Section 39.2.1, “Deploying the application to GlassFish”.
         
Log in to the administration console:
http://localhost:4848
                  Access the Web Applications in the menu 
                  option under the Applications left side 
                  menu.
               
                        
                           Preparing for the application installation
                        
                     
                              Browse to examples/jpa/dist-glassfish/jboss-seam-jpa.war.
                           
                              Select the OK button.
                           
                        You can now access the application at 
                        http://localhost:8081/jboss-seam-jpa/.
                     
examples/jpa/resources-glassfish/WEB-INF/classes/GlassFishDerbyDialect.class
            is a hack to get around a Derby bug in GlassFish server. You must 
            use it as your Hibernate dialect if you use Derby with GlassFish.
         Configuration file changes
                        META-INF/persistence.xml — the main 
                        changes needed are the datasource JNDI, switching to the
                        GlassFish transaction manager lookup class, and 
                        changing the hibernate dialect to be
                        GlassFishDerbyDialect.
                     
                        WEB-INF/classes/GlassFishDerbyDialect.class
                        — this class is needed for the Hibernate dialect change 
                        to GlassFishDerbyDialect
                     
                        import.sql — either for the dialect 
                        or Derby DB the ID column can not be 
                        populated by this file and was removed.
                     
         seam-gen is a very useful tool for developers to 
         quickly get an application up and running, and provides a foundation to
         add your own functionality. Out of box seam-gen will
         produce applications configured to run on JBoss AS. These instructions 
         will show the steps needed to get it to run on GlassFish. As stated 
         above in Section 39.2, “The jee5/booking example” it's easy to deploy 
         either an EJB3 or a Seam POJOs application on Glassfish.
      
            The first step is setting up seam-gen to 
            construct the base project. There are several choices made below,
            specifically the datasource and hibernate values that we will adjust
            once the project is created.
         
$ ./seam setup Buildfile: build.xml init: setup: [echo] Welcome to seam-gen :-) [input] Enter your Java project workspace (the directory that contains your Seam projects) [C:/Projects] [C:/Projects] /projects [input] Enter your JBoss home directory [C:/Program Files/jboss-4.2.3.GA] [C:/Program Files/jboss-4.2.3.GA] [input] Enter the project name [myproject] [myproject] seamgen_example [echo] Accepted project name as: seamgen_example [input] Do you want to use ICEfaces instead of RichFaces [n] (y, [n]) [input] skipping input as property icefaces.home.new has already been set. [input] Select a RichFaces skin [blueSky] ([blueSky], classic, ruby, wine, deepMarine, emeraldTown, japanCherry, DEFAULT) [input] Is this project deployed as an EAR (with EJB components) or a WAR (with no EJB support) [ear] ([ear], war) [input] Enter the Java package name for your session beans [com.mydomain.seamgen_example] [com.mydomain.seamgen_example] org.jboss.seam.tutorial.glassfish.action [input] Enter the Java package name for your entity beans [org.jboss.seam.tutorial.glassfish.action] [org.jboss.seam.tutorial.glassfish.action] org.jboss.seam.tutorial.glassfish.model [input] Enter the Java package name for your test cases [org.jboss.seam.tutorial.glassfish.action.test] [org.jboss.seam.tutorial.glassfish.action.test] org.jboss.seam.tutorial.glassfish.test [input] What kind of database are you using? [hsql] ([hsql], mysql, oracle, postgres, mssql, db2, sybase, enterprisedb, h2) [input] Enter the Hibernate dialect for your database [org.hibernate.dialect.HSQLDialect] [org.hibernate.dialect.HSQLDialect] [input] Enter the filesystem path to the JDBC driver jar [/tmp/seam/lib/hsqldb.jar] [/tmp/seam/lib/hsqldb.jar] [input] Enter JDBC driver class for your database [org.hsqldb.jdbcDriver] [org.hsqldb.jdbcDriver] [input] Enter the JDBC URL for your database [jdbc:hsqldb:.] [jdbc:hsqldb:.] [input] Enter database username [sa] [sa] [input] Enter database password [] [] [input] Enter the database schema name (it is OK to leave this blank) [] [] [input] Enter the database catalog name (it is OK to leave this blank) [] [] [input] Are you working with tables that already exist in the database? [n] (y, [n]) [input] Do you want to drop and recreate the database tables and data in import.sql each time you deploy? [n] (y, [n]) [propertyfile] Creating new property file: /home/mnovotny/workspaces/jboss/jboss-seam/seam-gen/build.properties [echo] Installing JDBC driver jar to JBoss server [copy] Copying 1 file to /home/mnovotny/workspaces/jboss/jboss-seam/seam-gen/C:/Program Files/jboss-4.2.3.GA/server/default/lib [echo] Type 'seam create-project' to create the new project BUILD SUCCESSFUL Total time: 4 minutes 5 seconds
            Type $ ./seam new-project to create your project
            and then cd /projects/seamgen_example to
            the newly created structure.
         
We now need to make some changes to the generated project.
resources/META-INF/persistence-dev.xml
                  
                              Alter the jta-data-source to be
                              jdbc/__default. We are going to
                              be using the integrated GlassFish Derby DB.
                           
                              Add or change the properties below. These are
                              described in detail at 
                              Section 39.2, “The jee5/booking example”:
                           
<property name="hibernate.dialect" value="GlassFishDerbyDialect"/>
<property name="hibernate.hbm2ddl.auto" value="update"/>
<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.format_sql" value="true"/>
<property name="hibernate.cache.provider_class" value="org.hibernate.cache.HashtableCacheProvider"/>
<property name="hibernate.transaction.manager_lookup_class" value="org.hibernate.transaction.SunONETransactionManagerLookup"/>
                              You'll need to alter 
                              persistence-prod.xml as well if
                              you want to deploy to GlassFish using the prod 
                              profile.
                           
resources/GlassFishDerbyDialect.class
                  
                        As with other examples we need to include this class for
                        DB support. It can be copied from the 
                        jpa example into the
                        seamgen_example/resources directory.
                     
$ cp \ 
$SEAM_DIST/examples/jpa/resources-glassfish/WEB-INF/classes/GlassFishDerbyDialect.class \ 
./resources
                     resources/META-INF/jboss-app.xml
                  
                        You can delete this file as we aren't deploying to JBoss
                        AS (jboss-app.xml is used to enable 
                        classloading isolation in JBoss AS)
                     
resources/*-ds.xml
                  You can delete these file as we aren't deploying to JBoss AS (these files define data sources in JBoss AS, we are using GlassFish's default data source)
resources/WEB-INF/components.xml
                  
                              Enable container managed transaction integration -
                              add the <transaction:ejb-transaction />
                              component, and it's namespace declaration 
                              xmlns:transaction="http://jboss.com/products/seam/transaction"
                           
                              Alter the jndi-pattern to
                              java:comp/env/seamgen_example/#{ejbName}/local
                           
resources/WEB-INF/web.xml
                  
                        As with the jee5/booking example we 
                        need to add EJB references to the web.xml. These 
                        references require the empty 
                        local-home to flag them for GlassFish
                        to perform the proper binding.
                     
<ejb-local-ref>
<ejb-ref-name>seamgen_example/AuthenticatorAction</ejb-ref-name>
<ejb-ref-type>Session</ejb-ref-type>
<local-home></local-home>
<local>org.jboss.seam.tutorial.glassfish.action.Authenticator</local>
</ejb-local-ref>
<ejb-local-ref>
<ejb-ref-name>seamgen_example/EjbSynchronizations</ejb-ref-name>
<ejb-ref-type>Session</ejb-ref-type>
<local-home></local-home>
<local>org.jboss.seam.transaction.LocalEjbSynchronizations</local>
</ejb-local-ref>
               We want to take the existing Authenticator 
               Seam POJO component and create an EJB3 out of it.
            
                           Rename the class to 
                           AuthenticatorAction
                        
                           Add the @Stateless annotation to 
                           the new AuthenticatorAction class.
                        
                           Create an interface called 
                           Authenticator which
                           AuthenticatorAction
                           implements (EJB3 requires session beans to have a
                           local interface). Annotate the interface with
                           @Local, and add a single method 
                           with same signature as the authenticate
                           in AuthenticatorAction.
                        
@Name("authenticator")
@Stateless
public class AuthenticatorAction implements Authenticator {
@Local
public interface Authenticator {
public boolean authenticate();
}
                     We've already added its reference to the web.xml
                     file so we are good to go.
                  
               This application has similar requirements as the
               jee5/booking example.
            
                     Change the default target to archive (we
                     aren't going to cover automatic deployment to GlassFish).
                  
<project name="seamgen_example" default="archive" basedir=".">
                     Websphere looks for the drools /security.drl
                     file in the root of the war file instead of the root of the
                     seamgen_example.jar so we need to have
                     the build.xml move it to the correct 
                     location at build time. The following must be added at the
                     top of the <target name="war" depends="compile" description="Build the distribution .war file">
                     target.
                  
<copy todir="${war.dir}">
<fileset dir="${basedir}/resources">
<include name="*.drl" />
</fileset>
</copy>
                     We need to get the GlassFishDerbyDialect.class
                     into our application jar. To do that find the jar
                     task and modify the top of it so that it looks like this:
                  
<target name="jar" depends="compile,copyclasses" description="Build the distribution .jar file">
<copy todir="${jar.dir}">
<fileset dir="${basedir}/resources">
<include name="seam.properties" />
<include name="*.drl" />
<include name="GlassFishDerbyDialect.class" />
</fileset>
</copy>
...
                     Next we need to get the jboss-seam.jar
                     into the base of the EAR file. For 
                     deployment GlassFish requires this jar to be in both the
                     /lib directory and at the base of the
                     EAR. You must add the following to the
                     archive task:
                  
<fileset dir="${lib.dir}">
<include name="jboss-seam.jar" >
</fileset>
                     So that the whole archive task looks 
                     like:
                  
<target name="archive" depends="jar,war,ear" description="Package the archives">
<jar jarfile="${dist.dir}/${project.name}.jar" basedir="${jar.dir}"/>
<jar jarfile="${dist.dir}/${project.name}.war" basedir="${war.dir}"/>
<jar jarfile="${dist.dir}/${project.name}.ear">
<fileset dir="${ear.dir}"/>
<fileset dir="${dist.dir}">
<include name="${project.name}.jar"/>
<include name="${project.name}.war"/>
</fileset>
<fileset dir="${lib.dir}">
<include name="jboss-seam.jar" />
</fileset>
</jar>
</target>
                     Now we need to get extra jars into the build.xml.
                     Look for the <fileset dir="${basedir}">
                     section of the task below. Add the new includes at the
                     bottom of the fileset.
                  
<target name="ear" description="Build the EAR">
<copy todir="${ear.dir}">
<fileset dir="${basedir}/resources">
<include name="*jpdl.xml" />
<include name="*hibernate.cfg.xml" />
<include name="jbpm.cfg.xml" />
</fileset>
<fileset dir="${lib.dir}">
<include name="jboss-seam.jar" />
</fileset>
<fileset dir="${basedir}">
<include name="lib/jbpm*.jar" />
<include name="lib/jboss-el.jar" />
<include name="lib/drools-*.jar"/>
<include name="lib/core.jar"/>
<include name="lib/janino*.jar"/>
<include name="lib/antlr-*.jar"/>
<include name="lib/mvel*.jar"/>
<include name="lib/richfaces-api*.jar" />
</fileset>
</copy>
<copy todir="${ear.dir}/META-INF">
<fileset dir="${basedir}/resources/META-INF">
<include name="application.xml" />
<include name="jboss-app.xml" />
</fileset>
</copy>
</target>
Add Hibernate dependencies
<!-- Hibernate and deps -->
<include name="lib/hibernate.jar"/>
<include name="lib/hibernate-commons-annotations.jar"/>
<include name="lib/hibernate-annotations.jar"/>
<include name="lib/hibernate-entitymanager.jar"/>
<include name="lib/hibernate-validator.jar"/>
<include name="lib/jboss-common-core.jar"/>
                           Add JSF dependencies. You will need to copy the
                           el-ri.jar from the
                           $SEAM_DIST/lib directory.
                        
<!-- jsf libs -->
<include name="lib/jsf-api.jar" />
<include name="lib/jsf-impl.jar" />
<include name="lib/el-api.jar" />
<include name="lib/el-ri.jar"/>
Add third party dependencies.
<!-- 3rd party and supporting jars -->
<include name="lib/javassist.jar"/>
<include name="lib/dom4j.jar"/>
<include name="lib/concurrent.jar" />
<include name="lib/cglib.jar"/>
<include name="lib/asm.jar"/>
<include name="lib/antlr.jar" />
<include name="lib/commons-logging.jar" />
<include name="lib/commons-collections.jar" />
You should end up with something like:
<fileset dir="${basedir}">
<include name="lib/jbpm*.jar" />
<include name="lib/jboss-el.jar" />
<include name="lib/drools-*.jar"/>
<include name="lib/core.jar"/>
<include name="lib/janino*.jar"/>
<include name="lib/antlr-*.jar"/>
<include name="lib/mvel*.jar"/>
<include name="lib/richfaces-api*.jar" />
<!-- Hibernate and deps -->
<include name="lib/hibernate.jar"/>
<include name="lib/hibernate-commons-annotations.jar"/>
<include name="lib/hibernate-annotations.jar"/>
<include name="lib/hibernate-entitymanager.jar"/>
<include name="lib/hibernate-validator.jar"/>
<include name="lib/jboss-common-core.jar" />
<!-- jsf libs -->
<include name="lib/jsf-api.jar" />
<include name="lib/jsf-impl.jar" />
<include name="lib/el-api.jar" />
<include name="lib/el-ri.jar"/>
<!-- 3rd party and supporting jars -->
<include name="lib/javassist.jar" />
<include name="lib/dom4j.jar" />
<include name="lib/concurrent.jar" />
<include name="lib/cglib.jar" />
<include name="lib/asm.jar" />
<include name="lib/antlr.jar" />
<include name="lib/commons-logging.jar" />
<include name="lib/commons-collections.jar" />
</fileset>
                     Build your application by calling ant in
                     the base directory of your project (for example 
                     /projects/seamgen-example). The target 
                     of the build will be dist/seamgen-example.ear.
                  
                     To deploy the application follow the instructions here
                     Section 39.2.1, “Deploying the application to GlassFish” but use references
                     to this project seamgen-example instead 
                     of jboss-seam-jee5.
                  
                     Checkout the app at http://localhost:8081/seamgen_example/