我有一个基于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在运行java -jar target\File.jar
后通过&gt; mvn clean install
执行时始终会出错。
java.lang.ClassNotFoundException:com.mysql.jdbc.Driver
为了让maven构建起作用,我在这里缺少什么?运行mvn clean install
没有错误,并且构建正常。只有在执行SNAPSHOT exe时才会发生错误。
MySQL jar在我的.m2 repo中,我尝试通过mvn命令行显式添加它,但是说它已经存在。
答案 0 :(得分:14)
将范围更改为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它因为执行环境将“runtime
提供依赖性,所以不能将该依赖项打包到最终的jar中。例如,在调用jar或者将范围更改为{{1}时,您必须手动将其添加到类路径中这将导致你的罐子里面装满了驱动程序jar,并且可以在运行时使用。
答案 1 :(得分:2)
答案就在这里 - How can I create an executable JAR with dependencies using Maven?
我需要构建一个超级pom,使用上面链接中的答案 - 这将依赖项(在本例中为mysql jar文件)构建到单个SNAPSHOT jar文件中。
请确保使用mvn clean compile assembly:single
(不是通常的mvn clean package
或其他任何内容运行它。
答案 2 :(得分:1)
因为您正在通过&#34; java -jar&#34;运行项目。而且你有依赖关系,所以,你必须使用两个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>
答案 3 :(得分:0)
我也有这个问题。我尝试使用插件将连接器设置为classpath,但是没有用。我试图更改版本,但是没有用。我花了两个晚上,发现我需要在pom.xml中指定我的包裹必须是“战争”。
也许是因为您的项目不知道它是什么类型,所以请尝试输入以下内容:
<?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>
在您的项目版本旁边。像这样:
func findString(_ string: String,
withOptions options: NSString.CompareOptions = []) -> [PDFSelection]
也许它不适合您的问题,但也许其他人会需要它。
答案 4 :(得分:-3)
添加此代码
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version>
</dependency>
到你的maven项目中的porm.xml文件