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

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

我的pom有:

 mysql mysql-connector-java 5.1.17 jar 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 repo中,我尝试通过mvn命令行显式添加它,但表示它已经存在。

将范围更改为compile

  mysql mysql-connector-java 5.1.17 jar compile  

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

  mysql mysql-connector-java 5.1.17  

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

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

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

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

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

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

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

    org.apache.maven.plugins maven-dependency-plugin   copy package  copy-dependencies    ${project.build.directory}/lib       org.apache.maven.plugins maven-jar-plugin    true lib/ com.tihoo.crawler.Application       

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

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

 war 

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

   4.0.0 com.example example-app 1.0-SNAPSHOT war        

也许它不适合你的问题,但也许别人会需要它。

添加此代码

   mysql mysql-connector-java 5.1.6  

到您的maven项目中的porm.xml文件