Chapter 28. Seam on IBM's Websphere

Websphere 6.1.x is IBM's application server offering. The latest release is 6.1.0.13 which does not have EJB3 or JEE5 support. There is a recently released (Nov 07) EJB3 feature pack which provides some support for EJB3 and JPA. Currently there is no true JEE5 offering from IBM. This causes some issues with Seam integration with applications that use EJB3.

First we will go over some basic information about the Websphere environment that we used for these examples. After a good deal of research and work we were able to get EJB3 applications to function correctly. We will go over the details of those steps with the jee5 example. We will also deploy the the JPA example application.

28.1. Websphere environment and deployment information

Websphere is a commercial product and so we will not discuss the details of its installation other than to say follow the directions provided by your particular installation type and license. This section will detail the exact server versions used, installation tips, and some custom properties that are needed for all of the examples.

28.1.1. Installation versions and tips

All of the examples and information in this chapter are based on the the latest version of Websphere at the time of this writing.

The EJB3 feature pack that we installed came with the 6.1.0.13 patch version of Websphere. Installing the feature pack does not ensure that your server will have the proper environment for EJB3 applications. Be sure that as part of the installation of the feature pack you follow the instructions to create a new server profile with the EJB3 feature pack enabled, or augment one of your existing ones. This can also be done after the installation by running the profile managment tool.

A note about restarting the server

There are times that restarting the server will be required after deploying or changes the examples in this chapter. Its does not seem like every change requires a restart. If you get errors or exceptions after modifing a property or deploying an application try to restart the server.

28.1.2. Required custom properties

There are a couple of Websphere custom properties that are required for Seam integration. These properties are not needed specifically for Seam, but work around some issues with Websphere. These are set following the instructions here : Setting web container custom properties

  • prependSlashToResource = "true" — This solves a fairly common issue with Websphere where applications are not using a leading "/" when attempting to access resources. If this is not set then a java.net.MalformedURLException will be thrown. With this property set you will still see warnings, but the resources will be retrieved as expected.

  • com.ibm.ws.webcontainer.invokefilterscompatibility = "true" — This solves an issue with Websphere where it throws a FileNotFoundException when a web application attempts to access a file resource that does not actually exist on disk. This is a common practice in modern web applications where filters or servlets are used to process resource requests like these. This issue manifests itself as failures to retrieve JavaScript, CSS, images, etc... when requesting a web page.

28.2.  The jee5/booking example

The jee5/booking example is based on the Hotel Booking example (which runs on JBoss AS). Out of the box it is designed to run on Glassfish, but with the steps below it can be deployed to Websphere. It is located in the $SEAM_DIST/examples/jee5/booking directory.

As stated before the EJB3 feature pack does not provide a full jee5 implementation. This means that there are some tricks to getting an application deployed and functioning.

28.2.1. Configuration file changes

Below are the configuration file changes that are need to the base example.

resources/WEB-INF/components.xml

We need to change the way that we look up EJBs for Websphere. We need to remove the /local from the end of the jndi-pattern attribute. It should look like this:

<core:init jndi-pattern="java:comp/env/jboss-seam-jee5/#{ejbName}" debug="true"/>
                  
resources/WEB-INF/web.xml

This is the first place that we notice an unexpected change because this is not full jee5 implementation.

Websphere does not support Servlet 2.5, it requires Servlet 2.4. For this change we need to adjust the top of the web.xml file to look like the following:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" 
         xmlns="http://java.sun.com/xml/ns/j2ee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
                             http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
                  

