Matteo Lunghi
Matteo Lunghi

Reputation: 41

java.lang.NoClassDefFoundError: java/sql/Driver?

I am trying to build a login-registration web app which essentially lets users register on a database and then allows them to log in. I have written all the code, and I am trying to connect my program to my database. Here is the error I receive:

Exception

javax.servlet.ServletException: Servlet execution threw an exception
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)

Root Cause

java.lang.NoClassDefFoundError: java/sql/Driver

I have added all the Postgres, Tomcat, and SQL connector/driver jar to my classpath and my WEB-INF/lib folders. I am not really sure what else to do. I have tried testing with another class and I am able to connect to my database. I have triple check my connection URL as well. What's wrong?

Upvotes: 4

Views: 6506

Answers (2)

Shahriar Zaman
Shahriar Zaman

Reputation: 938

If you are getting this problem while running Jetpack compose desktop app, consider adding this line into build.gradle.kts

compose.desktop {
    application {
        // ..
        nativeDistributions {
            // ...
            modules("java.sql")
        }
    }
}

Upvotes: 6

tony-orlando
tony-orlando

Reputation: 188

I know this has nothing to do with Servlets, but I had the same problem with a module application that uses SQLite:

Exception in thread "main" java.lang.NoClassDefFoundError: java/sql/Driver
at java.base/java.lang.ClassLoader.defineClass1(Native Method)
at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1016)
at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1095)
at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:206)
at java.base/jdk.internal.loader.BuiltinClassLoader.defineClass(BuiltinClassLoader.java:759)
at java.base/jdk.internal.loader.BuiltinClassLoader.findClassInModuleOrNull(BuiltinClassLoader.java:680)
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.java:605)
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:579)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
at java.base/java.lang.Class.forName0(Native Method)
at java.base/java.lang.Class.forName(Class.java:315)
...
Caused by: java.lang.ClassNotFoundException: java.sql.Driver
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
... 14 more

A little puzzling at at first, but I finally figured it out. I just had to add the requires statement for java.sql to the module-info.java:

module mymodule {
    ...
    requires sqlite.jdbc;
    requires java.sql;
}

(The requires sqlite.jdbc was already in there, added it above just for clarity)

Upvotes: 2

Related Questions