There is now a guide to deploying apps to OC4J in the Seam Reference Manual (as of Seam 2.0.0.CR1/CVS 27-Aug-07)
I took Seam (1.2.1 GA)'s "glassfish" example and got it deployed to OC4J 11 (11.1.1.0.0). Here's how I did it:
Keep in mind, the glassfish example compiles into an ear file, so these instructions involve how to manually deploy an ear file to OC4J...see below for hints on how to manually deploy a war file to OC4J. Also...THIS DOES NOT WORK in OC4J 10, since OC4J 11 is the first release which is "fully" Java EE 5.0 compatible (according to http://www.oracle.com/technology/tech/java/oc4j/index.html).
---
Section 1: Change some code so OC4J doesn't choke on it
(1) change persistence.xml:
(add this line) <property name="hibernate.transaction.manager_lookup_class" value="org.hibernate.transaction.OrionTransactionManagerLookup"></property> (delete this line if not using Derby) <property name="hibernate.dialect" value="org.hibernate.dialect.DerbyDialect"></property>
(2) change web.xml:
(delete this line in the ejb reference for jboss-seam-glassfish/AuthenticatorAction/local) <local-home></local-home>
(3) make the following classes implement Serializable (Oracle chokes on them, saying they don't adhere to the EJB 2.1 spec if you don't, which is lame):
ChangePasswordAction.java HotelBookingAction.java HotelSearchingAction.java RegisterAction.java
(4) update conversations.xhtml to be the latest in CVS, as there's a bug in it which will cause an XML parsing error: http://fisheye.jboss.com/browse/JBoss/jboss-seam/examples/booking/view/conversations.xhtml?ignore1=B&ignore2=w&k=&r1=1.8&r2=1.9&u=3
---
Section 2: Configuring OC4J to see and successfully run your application
(1) configure oc4j/j2ee/home/config/server.xml:
(add this line) <application name="jboss-seam-glassfish" path="../../home/applications/jboss-seam-glassfish.ear" parent="default" start="true" ></application>
(2) configure oc4j/j2ee/home/config/default-web-site.xml:
(add this line) <web-app application="jboss-seam-glassfish" name="jboss-seam-glassfish" load-on-startup="true" root="/jboss-seam-glassfish" ></web-app>
(3) configure oc4j/j2ee/home/config/data-sources.xml:
(add these lines, which assume you have a MySQL database installed and available, given the following url, user and password) <managed-data-source user="test" password="test" connection-pool-name="mysqlDS" jndi-name="jdbc/__default" name="jdbc/__default"></managed-data-source> <connection-pool name="mysqlDS"> <connection-factory factory-class="com.mysql.jdbc.jdbc2.optional.MysqlDataSource" user="test" password="test" url="jdbc:mysql://localhost:3306/test" commit-record-table-name=""></connection-factory> </connection-pool>
(4) copy the following jar files to the oc4j/j2ee/home/applib directory:
commons-beanutils-core.jar **can be found in oc4j/j2ee/home/lib commons-digester.jar **can be found in oc4j/j2ee/home/lib jsf-api.jar **can be found in oc4j/lib/java/shared/oracle.jsf/1.2 jsf-impl.jar **can be found in oc4j/lib/java/shared/oracle.jsf/1.2 sun-commons-beanutils.jar **can be found in oc4j/lib/java/shared/oracle.jsf/1.2 sun-commons-collections.jar **can be found in oc4j/lib/java/shared/oracle.jsf/1.2 sun-commons-digester.jar **can be found in oc4j/lib/java/shared/oracle.jsf/1.2 sun-commons-logging.jar **can be found in oc4j/lib/java/shared/oracle.jsf/1.2 jboss-seam.jar **can be found in the root of your Seam directory hibernate-all.jar **can be found in [Seam directory]/lib jboss-ejb3-all.jar **can be found in [Seam directory]/lib thirdparty-all.jar **can be found in [Seam directory]/lib mysql-connector-java-5.0.4-bin.jar (if using MySql)
---
Section 3: Deploy your application to OC4J
(1) run "ant clean main" in the examples/glassfish directory
(2) copy the ear file from the examples/glassfish/build directory to the oc4j/j2ee/home/applications directory
(3) copy the jar file from the examples/glassfish/build directory to the oc4j/j2ee/home/applib directory
(4) start up oc4j and enjoy
---
You'll get some warnings and stuff (it's possible to do some more code and configuration tweaks to get rid of them), but your app should work.
---
---
Some other helpful hints:
(1) if you're not using an ear file, but rather a war file, you'll need to do a couple other (different from Section 2 above) things:
register both the ejb jar and the war file in oc4j/j2ee/home/config/application.xml:
<ejb-module id="jboss-seam-glassfish_ejb" path="../../home/applib/jboss-seam-glassfish.jar"></ejb-module> <web-module id="jboss-seam-glassfish" path="../../home/applications/jboss-seam-glassfish.war"></web-module>
register your app in oc4j/j2ee/home/config/default-web-site.xml (note the application is simply "default"):
<web-app application="default" name="jboss-seam-glassfish" root="/jboss-seam-glassfish" load-on-startup="true" ></web-app>
don't change oc4j/j2ee/home/config/server.xml
make sure the ejb-module id you specify (in this case, "jboss-seam-glassfish_ejb") matches the jndi pattern you use in your application (in components.xml and web.xml)
(2) if you are wondering whether OC4J contains any of your Beans when it starts up (you're getting JNDI lookup problems, for example), try this utility:
http://localhost:8888/dmsoc4j/Spy (I've found clicking on the "Text" link in the upper left corner and doing a search on the bean name I'm looking for is most helpful)
(3) if you still get JNDI lookup problems and you know OC4J has your EJBs someplace, try putting @Startup at the top of the Session Bean it cannot find
(4) if you get the cryptic "java:comp/EJBContext not found" error, delete everything in your jndi.properties file...you don't need it...I got this error when trying to use something like:
java.naming.factory.initial=com.evermind.server.ApplicationClientInitialContextFactory (or com.evermind.server.rmi.RMIInitialContextFactory) java.naming.provider.url=ormi://localhost/jndidemo java.naming.security.principal=SCOTT java.naming.security.credentials=TIGER
A blank jndi.properties file works, though. shrug
(5) if you ever get an
AnnotatedNoClassDefFoundError
, just throw the appropriate jar file in oc4j/j2ee/home/applib and it should work
Comments