SQLException: no suitable driver found for jdbc:mysql 两个Maven项目之间的问题

12

我在我的Eclipse(v4.7.0)工作区中有两个Maven项目。

第一个项目包含一些实用程序,并通过JDBC驱动程序保持与MySQL数据库的连接。

<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>dbtools</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>jar</packaging>
  <name>DBTools</name>

<properties>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
</properties>

<dependencies>
    <!-- JDBC for MySQL -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>6.0.6</version>
    </dependency>
    <dependency>
        <groupId>commons-beanutils</groupId>
        <artifactId>commons-beanutils</artifactId>
        <version>1.9.3</version>
    </dependency>
    <dependency>
        <groupId>javax.persistence</groupId>
        <artifactId>persistence-api</artifactId>
        <version>1.0.2</version>
    </dependency>
</dependencies>
</project>

这个第一个项目被构建成一个jar文件,并且在第二个项目中(包含主应用程序的项目)作为Maven依赖项包含在其中,如下面的pom.xml所示:

<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>mainapp</artifactId>
 <version>0.0.1-SNAPSHOT</version>
 <packaging>war</packaging>
 <name>MainApp</name>

<properties>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
    <jersey2.version>2.25.1</jersey2.version>
    <jaxrs.version>2.0.1</jaxrs.version>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
</properties>

<build>
    <plugins>
        <plugin>
            <artifactId>maven-clean-plugin</artifactId>
            <version>2.6.1</version>
            <configuration>
                <filesets>
                    <fileset>
                        <directory>C:/apps/tomcat/webapps/mainapp</directory>
                        <includes>
                            <include>**</include>
                        </includes>
                        <followSymlinks>false</followSymlinks>
                    </fileset>
                </filesets>
            </configuration>
        </plugin>
        <plugin>
            <artifactId>maven-resources-plugin</artifactId>
            <executions>
                <execution>
                    <id>copy-appCtx</id>
                    <phase>generate-resources</phase>
                    <goals>
                        <goal>copy-resources</goal>
                    </goals>
                    <configuration>
                        <outputDirectory>C:/apps/tomcat/webapps/</outputDirectory>
                        <overwrite>true</overwrite>
                        <resources>
                            <resource>
                                <directory>../mainapp/target</directory>
                                <includes>
                                    <include>mainapp-0.0.1-SNAPSHOT.war</include>
                                </includes>
                            </resource>
                        </resources>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

<dependencies>
    <!-- JAX-RS -->
    <dependency>
        <groupId>javax.ws.rs</groupId>
        <artifactId>javax.ws.rs-api</artifactId>
        <version>${jaxrs.version}</version>
    </dependency>
    <!-- Jersey 2.25.1 -->
    <dependency>
        <groupId>org.glassfish.jersey.containers</groupId>
        <artifactId>jersey-container-servlet</artifactId>
        <version>${jersey2.version}</version>
    </dependency>
    <dependency>
        <groupId>org.glassfish.jersey.core</groupId>
        <artifactId>jersey-server</artifactId>
        <version>${jersey2.version}</version>
    </dependency>
    <dependency>
        <groupId>org.glassfish.jersey.core</groupId>
        <artifactId>jersey-client</artifactId>
        <version>${jersey2.version}</version>
    </dependency>

    <!-- Local DBTool -->
    <dependency>
        <groupId>com.example</groupId>
        <artifactId>dbtools</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </dependency>
</dependencies>
</project>

主要应用程序的第二个项目被部署为war文件。当我启动Tomcat(使用第二个应用程序的war)时,我在运行时遇到 SQLException

java.sql.SQLException: No suitable driver found for jdbc:mysql://localhost:3306/mydb?autoReconnect=true&useSSL=false
at java.sql.DriverManager.getConnection(DriverManager.java:689)

