SeasarとDoltengとTomcat6

しばらくブログの更新を怠っていたのですが…。Tomcat6.0.10をインストールして、いろいろいじっていました。

自分、今まで「Tomcatプロジェクト>JSP作業ディレクトリを作成」という操作って、プロジェクトに必須の操作かと思っていたのですが、
これって必要な訳では無いんですね。(とかいって間違ってるかもしれない。間違っていたらご指摘下さい。)

いや、以下の工程で、ちょっと気づいたもので…。

今回のテーマ

  • Dolten0.18.1 生成のSuperAgileプロジェクトで、
  • s2-frameworkを2.4.12、teedaを1.0.6、s2daoを1.0.42にバージョンアップし、
  • Tomcat6.0.10上で動かす。

工程

まず、各ライブラリのバージョンアップの為、pom.xmlを以下(抜粋)のように編集します。

<?xml version="1.0" encoding="UTF-8"?>
<project>
	<dependencies>
		<dependency><!-- 1.1にバージョンアップ -->
			<groupId>org.apache.geronimo.specs</groupId>
			<artifactId>geronimo-jta_1.1_spec</artifactId>
			<version>1.0</version>
		</dependency>
		<dependency><!-- 最新バージョンのs2-frameworkで必要なので追加 -->
			<groupId>org.apache.geronimo.specs</groupId>
			<artifactId>geronimo-ejb_2.1_spec</artifactId>
			<version>1.0</version>
		</dependency>
		<dependency><!-- 最新バージョンのs2-frameworkで必要なので追加 -->
			<groupId>org.apache.geronimo.specs</groupId>
			<artifactId>geronimo-ejb_3.0_spec</artifactId>
			<version>1.0</version>
		</dependency>
		<dependency><!-- 2.4.12にバージョンアップ -->
			<groupId>org.seasar.container</groupId>
			<artifactId>s2-extension</artifactId>
			<version>2.4.12</version>
		</dependency>
		<dependency><!-- 2.4.12にバージョンアップ -->
			<groupId>org.seasar.container</groupId>
			<artifactId>s2-framework</artifactId>
			<version>2.4.12</version>
		</dependency>
		<dependency><!-- 2.4.12にバージョンアップ -->
			<groupId>org.seasar.container</groupId>
			<artifactId>s2-tiger</artifactId>
			<version>2.4.12</version>
		</dependency>
		<dependency><!-- 1.0.6にバージョンアップ -->
			<groupId>org.seasar.teeda</groupId>
			<artifactId>teeda-extension</artifactId>
			<version>1.0.6</version>
		</dependency>
		<dependency><!-- 1.0.6にバージョンアップ -->
			<groupId>org.seasar.teeda</groupId>
			<artifactId>teeda-ajax</artifactId>
			<version>1.0.6</version>
		</dependency>
		<dependency><!-- 1.0.6にバージョンアップ -->
			<groupId>org.seasar.teeda</groupId>
			<artifactId>teeda-tiger</artifactId>
			<version>1.0.6</version>
		</dependency>
		<dependency><!-- 1.0.42にバージョンアップ -->
			<groupId>org.seasar.dao</groupId>
			<artifactId>s2-dao</artifactId>
			<version>1.0.42</version>
		</dependency>
		<dependency><!-- 1.0.42にバージョンアップ -->
			<groupId>org.seasar.dao</groupId>
			<artifactId>s2-dao-tiger</artifactId>
			<version>1.0.42</version>
		</dependency>
	</dependencies>
</project>

そして、プロジェクトディレクトリにおいて「del /Q src\main\webapp\WEB-INF\lib\*」「mvn eclipse:eclipse war:inplace」を実行します。
これにより、クラスパスの再構成及び、アプリケーションのlibディレクトリが更新されます。

F5でプロジェクトを更新。すると、viewフォルダがソースフォルダ指定から外れているので、復帰させます。

Tomcatプロジェクト>JSP作業ディレクトリを作成 を行います。

そしてTomcat6を起動。http://localhost:8080/chura/ にアクセスすると、index.jspが実行され、Hello, worldが表示されます。現在、自分でもうまくいきません。( → http://d.hatena.ne.jp/cepoc/20070429/1177876121 ) この時はなんでうまくいったんだろう…。

