Javaサーブレットを使用してEclipseでWebアプリケーションを開発し始め、ローカルホスト上のTomcatサーバーでテストしています。Tomcatでアプリケーションをデプロイしましたが、ターゲットURLをロードしようとするとブラウザで、次のスタックトレースを取得します。
Jul 31, 2013 2:58:31 PM org.Apache.catalina.core.ApplicationContext log
INFO: Marking servlet ImageServlet as unavailable
Jul 31, 2013 2:58:31 PM org.Apache.catalina.core.StandardWrapperValve invoke
SEVERE: Allocate exception for servlet ImageServlet
Java.lang.ClassNotFoundException: test.ImageServlet
at org.Apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.Java:1714)
at org.Apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.Java:1559)
at org.Apache.catalina.core.DefaultInstanceManager.loadClass(DefaultInstanceManager.Java:527)
at org.Apache.catalina.core.DefaultInstanceManager.loadClassMaybePrivileged(DefaultInstanceManager.Java:509)
at org.Apache.catalina.core.DefaultInstanceManager.newInstance(DefaultInstanceManager.Java:137)
at org.Apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.Java:1144)
at org.Apache.catalina.core.StandardWrapper.allocate(StandardWrapper.Java:865)
at org.Apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.Java:136)
at org.Apache.catalina.core.StandardContextValve.invoke(StandardContextValve.Java:123)
at org.Apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.Java:502)
at org.Apache.catalina.core.StandardHostValve.invoke(StandardHostValve.Java:171)
at org.Apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.Java:99)
at org.Apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.Java:953)
at org.Apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.Java:118)
at org.Apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.Java:408)
at org.Apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.Java:1023)
at org.Apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.Java:589)
at org.Apache.Tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.Java:1852)
at Java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at Java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at Java.lang.Thread.run(Unknown Source)
ImageServletクラスは、Eclipseワークスペースのmyproject/src/testフォルダーに明確に配置されています。myprojectはEclipseプロジェクトの名前で、testはパッケージです。
web.xmlはmyproject/web/WEB-INF/web.xmlにあり、myproject.xmlはmyproject/myproject.xmlにあります
Web.xmlの内容は次のとおりです。
<?xml version="1.0"?>
<web-app
xmlns="http://Java.Sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://Java.Sun.com/xml/ns/j2ee http://Java.Sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version="2.4">
<servlet>
<servlet-name>ImageServlet</servlet-name>
<servlet-class>test.ImageServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ImageServlet</servlet-name>
<url-pattern>/image</url-pattern>
</servlet-mapping>
</web-app>
Myproject.xmlの内容は次のとおりです。
ClassNotFoundExceptionをスローしないようにコードを修正する方法を教えてもらえますか?
フィルターまたはサーブレットの作成時に、Eclipseのビルドフォルダーにクラスファイルが生成されないことがあります。アプリケーションをクリーンアップして一度ビルドすると、上記のパスに.classファイルが生成されます。これにより、場合によってはクラスが見つからないというエラーが削除されます。
最近、私のプロジェクトの1つでこの問題に遭遇しました(同じJARとすべてを使用していても、他のプロジェクトは完全にうまくいったのでこれを言います)。プロジェクトを複数回クリーニングし、.metadataフォルダーを複数回削除しました。何も機能しませんでした。クラスは単にコンパイルされていません。
うまくいったのは、プロジェクトのビルドパスでバインドされていないjre6ライブラリを削除することでした。
それはMavenプロジェクトですか? Mavenプロジェクトでは、src/testは単体テストの場所であり、ビルドおよび戦争から除外されています。パッケージ名を変更してから再試行してください。
Mavenベースのプロジェクトを構築しているように見えますが、クラスを間違った場所に配置しているようです。
src/main/Java
を使用してクラスを配置し、src/test/Java
を使用してテストを配置する必要があります(つまり、JUnitテストがある場合)。
プロジェクトがMavenプロジェクトである場合は、それをクリーニングしてみてください。 [プロジェクト]> [クリーン]をクリックし、クリーンする目的のプロジェクトを選択します。
場合によっては、コンソールとEclipseのいずれかでMavenを使用すると、ターゲットが「クレイジー」になり、続行する唯一の方法はプロジェクトのクリーニングになります。
クラスがない場合test.ImageServlet
WEB-INF/classesデプロイメントで、Tomcatはそれを見つけることができません。
私の推測では、WARファイルをTomcatに適切にコンパイル、パッケージング、デプロイしていません。