IntelliJ中Tomcat连接PostgreSQL遇JDBC无合适驱动异常
PostgreSQL JDBC驱动在Tomcat中找不到的问题解决
已解决更新
已成功修复。通过Maven导入驱动并在创建Connection前添加Class.forName()解决了问题(尽管普遍认为该构造自Java 8起已过时,但显然仍有用处)。希望我的方案能帮到遇到类似问题的人。
问题描述
我正在学习使用PostgreSQL和Tomcat服务器。用MySQL时没遇到过这类问题,在Eclipse里把驱动加到服务器类路径后也一切正常。
现在运行最基础的数据库查询程序(从预存的图书列表查数据)时,出现以下错误:
java.sql.SQLException: No suitable driver found for jdbc:postgresql://localhost:5432/postgres at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:702) at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:228) at com.ex.dynamicweb.DBHandler.getBooks(DBHandler.java:22) at com.ex.dynamicweb.HelloServlet.doGet(HelloServlet.java:23) at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:564) at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:205) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149) at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:174) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:482) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93) at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:673) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:340) at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:391) at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63) at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:896) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1744) at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.base/java.lang.Thread.run(Thread.java:834)
目前只有把JDBC驱动放到tomcat/lib文件夹才能解决,但有没有办法通过IDE自动添加?我试过修改部署配置、Artifacts(手动把lib文件夹加到解压后的war包的WEB-INF中)、通过库手动指定驱动路径、用Maven导入JDBC驱动并添加到Modules里,都没解决,有人遇到过类似情况吗?
环境版本
- JDBC Driver: 42.6.0
- PostgreSQL: 16
- Java: 11
- Tomcat: 10.1.16(8.5.96版本也有同样问题)
- IntelliJ Ultimate 2023
相关代码
index.jsp
<%@ page contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1" %> <!DOCTYPE html> <html> <head> <title>Books</title> </head> <body> <h1><%= "Hello World!" %> </h1> <br/> <a href="hello-servlet">Hello Servlet</a> </body> </html>
HelloServlet.java
package com.ex.dynamicweb; import java.io.*; import jakarta.servlet.http.*; import jakarta.servlet.annotation.*; @WebServlet(name = "helloServlet", value = "/hello-servlet") public class HelloServlet extends HttpServlet { private String message; public void init() { message = "Hello World!"; } public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { response.setContentType("text/html"); // Hello PrintWriter out = response.getWriter(); out.println("<html><body>"); out.println("<h1>" + message + "</h1>"); for (String book : DBHandler.getBooks()) { out.print(book + "</br>"); } out.println("</body></html>"); } public void destroy() { } }
DBHandler.java
package com.ex.dynamicweb; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; public class DBHandler { private static final String SELECT_ALL_FROM_LIBRARY = "SELECT * FROM library.books"; public static List<String> getBooks() { List<String> result = new ArrayList<String>(); String url = "jdbc:postgresql://localhost:5432/postgres"; String user = "postgres"; String password = "1234"; try (Connection connection = DriverManager.getConnection(url, user, password)) { System.out.println("Java JDBC PostgreSQL Example"); System.out.println("Connected to PostgreSQL database!"); Statement statement = connection.createStatement(); ResultSet resultSet = statement.executeQuery(SELECT_ALL_FROM_LIBRARY); while (resultSet.next()) { result.add(resultSet.getString("NAME") + "- id: " + resultSet.getString("ID")); } } catch (SQLException e) { System.out.println("Connection failure."); e.printStackTrace(); } return result; } }
相关配置说明
- Artifacts:已手动将lib文件夹添加到解压后的war包WEB-INF目录
- Libraries:项目中已添加PostgreSQL JDBC驱动
- Modules:驱动已关联到项目模块
内容的提问来源于stack exchange,提问作者Ice K
相关产品推荐
相关产品推荐

