簡體   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