SeamFramework.orgCommunity Documentation

Chapter 41. Seam on GlassFish application server

41.1. GlassFish environment and deployment information
41.1.1. Installation
41.2. The jee5/booking example
41.2.1. Building the jee5/booking example
41.2.2. Deploying the application to GlassFish
41.3. The jpa booking example
41.3.1. Building the jpa example
41.3.2. Deploying the jpa example
41.3.3. What's different for GlassFish v2 UR2
41.4. Deploying an application generated by seam-gen on GlassFish v2 UR2
41.4.1. Running seam-gen Setup
41.4.2. Changes needed for deployment to GlassFish

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

Note

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 administration console is available at http://localhost:4848/. You can access the web admin console with the default username (admin) and password (adminadmin). We will be using the the admin console to deploy our examples. You can also copy EAR/WAR files to the glassfish/domains/domain1/autodeploy directory to deploy them, although we are not going to cover that.

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.

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.

This is very similar to the jee5 example at Section 41.2.2, “Deploying the application to GlassFish” except that this is a war and not an ear.

  • 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/.

Using Derby instead of Hypersonic SQL DB

In order for the app to work out of the box with GlassFish, we have used the Derby (aka JavaDB) database in GlassFish. However, we strongly recommend that you use another database (e.g. HSQL). 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.

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.

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
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}

resources/WEB-INF/web.xml

As with the jee5/booking example, we need to add EJB references to web.xml. Technically, the reference type is not required, but we add it here for good measure. Note that these references require the presence of an empty local-home element to retain compatibility with a JBoss AS 4.x deployment.


<ejb-local-ref>              
    <ejb-ref-name>seamgen_example/AuthenticatorAction</ejb-ref-name>                
    <ejb-ref-type>Session</ejb-ref-type>     
    <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>org.jboss.seam.transaction.LocalEjbSynchronizations</local>
  </ejb-local-ref>

Keep in mind that if you are deploying to JBoss AS 4.x, and have defined the EJB references shown above in your web.xml, you will need to also define local JNDI names for each of them in jboss-web.xml, as shown below. This step is not required when deploying to GlassFish, but it's mentioned here in case you are also deploying the application to JBoss AS 4.x (not required for JBoss AS 5).


<ejb-local-ref>              
    <ejb-ref-name>seamgen_example/AuthenticatorAction</ejb-ref-name>                
    <local-jndi-name>AuthenticatorAction</local-jndi-name>  
  </ejb-local-ref>
   
  <ejb-local-ref>
    <ejb-ref-name>seamgen_example/EjbSynchronizations</ejb-ref-name>  
    <local-jndi-name>EjbSynchronizations</local-jndi-name>
  </ejb-local-ref>

This application has similar requirements as the jee5/booking example.