Failed to load driver class com.mysql.jdbc.Driver

84,881

Solution 1

The answer is so embarrassing. I appended the driver line of application.properties with a semicolon ... Obviously, it did't recognize that driver.

Solution 2

In my case the next dependency was missing:

<dependency>
     <groupId>mysql</groupId>
     <artifactId>mysql-connector-java</artifactId>
</dependency>

In case of using IntelliJ and if you inherit from a <parent>, you can view your effective pom.xml by right clicking anywhere inside your pom.xml, then: enter image description here

and search for the mysql-connector-java artifact as mentioned.

Solution 3

I had a problem where I was using Spring Boot 2.2.0.RELEASE and needed to connect to an old Mysql DB (5.1.73), which required me to downgrade to mysql-connector-java version 5.1.38

    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.38</version>
    </dependency>

Since Spring boot was expecting a newer mysql-java-connector, which has been renamed to com.mysql.cj.jdbc.Driver, I also had to add the spring datasource driver-class-name setting in my spring boot db config.

So my spring boot config ended up like this:

spring:
  datasource:
   url: 'localhost'
   password: password
   username: user
   driver-class-name: com.mysql.jdbc.Driver

Solution 4

just add mysql and jdbc dependencies like below

    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jdbc</artifactId>
    </dependency>

Solution 5

You don't specify version of MYSQL JDBC driver, so you're likely getting version 8.x, where the driver is named differently than in previous versions:

com.mysql.cj.jdbc.Driver

Share:
84,881
Tomas Lukac
Author by

Tomas Lukac

Updated on August 18, 2021

Comments

  • Tomas Lukac
    Tomas Lukac almost 3 years

    I am trying to run my Spring Boot backend with two profiles, one using H2 in memory database and the second one using MySQL. H2 database works just fine, but when I switch to MySQL I get

    APPLICATION FAILED TO START
    ***************************
    
    Description:
    
    Failed to bind properties under '' to com.zaxxer.hikari.HikariDataSource:
    
        Property: driverclassname
        Value: com.mysql.jdbc.Driver;
        Origin: "driverClassName" from property source "source"
        Reason: Failed to load driver class com.mysql.jdbc.Driver; in either of HikariConfig class loader or Thread context classloader
    
    Action:
    
    Update your application's configuration
    

    I have tried deleting .m2, reimporting, maven clean, compile, install and most of the things I could find on the internet, no success. The funny thing is that I have other project with MySQL database only, I had similar issue, but adding mysql-connector-java dependency solved it. I have no clue right now.

    application.properties

    spring.profiles.active=@profilename@
    
    #H2 in memory database
    domain.datasource.type=H2
    domain.datasource.url=jdbc:h2:mem:store;MODE=MYSQL;
    domain.datasource.driver-class=org.h2.Driver
    domain.datasource.username=sa
    domain.datasource.password=
    domain.datasource.generate-dll=true
    

    application-local_mysql.properties

    spring.profiles.active=@profilename@
    
    #MySQL local database
    domain.datasource.type=MYSQL
    domain.datasource.url=jdbc:mysql://localhost:3600/store;
    domain.datasource.driver-class=com.mysql.jdbc.Driver;
    domain.datasource.username=store
    domain.datasource.password=store
    domain.datasource.generate-dll=false
    

    pom.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>sk.personal</groupId>
        <artifactId>my-project</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <packaging>jar</packaging>
    
        <name>my-project</name>
        <description>My personal project.</description>
    
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.0.5.RELEASE</version>
            <relativePath/> <!-- lookup parent from repository -->
        </parent>
    
        <properties>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
            <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
            <java.version>1.8</java.version>
        </properties>
    
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter</artifactId>
                <version>2.0.5.RELEASE</version>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-data-jpa</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
    
            <dependency>
                <groupId>com.h2database</groupId>
                <artifactId>h2</artifactId>
                <scope>runtime</scope>
            </dependency>
    
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <optional>true</optional>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.security</groupId>
                <artifactId>spring-security-test</artifactId>
                <scope>test</scope>
            </dependency>
    
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <scope>runtime</scope>
            </dependency>
    
        </dependencies>
    
        <profiles>
            <profile>
                <id>local_h2</id>
                <properties>
                    <profilename>local_h2</profilename>
                </properties>
                <activation>
                    <activeByDefault>true</activeByDefault>
                </activation>
            </profile>
            <profile>
                <id>local_mysql</id>
                <properties>
                    <profilename>local_mysql</profilename>
                    <maven.test.skip>true</maven.test.skip>
                </properties>
            </profile>
        </profiles>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
        </build>
    </project>
    

    DatasourceConfig.java

    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.boot.jdbc.DataSourceBuilder;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder;
    import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType;
    
    import javax.sql.DataSource;
    
    @Configuration
    public class DatasourceConfig {
    
        @Value("${domain.datasource.url}")
        private String url;
    
        @Value("${domain.datasource.username}")
        private String username;
    
        @Value("${domain.datasource.password}")
        private String password;
    
        @Value("${domain.datasource.type}")
        private String type;
    
        @Value("${domain.datasource.driver-class}")
        private String driverClass;
    
        @Bean
        public DataSource dataSource() {
            if (type.equals("MYSQL")) {
                return DataSourceBuilder
                        .create()
                        .username(username)
                        .password(password)
                        .url(url)
                        .driverClassName(driverClass)
                        .build();
            } else {
                EmbeddedDatabaseBuilder builder = new EmbeddedDatabaseBuilder();
                return builder
                        .setType(EmbeddedDatabaseType.H2)
                        .build();
            }
        }
    }