WebSphere3.5.4にStruts1.2.9を乗せる

今週やった仕事です。
正直6年前ぐらいにあったら便利だったかもと思うぐらいのエントリーかと思いますが。。。同じ境遇の人がもしいたら役に立つかも。
(同じ手順でWAS4とかでも動くと思いますし)

WebSphere3.5.4

元々のWebSphere3.5(以下WAS)はServletAPI2.1/JSP0.91orJSP1.0対応ですが、FixPack2以降を当てることで、ServletAPI2.2/JSP1.1に対応するようになります。
今回はFixPack4が対象環境だったので、4を当てました。なお、最新パッチはFixPack7です。
パッチは、既にIBMのホームページでは入手できないので、以下のftpサイトからダウンロードします。

ftp.software.ibm.com (anonymousログイン)
/software/websphere/appserv/support/fixpacks/was35

(古いパッチや資料がおいてあるので、結構便利。というかこれ探すのに1日かかったorz)


なお、ServletAPI2.1/JSP0.91ではtaglibが利用できないため、Strutsはあきらめましょう。

JDK

WebSphere3.5.4(以下WAS)はJDK1.2です。ProxyクラスやXMLパーサも利用できません。

ソースを入手する

まずStrutsは、1.2.9を入手します。(1.3はJDK1.4と書いてあったので、ヒヨりました)
動作にはいくつか外部ライブラリが必要ですが、今配られているバイナリビルド品は大抵jdk1.3or1.4で
コンパイルされているので、ひとしきりソースを入手してコンパイルする必要があります。


ということで以下がかき集めたソースです。

antlr-2.7.2.zip
commons-beanutils-1.7.0-src.zip
commons-digester-1.4.1-src.zip
commons-fileupload-1.0-src.zip
commons-logging-1.0.4-src.zip
commons-validator-1.1.4-src.zip
crimson-1.1.3-src.zip
jakarta-log4j-1.2.8.zip
jakarta-oro-2.0.8.zip

新しいものと古いものが混在していますが、たぶんこれがベストです。


これらを展開し、ソースパスに入れます。おそらくエラーがいくつか出ると思いますが、以下が修正点です。

//削除
org.apache.commons.logging.impl.AvalonLogger.java
org.apache.commons.logging.impl.Jdk13LumberjackLogger.java
org.apache.commons.logging.impl.Jdk14Logger.java
org.apache.commons.logging.impl.LogKitLogger.java

//削除
org.apache.log4j.performance
org.apache.log4j.performance.history
org.apache.log4j.performance.xml
org.apache.log4j.jmx
org.apache.log4j.or.jms
org.apache.log4j.net.JMSAppender.java
org.apache.log4j.net.JMSSink.java
org.apache.log4j.net.SMTPAppender.java

上記削除で、一通りコンパイルが通ると思います。


xmlパーサはwas搭載のものを使いたいところですが、なぜかDocumentImplクラスがないというエラーが出てしまうので、
Crimsonを利用します。またCrimsonを利用する場合は、Digesterを1.4以上にしてしまうとエラーになるので注意が必要です。

その他修正

WAS3.5.4は、PageContextからremoveAttributeするときに、元々何もセットされていない場合にExceptionが発生する神仕様みたいなので、タグクラス内でremoveAttributeしているところはtrycatchで囲みます。
(org.apache.struts.taglib.html.FormTag#doEndTag)

デプロイ

WASの管理コンソールからwarファイルをデプロイすると、WEB-INF/classesおよびWEB-INF/libはservletsというフォルダに、それ以外はwebというフォルダに入ります。
servletsはクラスを入れるところ、webはドキュメントルートです。(J2EE準拠でないので、こういう構成になります)


StrutsはWEB-INF/web.xmlstruts-config.xmlを起動時に読み込みますが、普通にデプロイするとエラーになります。
getServletContext().getResouceAsStream()では、webフォルダ以下のファイルが読み込めない為です。


従って、デプロイ後にwebフォルダにパスを通すか、warを作る際にWEB-INF/classesにWEB-INFをコピーするという強引な作戦を行う必要があります。
(私は後者にしました。キモいですが手間がかからないので。もちろんStrutsを修正して、クラスパスから読むようにしてもよいです)
また、getClass().getResourceAsStream()はjarの中身からデータを取り出せないので、すべてのファイルをclassファイルとしてclassesに配置するか、
もしくはクラスだけjarにして、リソース類はclassesにコピーする必要があります。


以上の手順で、WAS3.5.4にStruts1.2.9を乗せることが出来ます。