Next we have to make some changes to the EJB references in the web.xml. These changes are what will allow Websphere to bind the EJB2 references in the web module to the the actual EJB3 beans in the EAR module. Replace all of the ejb-local-refs when the values below.

  <!-- JEE5 EJB3 names -->
  <ejb-local-ref>              
    <ejb-ref-name>jboss-seam-jee5/AuthenticatorAction</ejb-ref-name>                
    <ejb-ref-type>Session</ejb-ref-type>     
    <local-home></local-home>
    <local>org.jboss.seam.example.booking.Authenticator</local>  
  </ejb-local-ref>     
  
  <ejb-local-ref>       
    <ejb-ref-name>jboss-seam-jee5/BookingListAction</ejb-ref-name>       
    <ejb-ref-type>Session</ejb-ref-type>       
     <local-home></local-home>
    <local>org.jboss.seam.example.booking.BookingList</local>  
  </ejb-local-ref>    
  
  <ejb-local-ref>       
    <ejb-ref-name>jboss-seam-jee5/RegisterAction</ejb-ref-name>       
    <ejb-ref-type>Session</ejb-ref-type>       
     <local-home></local-home>
    <local>org.jboss.seam.example.booking.Register</local>    
  </ejb-local-ref>    
  
  <ejb-local-ref>       
    <ejb-ref-name>jboss-seam-jee5/ChangePasswordAction</ejb-ref-name>       
    <ejb-ref-type>Session</ejb-ref-type>  
     <local-home></local-home>     
    <local>org.jboss.seam.example.booking.ChangePassword</local>     
  </ejb-local-ref>    
  
  <ejb-local-ref>       
    <ejb-ref-name>jboss-seam-jee5/HotelBookingAction</ejb-ref-name>       
    <ejb-ref-type>Session</ejb-ref-type>       
     <local-home></local-home>
    <local>org.jboss.seam.example.booking.HotelBooking</local>     
  </ejb-local-ref>    
  
  <ejb-local-ref>       
    <ejb-ref-name>jboss-seam-jee5/HotelSearchingAction</ejb-ref-name>       
    <ejb-ref-type>Session</ejb-ref-type>      
     <local-home></local-home> 
    <local>org.jboss.seam.example.booking.HotelSAll of the examples and informaearching</local> 
  </ejb-local-ref>    
    
  <ejb-local-ref>
    <ejb-ref-name>jboss-seam-jee5/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>

The important change is that there is an empty local-home element for each EJB. This tells Websphere to make the correct bindings between the web module and the EJB3 beans. The ejb-link element is simply not used.

resources/META-INF/persistence.xml

For this example we will be using the default datasource that comes with Websphere. To do this change the jta-data-source element:

<jta-data-source>DefaultDatasource</jta-data-source>
                  

Then we need to adjust some of the hibernate properties. First comment out the Glassfish properties. Next you need to add/change the properties:

<!--<property name="hibernate.transaction.flush_before_completion" value="true"/>-->
<property name="hibernate.cache.provider_class" 
                  value="org.hibernate.cache.HashtableCacheProvider"/>
<property name="hibernate.dialect" value="GlassfishDerbyDialect"/>
<property name="hibernate.transaction.manager_lookup_class" 
          value="org.hibernate.transaction.WebSphereExtendedJTATransactionLookup"/>
                  

  • hibernate.transaction.manager_lookup_class — Standard Hibernate transaction manager property for Websphere 6.X

  • hibernate.transaction.flush_before_completion — This is commented out because we want the container to manage the transactions. Also if this is set to true an exception will be thrown by Websphere when the EJBContext is looked up.

    com.ibm.wsspi.injectionengine.InjectionException: 
                     EJBContext may only be looked up by or injected into an EJB
  • hibernate.dialect — From WAS 6.1.0.9 on the embedded DB was switched to the same Derby DB in Glassfish.

resources/GlassfishDerbyDialect.class

You will need to get the GlassfishDerbyDialect.class and copy it into the /resources directory. The class exists in the JPA example and can be copied using the command below assuming you are in jee5/booking directory:

cp ../../jpa/resources-websphere61/WEB-INF/classes/GlassfishDerbyDialect.class
   ./resources

This class will be put into the jboss-seam-jee5.jar file using changes to the build.xml discussed later.

resources/import.sql

This file must also be copied from the JPA example because either the Derby DB or the dialect does not support changes to the ID column. The files are identical except for the column difference. Use the following command to make the copy

cp ../../jpa/resources-websphere61/import.sql ./resources

28.2.2. Building the jee5/booking example

In order to get the changes we have made into our application we need to make some changes to the build.xml. There are also some additional jars that are required by our application in order to work with Websphere. This section will cover what changes are needed to the build.xml.

28.2.2.1. New libraries dependencies

  • JSF libraries — Websphere 6.1 comes with their own version of JSF 1.1 (Seam requires JSF 1.2). So we must add these jars to our application.

    • jsf-api.jar

    • jsf-impl.jar

  • Since Websphere is not a fully compliant JEE5 implementation we need to add these EL libraries:

    • el-api.jar

    • el-ri.jar

  • jboss-seam.jar — for some reason when deploying the application through the Websphere administration console it can not find the jboss-seam.jar at the base of the EAR archive. This means that we need to add it to the /lib of the EAR.

  • Finally we remove the log4j.jar so that all of the log output from our application will be added to the Websphere log. Additional steps are required to fully configure log4j and those are outside of the scope of this document.

