Dave Johnson on open web technologies, social software and Java
In my quest to get Roller running on the latest in Java EE servers, the last server I tacked was the WebSphere Application Server. Unlike Glassfish and JBoss, WebSphere's Java EE 6 offering is not available in final form yet. Java EE 6 support is coming in WebSphere 8. So, for this exercise I used the WebSphere 8 beta, which was made available in July 2010. In this blog I'll describe how I approached the problem what I learned along the way.
If you remember my back to my post on Glassfish, I ended up with two WARs, one for Tomcat and one for Java EE. Then in my post on JBoss, I had to add a special WAR just for JBoss. Fortunately for WebSphere, I was able to use same "Java EE" WAR that I used on Glassfish. It didn't work the first time I tried, but with some code changes and installation guide adjustments, I was able to make it work. Here's a quick summary of the problems I hit:
I was able to deploy Roller successfully via the WebSphere console, but when I tried to load the Roller setup page I got a 404 error. I looked for the Roller log and found nothing. Something was preventing Commons Logging or Log4J from working properly. After some googling, I learned that this has been a problem on WebSphere for some time and there's an easy (but annoying) fix. I had to add a property file to Roller and ask those installing Roller to add a property file to their WebSphere installation, details are here (ROL-1895).
I had logging working but that didn't really help me figure out what was going wrong. Eventually, I remembered the WebSphere Filter Compatibility issue. Servlet Filters are a standard feature of the Servlet API for years, but for some reason they are turned off by default in WebSphere. The solution is to set the
com.ibm.ws.webcontainer.invokeFiltersCompatibility flag to true via the WebSphere console and so that's what I did. It worked.
Once I got beyond the setup page, the Roller bootstrapping page would not load. After some investigation I found that the Struts filter was not being executed. Roller was using the mapping
/* meaning that all requests go through Struts. When I changed that to
*.rol, which is the extension we use for all Struts actions, things started working. That's what we should have been doing anyway, so I made the change and moved on.
In the end, I was able to make Roller's Java EE WAR work on WebSphere and that's a good thing. I really don't want to have a separate WAR for each app server. As I did for the other three servers, I added detailed step-by-step installation instructions for WebSphere to the Roller 5 Install Guide (2MB PDF), with screenshots.