2015-03-24 27 views
5

我有一個基於Maven的Java應用程序,並且想要連接到MySQL服務器。Maven - java.lang.ClassNotFoundException:com.mysql.jdbc.Driver

我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命令行顯式添加它,但是表示它已經存在。

+0

是類路徑上的m2回購?您的IDE通常會在您從其啓動時添加它,但是如果從命令行啓動,則可能必須手動指定它。 – 2015-03-25 00:12:16

回答

12

變化範圍,以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中, 。運行時

+0

謝謝,但我嘗試過,沒有區別。答案在下面,我需要通過在pom中使用插件來將依賴關係構建到SNAPSHOT中。 – pokero 2015-03-25 19:15:28

+0

好吧,它應該有所作爲 - 使用兩個範圍檢查(* -SNAPSHOT).jar的大小和內容 - 使用範圍'provided'構建的範圍不包含驅動程序,並且尺寸小於構建的範圍範圍'編譯',因爲它將包裝內部的驅動程序jar。你可能想看看這個鏈接http://docs.oracle.com/javase/tutorial/deployment/jar/downman.html,因爲也許它沒有正確添加到你的類路徑中。 – JBA 2015-03-26 07:06:39

+0

如果您從構建中獲得'.exe',則應該添加相應的插件定義,因爲默認情況下,Maven不能打包到exe文件 – JBA 2015-03-26 07:07:18

2

答案就在這裏 - How can I create an executable JAR with dependencies using Maven?

,我需要建立一個超級POM,使用answe r在上面的鏈接中 - 這個依賴關係(在這種情況下是mysql jar文件)建立在一個單獨的SNAPSHOT jar文件中。

只要確保你運行它與mvn clean compile assembly:single(不是通常的mvn clean package或任何其他。

+1

着色器插件將自己綁定到phase package '並且在運行'mvn clean package'時執行;)看看如何爲可執行jar重新創建一個Manifest - 我期望這是你的實際問題 - 沒有關於Maven;) – JBA 2015-03-26 14:47:44

+0

謝謝,將會檢查shader 。 – pokero 2015-03-27 16:41:32

0

既然你正在運行的「Java的罐子」的項目,你也有依賴,加入以下代碼

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

,所以,你必須使用兩個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> 
相關問題