HOW TO GO

〜昨日の今日とは一味二味違うBlog〜

Tomcat + Struts2 + Mavenで「JSPのクラスをコンパイルできません」

f:id:sugiim:20130201230210j:plain

Struts2のけっこう普通のWEBアプリケーションをmavenの構成に焼き直しした。
mavenの勉強)
普通に動くー、と思いきや、
JSPのクラスをコンパイルできません」が発生してしまった。


致命的: サーブレット jspServlet.service()が例外を投げました
org.apache.jasper.JasperException: JSPのクラスをコンパイルできません:

An error occurred at line: 29 in the generated java file
The method getJspApplicationContext(ServletContext) is undefined for the type JspFactory

Stacktrace:
at org.apache.jasper.compiler.DefaultErrorHandler.javacError(DefaultErrorHandler.java:92)
at org.apache.jasper.compiler.ErrorDispatcher.javacError(ErrorDispatcher.java:330)
at org.apache.jasper.compiler.JDTCompiler.generateClass(JDTCompiler.java:439)
at org.apache.jasper.compiler.Compiler.compile(Compiler.java:356)
at org.apache.jasper.compiler.Compiler.compile(Compiler.java:334)
at org.apache.jasper.compiler.Compiler.compile(Compiler.java:321)
at org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:592)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:328)


http://www.nulab.co.jp/kousei/chapter4/05.html

このあたりをみて、pom.xml

のscopeが"provided"になっていることを確認した。

		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>servlet-api</artifactId>
			<version>2.4</version>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>jsp-api</artifactId>
			<version>2.0</version>
			<scope>provided</scope>
		</dependency>

ちゃんとprovidedになっとるやないか。なんでやねん。

エラーの内容からみて、実行時のjsp-apiが競合してたり、バージョンが違う問題だろうと推測されるので、
思い切って、pomからservlet-apijsp-apiの記述を削除。

そしたらエラーにならず。
改めて、ローカルのリポジトリ(C:\Users\sugiim\.m2\repository)を全部消してみて再度実行してみた。問題なし。
"provided"はwarに含まれないから悪さしないんじゃなかったのか・・・。
いろんなライブラリを使えば使うほど依存関係が複雑になって、競合が起きちゃうのってなんだかなー。