今週やった仕事です。
正直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はあきらめましょう。
ソースを入手する
まず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.xmlとstruts-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を乗せることが出来ます。