0

Working with Intellij and trying to connect to my database I faces errors.

java.lang.ClassNotFoundException: com.mysql.jdbc.Driver
at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1365)
at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1188)
at java.base/java.lang.Class.forName0(Native Method)
at java.base/java.lang.Class.forName(Class.java:340)
at BooksServlet.doGet(BooksServlet.java:20)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:634)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:690)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:373)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1590)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:630)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.base/java.lang.Thread.run(Thread.java:832)

java.sql.SQLException: No suitable driver found for jdbc:mysql://localhost:3306/java_ee_db
at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:702)
at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:228)
at BooksServlet.doGet(BooksServlet.java:26)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:634)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:690)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:373)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1590)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:630)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.base/java.lang.Thread.run(Thread.java:832)

What I've done is I wrote dependencies:

<dependencies>
    <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.20</version>
    </dependency>
</dependencies>

And this code in my servlet:

 PrintWriter printWriter = response.getWriter();

    try {
        Class.forName("com.mysql.jdbc.Driver");
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }

    try {
        Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/java_ee_db", "root", "legacy");

        Statement statement = connection.createStatement();
        ResultSet resultSet = statement.executeQuery("SELECT title from books");

        while (resultSet.next())
            printWriter.println(resultSet.getString("title"));

        statement.close();
    } catch (SQLException throwables) {
        throwables.printStackTrace();
    }

When I've checked in m2/reposetory, I noticed that there was mysql folder where mysql connetor was(So, as I understand mysql-connector was downloaded by maven). Searching the net I didn't find the answer, but It started to work, when I donwload mysql-connector and added .jar file to WEB-INF/lib. What's wrong? Am I doing all correctly?

Mark Rotteveel
  • 82,132
  • 136
  • 114
  • 158
Donny
  • 33
  • 5
  • Maven should have included the JAR file in WEB-INF/lib for you. You don't need the `Class.forName()` line. – user207421 Jun 02 '20 at 08:25
  • Well, it didn' actually, there is no lib folder it WEB-INF, but there is a .jar file in .idea with mysql-connector. After I delete `Class.forname()` It still complains `java.sql.SQLException: No suitable driver found for jdbc:mysql://localhost:3306/java_ee_db` – Donny Jun 02 '20 at 08:35
  • @user207421 Actually, if the driver is included in the `WEB-INF/lib` folder, then you do need to use `Class.forName`. Automatic driverloading only works when the driver is on the initial classpath (ie in the `lib` folder of Tomcat itself). – Mark Rotteveel Jun 02 '20 at 09:00
  • In any case, the problem would indicate the driver is not in the Tomcat lib folder, nor in the `WEB-INF/lib` folder of the WAR. – Mark Rotteveel Jun 02 '20 at 09:04
  • What should I do? – Donny Jun 02 '20 at 09:08
  • @MarkRotteveel WEB-INF/lib is in the initial classpath of any Web application. – user207421 Jun 02 '20 at 09:47
  • @user207421 But it isn't the initial classpath of the Java application. Tomcat is launched, and that is the initial classpath, then tomcat loads web applications from the WAR, that is a secondary classpath, one for each web application. The automatic driver loading will only load drivers from the initial classpath, not from the secondary classpaths. – Mark Rotteveel Jun 02 '20 at 09:53

0 Answers0