我正在尝试构建一个登录注册网络应用程序,它本质上是让用户在数据库上注册,然后允许他们登录。我已经编写了所有代码,并且正在尝试将我的程序连接到我的数据库。这是我收到的错误:
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
我已将所有 Postgres、Tomcat 和 SQL 连接器/驱动程序 jar 添加到我的
classpath
和我的 WEB-INF/lib
文件夹中。我不太确定还能做什么。我尝试使用另一个类进行测试,并且能够连接到我的数据库。我还仔细检查了我的连接 URL。怎么了?
如果您在运行 Jetpack compose 桌面应用程序时遇到此问题, 考虑将此行添加到
build.gradle.kts
compose.desktop {
application {
// ..
nativeDistributions {
// ...
modules("java.sql")
}
}
}
我知道这与 Servlet 无关,但我在使用 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
一开始有点困惑,但我终于明白了。我只需将 java.sql 的 requires 语句添加到
module-info.java
:
module mymodule {
...
requires sqlite.jdbc;
requires java.sql;
}
(需要 sqlite.jdbc 已经在那里,为了清楚起见将其添加到上面)
对于 Kotlin Compose Multiplatform,这似乎属于“这是一个功能,而不是一个错误”类别。 philoopher97 已经发布了解决方案。
请参阅此处了解完整说明,包括如何配置 Proguard 的提示。