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

新手上路,请多包涵

我有一个基于 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>

使用 _运行时_,因为我想在运行时连接到 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);
}

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

但是,从 maven 生成的 SNAPSHOT 在运行 mvn clean install java -jar target\File.jar 执行时总是出错。

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

为了使 Maven 构建正常工作,我在这里缺少什么?运行 mvn clean install 没有错误并且构建良好。只有在执行 SNAPSHOT exe 时才会发生错误。

MySQL jar 在我的 .m2 存储库中,我尝试通过 mvn 命令行显式添加它,但说它已经存在。

原文由 pokero 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 625
1 个回答

将范围更改为 compile

 <dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.17</version>
    <type>jar</type>
    <scope>compile</scope>
</dependency>

哪个 - 因为它是默认范围对应于根本不考虑范围定义 - 相同类型的计数:

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

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

以下是有关您的背景的快速信息:

您指定 JDBC 驱动程序的范围为 runtime 。大多数IDE无论如何都会忽略范围并将所有依赖项添加到 它们的 类路径(例如,当您在eclipse之外运行某些东西时使用的类路径。通过范围 runtime 你告诉maven它不能打包那个依赖进入您的最终 jar,因为执行环境将“在 runtime 提供依赖关系。例如,您必须在调用 jar 时手动将其添加到类路径或将范围更改为 compile 这将导致 driver-jar beeing 打包在你的 jar 中并在运行时可用。

原文由 JBA 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题