28.2.2.2. Updating the build.xml file

Add the following entry to the bottom of the build.xml file. This overrides the default fileset that is used to populate the jboss-seam-jee5.jar. The primary change is the addition of the GlassfishDerbyDialect.class:

   <fileset id="jar.resources" dir="${resources.dir}">
      <include name="import.sql" />
      <include name="seam.properties" />
      <include name="GlassfishDerbyDialect.class" />
      <include name="META-INF/persistence.xml" />
      <include name="META-INF/ejb-jar.xml" />
   </fileset>

Next we need to add the library dependencies discussed above. For this add the following to bottom of the ear.lib.extras fileset entry:

   <!--<include name="lib/log4j.jar" />-->
   <include name="lib/el-api.jar" />
   <include name="examples/jpa/lib/el-ri.jar" />
   <include name="lib/jsf-api.jar" />
   <include name="lib/jsf-impl.jar" />
   <include name="lib/jboss-seam.jar" />
</fileset>

Now all that is left is to execute the ant archive task and the built application will be in the jee5/booking/dist directory.

28.2.3. Deploying the application to Websphere

So now we have everything we need in place. All that is left is to deploy it - just a few steps more.

For this we will use Websphere's administration console. As before there are some tricks and tips that must be followed.

The steps below are for the Websphere version stated above, yours may be slightly different.

  1. Log in to the administration console

    https://localhost:9043/ibm/console

  2. Access the Enterprise Application menu option under the Applications top menu.

  3. At the top of the Enterprise Application table select Install. Below are installation wizard pages and what needs to done on each:

    • Preparing for the application installation

      • Browse to the examples/jee5/booking/dist/jboss-seam-jee5.ear file using the file upload widget.

      • Select the Next button.

    • Select installation options

      • Select the Deploy enterprise beans check box. This is needed unless you used a Websphere tool to package the application.

      • Select the Next button.

    • Map modules to servers

      • No changes needed here as we only have one server. Select the Next button.

    • Map EJB references to beans This page will list all of the beans that we entered in the web.xml.

      • Make sure that Allow EJB reference targets to resolve automatically check box is selected. This will tell Websphere to bind our EJB3 beans to the EJB references in the web module.

      • Select the Next button.

    • Map virtual hosts for Web modules

      • No changes needed here. Select the Next button.

    • Summary

      • No changes needed here. Select the Finish button.

    • Installation

      • Now you will see it installing and deploying your application.

      • When if finishes select the Save link and you will be returned to the Enterprise Applications table.

  4. Now that we have our application installed we need to make some adjustments to it before we can start it:

    • Starting from the Enterprise Applications table select the Seam Booking link.

    • Select the Manage Modules link.

    • Select the jboss-seam-jee5.war link.

    • Change the Class loader order combo box to Classes loaded with application class loader first.

    • Select Apply and then Save options.

    • Return the Seam Booking page.

    • On this page select the Class loading and update detection link.

    • Select the radio button for Classes loaded with application class loader first.

    • Even though we are not enabling class reload you must also enter a valid number in the Polling interval for updated files text area (zero works fine).

    • Select Apply and then Save options.

    • You should verify that the change you just made has been remembered. We have had problems with the last class loader change not taking effect - even after a restart. If the change did not take you will need to do it manually, following these directions:

      • Open the following file in a text editor of your choice:

        $WebSphereInstall/$yourServerName/profiles/$yourProfileName/config/cells/
                           $yourCellName/applications/Seam Booking.ear/deployments/
                           Seam Booking/deployment.xml

      • Modify the following line so that PARENT_FIRST is now PARENT_LAST:

        <classloader xmi:id="Classloader_#######" mode="PARENT_FIRST"/>

      • Save the file and now when go to the Class loading and update detection page you should see Classes loaded with application class loader first selected.

  5. To start the application return to the Enterprise Applications table and select our application in the list. Then choose the Start button at the top of the table.

  6. You can now access the application at http://localhost:9080/seam-jee5/ .