我在StackOverflow上读了几个关于这个异常的问题,但是我还没有找到有效的解决方案 :(

在Tomcat安装文件夹的lib文件夹中,我放置了mysql-connector-java-6.0.6.jar。

我还注意到第一个项目的JAR文件(将其作为档案打开)中没有JDBC连接器。这是正常的吗?

在第一个项目中,我是这样进行连接的:

conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/torre?autoReconnect=true&useSSL=false", "dbuser", "dbpass");

conn的类型为java.sql.Connection。

我还尝试了放置:

Class.forName("com.mysql.jdbc.Driver");

在“conn = ...”行之前,但我得到了相同的结果:(

我正在使用Tomcat 8.5和JDK 1.8。

有什么想法可以解决这个问题吗?我在Maven或Eclipse构建配置中是否遗漏了什么?

提前感谢您的帮助! :)


1
罗伯托,当你在应用程序文件夹中搜索 mysql-connector*.jar 时,是否会得到任何结果?例如,webapps/<<your_application>>/WEB-INF/lib?可能还有一个连接器 jar 在类路径上,它作为传递依赖项而来。 - Mikita Berazouski
是的,如果我在“webapps/mainapp-0.0.1-SNAPSHOT/WEB-INF/lib”中搜索“mysql-connector*.jar”,唯一的结果是:mysql-connector-java-6.0.6.jar。 - Roberto Milani
1
制作 WEB-INF/lib 的屏幕截图,以便人们能够查看并发驱动程序实现的任何JAR文件,这样做有意义吗? - Mikita Berazouski
1
@RobertoMilani,你能否运行我构建的快速示例:下载。Tomcat应该是纯净的,没有任何额外的驱动程序(从tomcat/lib中删除连接器)。这对我有效。唯一需要更改的是index.jsp文件中的连接属性。对我而言,它有效。如果对你无效,则意味着你的环境出了问题,而不是代码有问题。我们会找出原因的。在导航到http://host:port/app之后,它应该在你设置的模式中创建一个“sample”表。 - Mikita Berazouski
1
@RobertoMilani,我觉得我没有完全理解你的问题。如果你仍然在运行你的版本时遇到问题,把你的war文件或整个预配置的tomcat给我看看,这样我就可以更详细地了解问题所在。这样我们最终可以解决它,并提供一个适当的解决方案=) - Mikita Berazouski
显示剩余12条评论
2个回答

1
提供我理解的输入
你提到了
“我还注意到,在第一个项目的JAR文件中(将其作为存档打开),没有JDBC连接器。这正常吗?”
当你构建jar时,不像war那样,你将找不到依赖项[只有一个没有maven-shade-plugin的jar,它将没有其依赖项]
所以使用maven-shaded-pluginhttps://maven.apache.org/plugins/maven-shade-plugin/examples/resource-transformers.html
<project>        
  ...
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-shade-plugin</artifactId>
        <version>3.1.0</version>
        <executions>
          <execution>
            <goals>
              <goal>shade</goal>
            </goals>
            <configuration>
              <transformers>
                <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                  <manifestEntries>
                    <Main-Class>com.yourpackage.YourClass</Main-Class>
                    <X-Compile-Source-JDK>${maven.compile.source}</X-Compile-Source-JDK>
                    <X-Compile-Target-JDK>${maven.compile.target}</X-Compile-Target-JDK>
                  </manifestEntries>
                </transformer>
              </transformers>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
  ...
</project>

在你的pom.xml中[用于生成jar的project-1]

现在,如果您进行maven构建,将会得到两个jar包(一个是原始的,另一个是带有pom依赖项的jar包)

如果您提取的是大小更大的那个(带有依赖项的那个),您可以在此处找到jdbc jar

现在针对project 2

当您将project-1作为依赖项时[请确保包含带有依赖项的较大版本而不是没有依赖项的较小版本] 如果您正在使用远程存储库进行推送,则较大的版本将被推送 因此,在pom [project-1]中提到它时,将下载较大的jar 构建后,请检查project-1 jar是否具有其自己的依赖项

最后构建war并部署

来源:曾经处理过类似的情况,看起来与我之前处理的情况相似

让我知道结果[大多数情况下,它会正常工作,如果不行,我的联系方式是:es12b1005@iith.ac.in,我会尽力帮助]

谢谢 :)


一些疑问:当您在数据库工具中进行测试时,如何测试是否已连接到数据库,例如如何从主应用程序或通过JUnit运行它?尝试通过调用类方法在jar创建后运行[像一个单独的应用程序]通过cmd <Main-Class>com.yourpackage.YourClass</Main-Class> 在这里,您必须提供要调用的类名 [您将在应用程序2中调用此处] 通过这种方式,即使在包含在项目2之前, 您可以确保项目1正常工作 :) 谢谢 - Ampati Hareesh

1

首先了解一下JDBC 4.0的自动类加载,可以在这里查看

现在,查看META-INF/services/java.sql.Driver的内容,其中是com.mysql.cj.jdbc.Driver。因此,您会遇到异常。

请将project1的mysql连接器依赖项更新为以下内容。

<dependency>
  <groupId>mysql</groupId>
  <artifactId>mysql-connector-java</artifactId>
  <version>5.1.41</version>
</dependency>

这将通过传递依赖项自动包含在project2的WEB-INF/lib中。因此,您无需将其包含在tomcat lib中。

从tomcat lib中删除6.0.6 mysql连接器。

如果问题仍然存在,请在获取连接之前尝试明确注册它。

Class.forName("com.mysql.jdbc.Driver");

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接