首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >com.mysql.jdbc.Driver - java.lang.ClassNotFoundException: Maven

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

Stack Overflow用户
提问于 2015-03-25 07:55:52
回答 5查看 41.8K关注 0票数 10

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

我的pom有:

代码语言:javascript
复制
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.17</version>
    <type>jar</type>
    <scope>runtime</scope>
</dependency>

运行时,因为我想在运行时连接到MySQL服务器-我也尝试过编译和提供,但不起作用。

SQL代码是标准的:

代码语言:javascript
复制
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中,在运行mvn clean install之后通过>java -jar target\File.jar执行时,生成的快照总是会给出一个错误。

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

为了让maven构建正常工作,我在这里遗漏了什么?运行mvn clean install没有错误,构建也很好。只有在执行快照exe时才会发生错误。

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

EN

回答 5

Stack Overflow用户

发布于 2015-03-25 15:04:23

将作用域更改为compile

代码语言:javascript
复制
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.17</version>
    <type>jar</type>
    <scope>compile</scope>
</dependency>

因为它是默认的作用域,所以它对应于完全没有作用域定义的类型:

代码语言:javascript
复制
<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中并在运行时可用。

票数 16
EN

Stack Overflow用户

发布于 2018-01-17 09:17:12

因为你是通过"java -jar“来运行项目的,而且你也有依赖关系,所以,你必须使用两个maven插件。第一个用于在打包时将依赖项复制到目标文件夹(例如lib/)内的文件夹中,第二个用于指定类路径,它应该与第一个(lib/)相同。我也遇到了同样的问题,下面是我所做的:

代码语言:javascript
复制
<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>
票数 3
EN

Stack Overflow用户

发布于 2015-03-26 03:13:32

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

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

只需确保您使用mvn clean compile assembly:single (而不是通常的mvn clean package或其他什么)运行它。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29245102

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档