JSP作業ディレクトリを作成していると、Jasperにより生成された work/org.apache.jsp/index_jsp.java がエラーを起こします。(この点に関しては、後の考察にて)なので、作業ディレクトリは作成しない方向で。

次に、Teedaのviewにアクセスしてみる。何も作っていないので、デフォルトで存在する http://localhost:8080/chura/view/error/error.html にアクセス。白画面で、何も表示されなければOKです。

という感じで、成功、かな?

考察

Tomcat5→6の変更点についてのまとめは、libディレクトリの共通化など改良点多数なのですが、ひとまず置いておいて。

Apache Tomcat version Servlet Spec JSP Spec
6.0.10 2.5 2.1
5.5.23 2.4 2.0
4.1.36 2.3 1.2
3.3.2 2.2 1.1

上記の通り、Tomcat6よりServlet2.5及びJSP2.1に対応ということになりました。えーと、Servlet2.4, JSP2.0との違いは把握しておりません(汗)
まぁ、様々な事項を置き去りにして、ずんずん進みます。

で、Doltengでプロジェクトを生成すると、必要なライブラリとして、以下(抜粋)のライブラリがクラスパスに通されます。

これらのライブラリは、Tomcat5.5 においては、TOMCAT_HOME/common/lib にある、以下のライブラリと互換性のあるライブラリだと思います。

work/org.apache.jsp/index_jsp.java がエラーを起こすのは、上記geronimoのライブラリが、Servlet2.5, JSP2.1に対応していないから、ですね。

そしたら、2.5/2.1対応のgeronimoに差し替えたらどうなるでしょうか?

pomにさらなる変更を加えます。

		<dependency>
			<groupId>org.apache.geronimo.specs</groupId>
			<artifactId>geronimo-jsp_2.1_spec</artifactId>
			<version>1.0-M1</version>
		</dependency>
		<dependency>
			<groupId>org.apache.geronimo.specs</groupId>
			<artifactId>geronimo-servlet_2.5_spec</artifactId>
			<version>1.1-M1</version>
		</dependency>

「del /Q src\main\webapp\WEB-INF\lib\*」「mvn eclipse:eclipse war:inplace」を実行→F5でプロジェクトを更新→viewフォルダをソースフォルダ指定に復帰させます。

一応、workフォルダは空にしておき、Tomcat6を起動。そしてさっきのように、http://localhost:8080/chura/ にアクセス。

DEBUG 2007-04-24 22:30:40,473 [http-8080-1] HOT deployを開始します
DEBUG 2007-04-24 22:30:43,941 [http-8080-1] HOT deployを終了しました
2007/04/24 22:30:43 org.apache.catalina.core.StandardWrapperValve invoke
致命的: サーブレット jsp のServlet.service()が例外を投げました
java.lang.NullPointerException
	at org.apache.jsp.index_jsp._jspInit(index_jsp.java:22)
	at org.apache.jasper.runtime.HttpJspBase.init(HttpJspBase.java:52)
	at org.apache.jasper.servlet.JspServletWrapper.getServlet(JspServletWrapper.java:157)
	at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:320)
	at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:320)
	at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:266)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.seasar.framework.container.hotdeploy.HotdeployFilter.doFilter(HotdeployFilter.java:63)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.seasar.framework.container.filter.S2ContainerFilter.doFilter(S2ContainerFilter.java:63)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:228)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:104)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:216)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:634)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:445)
	at java.lang.Thread.run(Thread.java:595)

ぁ。ダメですね。現在の所、原因不明です。

こちらは http://localhost:8080/chura/view/error/error.html 上手く行くようです。

さて、ここでJSP作業ディレクトリをソースフォルダに追加してみますと…。jasper系のクラスが無い、ということで、やはりエラーが出ています。ダメでしたか…。geronimo-jasperってライブラリは無いですよねぇ。(Maven2リポジトリには見つかりませんでした。)

geronimoって、JSPServlet変換はどうやっているんでしょうか?