A note about Websphere Stateful bean timeouts

The default timeout period for a Websphere 6.1 Stateful EJB is 10 minutes. This means that you may see some EJB timeout exceptions after some idle time. It is possible to adjust the timeout of the Stateful EJBs on an individual basis, but that is beyond the scope of this document. See the Websphere documentation for details.

28.3.  The jpa booking example

Thankfully getting the jpa example to work is much easier than the jee5 example. 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.

The example already has a breakout of configurations and build scripts for many of the common containers including Websphere.

First thing we are going to do is build and deploy that example. Then we'll go over some key changes that we needed.

28.3.1. Building the jpa example

Building it only requires running the correct ant command:

ant websphere61

This will create container specific distribution and exploded archive directories with the websphere61 label.

28.3.2. Deploying the jpa example

This is similar to the jee5 example at Section 28.2.3, “Deploying the application to Websphere”, but without so many steps.

  • From the Enterprise Applications table select the Install button.

    • Preparing for the application installation

      • Browse to the examples/jpa/dist-websphere61/jboss-seam-jpa.war file using the file upload widget.

      • In the Context root text box enter jboss-seam-jpa.

      • Select the Next button.

    • Select the Next button for the next three pages, no changes are needed.

    • Summary page

      • Review the settings if you wish and select the Finish button to install the application. When installation finished select the Save link and you will be returned to the Enterprise Applications table.

  • As with the jee5 example there are some class loader changes needed before we start the application. Follow the instructions at installation adjustments for jee5 example but exchange jboss-seam-jpa for Seam Booking.

  • Finally start the application by selecting it in the Enterprise Applications table and clicking the Start button.

  • You can now access the application at the http://localhost:9080/jboss-seam-jpa/index.html.

28.3.3. Whats different for Websphere 6.1

The differences between the JPA examples that deploys to JBoss 4.2 and Websphere 6.1 are mostly expected; library and configuration file changes.

  • Configuration file changes

    • WEB-INF/web.xml — the only significant change is that Websphere 6.1 only support Servlet 2.4 so the top of this file was changed.

    • META-INF/persistence.xml — the main changes here are for the datasource JNDI path, switching to the Websphere 6.1 transaction manager look up 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.

  • Changes for dependent libraries

    WEB-INF/lib — The Websphere version requires several library packages because they are not included as they are with JBoss AS. These are primarily for hibernate, JSF-RI support and their dependencies. Below are listed only the additional jars needed above and beyond the JBoss JPA example.

    • To use Hibernate as your JPA provider you need the following jars:

      • hibernate.jar
      • hibernate-annotations.jar
      • hibernate-commons-annotations.jar
      • hibernate-entitymanager.jar
      • hibernate-validator.jar
      • commons-collections.jar
      • jboss-archive-browsing.jar

    • Seam requires JSF 1.2 and these are the jars needed for that. Websphere 6.1 ships with its own implementation of JSF 1.1.

      • jsf-api.jar
      • jsf-impl.jar
      • el-ri.jar
      • el-api.jar

    • Various third party jars that Websphere needs:

      • antlr.jar
      • cglib.jar
      • asm.jar
      • dom4j.jar
      • javassist.jar

28.4. Deploying an application created using seam-gen on Websphere 6.1.0.13

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 Websphere. As stated above in Section 28.2, “ The jee5/booking example ” there are some tricky changes needed to get an EJB3 application running. This section will take you through the exact steps.

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]
/home/jbalunas/workspace
    [input] Enter your JBoss home directory [C:/Program Files/jboss-4.2.2.GA] [C:/Program Files/jboss-4.2.2.GA]
/home/jbalunas/jboss/jboss-4.2.2.GA
    [input] Enter the project name [myproject] [myproject]
websphere_example
     [echo] Accepted project name as: websphere_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, sakura, 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.websphere_example] [com.mydomain.websphere_example]
org.jboss.seam.tutorial.websphere.action
    [input] Enter the Java package name for your entity beans [org.jboss.seam.tutorial.websphere.action] [org.jboss.seam.tutorial.websphere.action]
org.jboss.seam.tutorial.websphere.model
    [input] Enter the Java package name for your test cases [org.jboss.seam.tutorial.websphere.action.test] [org.jboss.seam.tutorial.websphere.action.test]
