java.lang.ClassNotFoundException: com.mysql.jdbc.D

2020-04-11 11:02发布

maven pom.xml

<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>Test</groupId>
<artifactId>Test</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>

<name>Test</name>
<url>http://maven.apache.org</url>

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <source>1.6</source>
                <target>1.6</target>
            </configuration>
        </plugin>
    </plugins>
</build>
<dependencies>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>3.8.1</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>servlet-api</artifactId>
        <version>2.5</version>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.18</version>
    </dependency>
</dependencies>

In code Im trying to execute Class.forName("com.mysql.jdbc.Driver").

I get this:

java.lang.ClassNotFoundException: com.mysql.jdbc.Driver

But I have checked I have mysql.jar in jboss-as-7.0.2.Final\standalone\deployments\Test.war\WEB-INF\lib and it has com.mysql.jdbc.Driver class.

4条回答
小情绪 Triste *
2楼-- · 2020-04-11 11:13

I had a slightly different use case. I was using apache's BasicDataSource in a stand-alone application.

I got this exception because I was calling setDriverClassName with com.mysql.jdbc.Driver.class.toString() instead of "com.mysql.jdbc.Drive" as a String (so compile time check ensures that there is no typo or Driver's location didn't change in a version upgrade... etc).

But!

When you look Driver's implementation it has a static initialization block:

static {
  try {
    java.sql.DriverManager.registerDriver(new Driver());
  } catch (SQLException E) {
    throw new RuntimeException("Can't register driver!");
  }
}

When I wrote com.mysql.jdbc.Driver.class.toString() this initialization block executed too early and caused later on misleading ClassNotFoundException to be thrown. Once I switched to "com.mysql.jdbc.Driver" my application started to work.

This is a case when static becomes evil :)

查看更多
狗以群分
3楼-- · 2020-04-11 11:17

As a rule you should not be including your JDBC drivers in your war file.

I suggest you mark the driver as provided and add it to the lib directory of the server.

PS. I'm not sure why you would be using

Class.forName("com.mysql.jdbc.Driver")

in your code. Why not let the contain manage your connections and transactions?

查看更多
一纸荒年 Trace。
4楼-- · 2020-04-11 11:29

It seems you are using JBoss AS7. Check instructions here: https://community.jboss.org/wiki/DataSourceConfigurationInAS7

Basically, you should

  1. Install mysql connector
  2. Create a data source using it
  3. Refer to that data source using JNDI configuration

Class.forName() is an idiom commonly used when data sources are not provided by the container. In modern Java EE servers, they are provided.

查看更多
别忘想泡老子
5楼-- · 2020-04-11 11:33

This error occurred because your mysql jar is not on your run-time class-path. If you are using maven,

  1. Open your EAR/web project properties
  2. Click on "Deployment Assembly"
  3. Click on "Add..."
  4. Select on "Java Build Path Entries"
  5. Click on "Next"
  6. Select "Maven Dependencies"
  7. Click "Finish"
查看更多
登录 后发表回答