2010.05.06

FAQ 『StrutsによるWebアプリケーションスーパーサンプル 第2版』

StrutsによるWebアプリケーションスーパーサンプル第2版



●質問:サンプル1-1.warにおける、Tomcat6.0でのエラーに関して

 WindowsXPで、j2sdk1.6とTomcat6.0でサンプル実行環境を構築しています。

 1-1.warファイルを解凍し、http://localhost:8080/1-1/view/Hello.jspにアクセスしたところ、エラーが発生します。

 以下にエラーログを掲載します(長いです)。




< ご注意 >

本書籍のサンプルは、「付録CD-ROMに収録されているサンプルとアプリを使うことで」動作するように書かれています。従って、サンプルやアプリを、外部から導入(アップバージョン)された場合は、正しく動作しない可能性があります。

サンプルやアプリを、外部から導入(アップバージョン)された際には、基本的にはサポート範囲外ですので、ご自分の責任においてお使いくださいますよう、くれぐれもお願いいたします。




type 例外レポート



メッセージ



説明 The server encountered an internal error () that prevented it from fulfilling this request.



例外



org.apache.jasper.JasperException:

javax.servlet.ServletException:

java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory



org.apache.jasper.servlet.JspServletWrapper.handleJspException

(JspServletWrapper.java:541)



org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:417)



org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:320)



org.apache.jasper.servlet.JspServlet.service(JspServlet.java:266)

javax.servlet.http.HttpServlet.service(HttpServlet.java:803)

filter.EncodingFileter.doFilter(EncodingFileter.java:30)





原因



javax.servlet.ServletException:

java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory



org.apache.jasper.runtime.PageContextImpl.doHandlePageException(PageContextImpl.java:850)



org.apache.jasper.runtime.PageContextImpl.handlePageException(

PageContextImpl.java:779)

org.apache.jsp.view.Hello_jsp._jspService(Hello_jsp.java:85)



org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)

javax.servlet.http.HttpServlet.service(HttpServlet.java:803)



org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:393)



org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:320)



org.apache.jasper.servlet.JspServlet.service(JspServlet.java:266)

javax.servlet.http.HttpServlet.service(HttpServlet.java:803)

filter.EncodingFileter.doFilter(EncodingFileter.java:30)





原因



java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory



org.apache.struts.util.MessageResources.<clinit>(MessageResources.java:57)

org.apache.struts.taglib.html.HtmlTag.<clinit>(HtmlTag.java:48)



sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)



sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)



sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)

java.lang.reflect.Constructor.newInstance(Unknown Source)

java.lang.Class.newInstance0(Unknown Source)

java.lang.Class.newInstance(Unknown Source)



org.apache.jasper.runtime.TagHandlerPool.get(TagHandlerPool.java:126)



org.apache.jsp.view.Hello_jsp._jspx_meth_html_005fhtml_005f0(Hello_jsp.java:97)

org.apache.jsp.view.Hello_jsp._jspService(Hello_jsp.java:78)



org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)

javax.servlet.http.HttpServlet.service(HttpServlet.java:803)



org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:393)



org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:320)



org.apache.jasper.servlet.JspServlet.service(JspServlet.java:266)

javax.servlet.http.HttpServlet.service(HttpServlet.java:803)

filter.EncodingFileter.doFilter(EncodingFileter.java:30)





原因



java.lang.ClassNotFoundException:

org.apache.commons.logging.LogFactory



org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1358)



org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1204)

java.lang.ClassLoader.loadClassInternal(Unknown Source)



org.apache.struts.util.MessageResources.<clinit>(MessageResources.java:57)

org.apache.struts.taglib.html.HtmlTag.<clinit>(HtmlTag.java:48)



sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)



sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)



sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)

java.lang.reflect.Constructor.newInstance(Unknown Source)

java.lang.Class.newInstance0(Unknown Source)

java.lang.Class.newInstance(Unknown Source)



org.apache.jasper.runtime.TagHandlerPool.get(TagHandlerPool.java:126)



org.apache.jsp.view.Hello_jsp._jspx_meth_html_005fhtml_005f0(Hello_jsp.java:97)

org.apache.jsp.view.Hello_jsp._jspService(Hello_jsp.java:78)



org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)

javax.servlet.http.HttpServlet.service(HttpServlet.java:803)



org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:393)



org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:320)



org.apache.jasper.servlet.JspServlet.service(JspServlet.java:266)

javax.servlet.http.HttpServlet.service(HttpServlet.java:803)

filter.EncodingFileter.doFilter(EncodingFileter.java:30)




●回答:

 ご質問いただいた件ですが、ログを拝見したところ、



java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory



とありますのでLogFactoryクラスが見つかっていないために例外が発生している状況です。

 このクラスはJakarta Commons Loggingに含まれているクラスです。

 Tomcat5.0.xでは共通のものとして含まれていたようですが、5.5以降は含まれておらず上記のエラーがでます。



 対応策としては



http://www.meisei-u.ac.jp/mirror/apache/dist/commons/logging/binaries/commons-logging-1.1.1-bin.zip



にアクセスいただき、対象のJarファイルが含まれているZIPファイルをダウンロードします(直接リンクになっています)。

 解凍していただくといくつかのファイルが含まれていますが、そのうちのcommons-logging-1.1.1.jarファイルを配置していただいたTomcatのWARファイルに含めていただき、Tomocatを再起動することで動作が可能です。

 具体的な手順としては、



(Tomcatインストールフォルダ)webapps1-1WEB-INFlib



に上記のcommons-logging-1.1.1.jarをコピーしていただくことになります。

 上記内容は他のWARでも同様で、



(Tomcatインストールフォルダ)webappsx-xWEB-INFlib



に上記のcommons-logging-1.1.1.jarをコピーし、Tomocatを再起動することになります。

 x-xはWARファイルの名前の拡張子のないものです。