org.jboss.seam.tutorial.websphere.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 [lib/hsqldb.jar] [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: /rhdev/projects/jboss-seam/svn-seam_2_0/jboss-seam-2_0/seam-gen/build.properties
     [echo] Installing JDBC driver jar to JBoss server
     [copy] Copying 1 file to /home/jbalunas/jboss/jboss-4.2.2.GA/server/default/lib
     [echo] Type 'seam create-project' to create the new project

BUILD SUCCESSFUL
Total time: 3 minutes 5 seconds

Type ./seam new-project to create your project and cd /home/jbalunas/workspace/websphere_example to the newly created structure.

28.5. Changes needed for deployment to Websphere

We now need to make some changes to the generated project.

28.5.1. Configuration file changes

resources/META-INF/persistence-dev.xml
  • Alter the jta-data-source to be DefaultDatasource. We are going to be using the integrated Websphere DB.

  • Add or change the properties below. These are described in detail at Section 28.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.WebSphereExtendedJTATransactionLookup"/>
  • Remove the JBoss AS specific method of exposing the EntityManagerFactory:

    <property 
     name="jboss.entity.manager.factory.jndi.name" 
     value="java:/websphere_exampleEntityManagerFactory">
  • You'll need to alter persistence-prod.xml as well if you want to deploy to Websphere 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 websphere_example/resources directory.

cp $SEAM/examples/jpa/resources-websphere61/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 datasources in JBoss AS, we are using Websphere's default datasource)

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/websphere_example/#{ejbName}

  • We do not need managed-persistence-context for this example and so can delete its entry.

    <persistence:managed-persistence-context name="entityManager"
                 auto-create="true"
                 persistence-unit-jndi-name="java:/websphere_exampleEntityManagerFactory"/> 
resources/WEB-INF/web.xml

Websphere does not support Servlet 2.5, it required Servlet 2.4. For this change we need to adjust the top of the web.xml file to look like the following:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" 
         xmlns="http://java.sun.com/xml/ns/j2ee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
                             http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
                  

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 Websphere to perform the proper binding.

  <ejb-local-ref>              
    <ejb-ref-name>websphere_example/AuthenticatorAction</ejb-ref-name>                
    <ejb-ref-type>Session</ejb-ref-type>     
    <local-home></local-home>
    <local>org.jboss.seam.tutorial.websphere.action.Authenticator</local>  
  </ejb-local-ref>
   
  <ejb-local-ref>
    <ejb-ref-name>websphere_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>

28.5.2. Creating the AuthenticatorAction EJB

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(); 
    }
  1. We've already added its reference to the web.xml file so are good to go.

28.5.3. Extra jar dependencies and other changes to the build.xml

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 Websphere).

    <project name="websphere_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 websphere_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 ge 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 Websphere 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>
    • 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" />
    • JSF dependencies. You will need to copy the el-ri.jar from the $SEAM/examples/jpa/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"/>
    • Third party dependencies. You will need to copy the jboss-archive-browsing.jar from the $SEAM/examples/jpa/lib directory into the the projects /lib directory. You will also need to acquire the concurrent.jar and place it in the same directory. You can get this from any jboss distribution or just search for it.

         <!-- 3rd party and supporting jars -->
         <!--<include name="lib/log4j.jar" />-->
         <include name="lib/javassist.jar"/>
         <include name="lib/dom4j.jar" />
         <include name="lib/jboss-archive-browsing.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" />
    • jboss-seam.jar - this is needed in both the ear base and /lib directory.

         <!-- seam jar -->
         <include name="lib/jboss-seam.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/log4j.jar" />-->
       <include name="lib/javassist.jar"/>
       <include name="lib/dom4j.jar" />
       <include name="lib/jboss-archive-browsing.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" />
                   
       <!-- seam jar -->
       <include name="lib/jboss-seam.jar" />
                               
    </fileset>

28.5.4.  Building and deploying the seam-gen'd application to Websphere

  • Build your application by calling ant in the base directory of your project (ex. /home/jbalunas/workspace/websphere_example ). The target of the build will be dist/websphere_example.ear .

  • To deploy the application follow the instructions here : Section 28.2.3, “Deploying the application to Websphere” but use references to this project websphere_example instead of jboss-seam-jee5.

  • Checkout the app at: http://localhost:9080/websphere_example/index.html