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

pok*_*ero 10 java mysql eclipse maven

我有一个基于Maven的Java应用程序,并希望连接到MySQL服务器.

我的pom有:

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.17</version>
    <type>jar</type>
    <scope>runtime</scope>
</dependency>
Run Code Online (Sandbox Code Playgroud)

运行时,因为我想在运行时连接到MySQL服务器 - 也尝试过编译和提供,但不起作用.

SQL代码是标准的:

String dbClass = "com.mysql.jdbc.Driver";

Class.forName(dbClass);
Connection connection = DriverManager.getConnection(dbUrl,
    username, password);
Statement statement = connection.createStatement();
ResultSet resultSet = statement.executeQuery(query);
while (resultSet.next()) {
    String tableName = resultSet.getString(1);
    System.out.println("Table name : " + tableName);
}
Run Code Online (Sandbox Code Playgroud)

当我从Eclipse运行它,它工作正常并打印表名.

但是,从maven开始,生成的SNAPSHOT java -jar target\File.jar在运行后通过>执行时总是会出错mvn clean install.

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

为了让maven构建起作用,我在这里缺少什么?运行mvn clean install没有错误,并且构建正常.只有在执行SNAPSHOT exe时才会发生错误.

MySQL jar在我的.m2 repo中,我尝试通过mvn命令行显式添加它,但是它已经存在了.

JBA*_*JBA 15

将范围更改为compile:

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.17</version>
    <type>jar</type>
    <scope>compile</scope>
</dependency>
Run Code Online (Sandbox Code Playgroud)

哪个 - 因为它是默认范围对应于完全忽略范围定义 - 类型的相同计数:

<dependency>
   <groupId>mysql</groupId>
   <artifactId>mysql-connector-java</artifactId>
   <version>5.1.17</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

看看这个:https://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html了解有关范围的详细信息.

以下是您的背景信息:

您指定JDBC驱动程序具有范围runtime.大多数IDE都会忽略这些范围并将所有依赖项添加到它们的类路径中(例如,当你在eclipse之外运行某些东西时使用的类路径.通过范围,runtime你告诉maven它必须不会将该依赖包装到你的最终jar中,因为执行环境将"提供依赖性runtime.例如,您在调用jar时必须手动将其添加到类路径中,或者更改范围,compile以便将jar驱动程序包装在jar中并在运行时可用.