繁体   English   中英

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

[英]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>

使用runtime ,因为我想在运行时连接到 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 命令行显式添加它,但说它已经存在。

更改要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 ,这将导致驱动程序 jar 打包在您的 jar 中并在运行时可用。

由于您通过“java -jar”运行项目并且还具有依赖项,因此,您必须使用两个 maven 插件。 第一个在打包时将依赖项复制到目标文件夹(例如 lib/)中的文件夹中,第二个用于指定类路径,该类路径应与第一个(lib/)相同。 我遇到了同样的问题,这就是我所做的:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-dependency-plugin</artifactId>
            <executions>
                <execution>
                    <id>copy</id>
                    <phase>package</phase>
                    <goals>
                        <goal>copy-dependencies</goal>
                    </goals>
                    <configuration>
                        <outputDirectory>
                            ${project.build.directory}/lib
                        </outputDirectory>
                    </configuration>
                </execution>
            </executions>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <configuration>
                <archive>
                    <manifest>
                        <addClasspath>true</addClasspath>
                        <classpathPrefix>lib/</classpathPrefix>

                  <mainClass>com.tihoo.crawler.Application</mainClass>
                    </manifest>
                </archive>
            </configuration>
        </plugin>
    </plugins>
</build>

答案就在这里—— 如何使用 Maven 创建具有依赖关系的可执行 JAR?

我需要使用上面链接中的答案构建一个 uber pom - 这会将依赖项(在本例中为 mysql jar 文件)构建到单个 SNAPSHOT jar 文件中。

只需确保使用mvn clean compile assembly:single运行它(不是通常的mvn clean package或其他任何东西。

我也有这个问题。 我尝试使用插件将连接器设置为类路径,但它不起作用。 我试图改变版本,它没有工作。 我花了两个晚上才发现我需要在 pom.xml 中指定我需要我的包成为“战争”。

也许是因为你的项目不知道它是什么类型,所以试着把这个:

<packaging>war</packaging>

就在您的项目版本旁边。 像这样的东西:

<?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>com.example</groupId>
<artifactId>example-app</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging> <!-- Here -->

<properties>
    <!-- Some properties here -->
</properties>

<dependencies>
    <!-- Some dependencies here -->
</dependencies>

也许它不适合您的问题,但也许其他人会需要它。

添加此代码

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

到你的Maven项目中的porm.xml文件

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM