SeamFramework.orgCommunity Documentation
Websphere 6.1.x is IBM's application server offering. The latest
release is 6.1.0.19 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 JPA example application.
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.
All of the examples and information in this chapter are based on the version 6.1 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 management tool.
It is highly recommended to patch Websphere by latest fix pack, at the time of this writing it is 6.1.0.19
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 modifying a property or deploying an application try to restart the server.
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.
PK33090; 6.1: A filter that serves a file does not pop-up an alert message
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.
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.HotelSearching</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.
Note also that EjbSynchronizations
is
a built-in Seam EJB and not part of the Hotel Booking example. This
means that if your application's components.xml
specifies transaction:ejb-transaction
, then you must include:
<ejb-local-ref>
<ejb-ref-name>myapp/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>
in your web.xml. If you don't include it, you'll get the following error:
Name comp/env/myapp/EjbSynchronizations not found in context java:
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
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
.
JSF libraries — Websphere 6.1 comes with its 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.
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="lib/el-ri.jar" />
<include name="lib/jsf-api.jar" />
<include name="lib/jsf-impl.jar" />
<include name="lib/jboss-seam.jar" />
</fileset>
We also need to add richfaces-api.jar, jsf-impl.jar and
el-ri.jar into WEB-INF/lib of the war file. Add the following
fileset after ear.lib.extras
fileset.
<fileset id="war.lib.extras" dir="${seam.dir}">
<include name="lib/richfaces-api.jar" />
<include name="lib/jsf-impl.jar" />
<include name="lib/el-ri.jar" />
</fileset>
There is a class loading issue with WebSphere, which causes the jars from ear lib directory to not be available when the web module is initialized.
Now all that is left is to execute the ant
archive
task and the built application will be in
the jee5/booking/dist
directory.
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.
Log in to the administration console
https://localhost:9043/ibm/console
Access the Enterprise
Application
menu option under the
Applications
top menu.
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.
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.
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.
You can now access the application at
http://localhost:9080/seam-jee5/
.
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.
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.
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.
This is similar to the jee5
example at
Section 38.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
.
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-common-core.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
concurrent.jar
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 38.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.3.GA] [C:/Program Files/jboss-4.2.3.GA] /home/jbalunas/jboss/jboss-4.2.3.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 [org.jboss.seam. tutorial.websphere.action] [org.jboss.seam.tutorial.websphere.action] org.jboss.seam.tutorial.websphere.action [input] Enter the Java package name for your entity beans [org.jboss.seam. tutorial.websphere.model] [org.jboss.seam.tutorial.websphere.model] 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 [/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: /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.3.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.
We now need to make some changes to the generated project.
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 38.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>
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 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 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.
<!-- 3rd party and supporting jars -->
<!--<include name="lib/log4j.jar" />-->
<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" />
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/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" />
<!-- seam jar -->
<include name="lib/jboss-seam.jar" />
</fileset>
The last step is to add jsf-impl.jar
and el-ri.jar
to the war target. Look for
copy todir="${war.dir}/WEB-INF/lib"
and add the
following:
<copy todir="${war.dir}/WEB-INF/lib">
<fileset dir="${lib.dir}">
<includesfile name="deployed-jars-war.list" />
<include name="jsf-impl.jar" />
<include name="el-ri.jar" />
<exclude name="jboss-seam-gen.jar" />
</fileset>
</copy>
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 38.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