Search code examples
javaservletssimplecaptcha

java.lang.ClassNotFoundException: nl.captcha.servlet.StickyCaptchaServlet


I'm trying to add SimpleCaptcha library to my project by following the instruction.

I placed SimpleCaptcha jar file under my /WEB-INF/lib directory: enter image description here

My web.xml:

<web-app xmlns="http://java.sun.com/xml/ns/javaee" version="2.5">
<servlet>
    <servlet-name>StickyCaptcha</servlet-name>
    <servlet-class>
        nl.captcha.servlet.StickyCaptchaServlet  <!-- Can't resolve -->
    </servlet-class>

    <init-param>
        <param-name>width</param-name>
        <param-value>250</param-value>
    </init-param>

    <init-param>
        <param-name>height</param-name>
        <param-value>75</param-value>
    </init-param>
</servlet>

<servlet-mapping>
    <servlet-name>StickyCaptcha</servlet-name>
    <url-pattern>/stickyImg</url-pattern>
</servlet-mapping>

When I try to load http://localhost:8080/stickyImg I get the following exception:

java.lang.ClassNotFoundException: nl.captcha.servlet.StickyCaptchaServlet
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1702)
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1547)
    at org.apache.catalina.core.DefaultInstanceManager.loadClass(DefaultInstanceManager.java:532)
    at org.apache.catalina.core.DefaultInstanceManager.loadClassMaybePrivileged(DefaultInstanceManager.java:514)
    at org.apache.catalina.core.DefaultInstanceManager.newInstance(DefaultInstanceManager.java:142)
    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:100)
    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:1041)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:603)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)

But instruction says:

  1. Browse to one of the locations given by the url-patterns defined in web.xml, e.g., http://localhost:8080/stickyImg. If everything has been set up correctly you should see/hear a CAPTCHA challenge.

I googled the problem but couldn't find any information.


Solution

  • There were several problems, as far as I understand.

    1. Intellij Idea treated my jar as a directory, not a library. I deleted the simple captcha directory and copy-past jar again and the icon was changed: enter image description here
    2. Further after reading Maven dependencies not visible in WEB-INF/lib I thought about adding the jar as a library to the project. I went to the Project Structure(Ctrl + Alt + Shift + S) and added simple captcha as a library:

    enter image description here

    The problem is solved now.