我有一个基于 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>
使用 _运行时_,因为我想在运行时连接到 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 命令行显式添加它,但说它已经存在。
原文由 pokero 发布,翻译遵循 CC BY-SA 4.0 许可协议
将范围更改为
compile
:哪个 - 因为它是默认范围对应于根本不考虑范围定义 - 相同类型的计数:
看看这个: https ://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html 有关范围的详细信息。
以下是有关您的背景的快速信息:
您指定 JDBC 驱动程序的范围为
runtime
。大多数IDE无论如何都会忽略范围并将所有依赖项添加到 它们的 类路径(例如,当您在eclipse之外运行某些东西时使用的类路径。通过范围runtime
你告诉maven它不能打包那个依赖进入您的最终 jar,因为执行环境将“在runtime
提供依赖关系。例如,您必须在调用 jar 时手动将其添加到类路径或将范围更改为compile
这将导致 driver-jar beeing 打包在你的 jar 中并在运行时可用。