SQLException: 在两个 maven 项目之间没有找到适合 jdbc:mysql 的驱动程序

Posted

技术标签:

【中文标题】SQLException: 在两个 maven 项目之间没有找到适合 jdbc:mysql 的驱动程序【英文标题】:SQLException: no suitable driver found for jdbc:mysql between two maven projects 【发布时间】:2018-01-28 01:01:52 【问题描述】:

我的 Eclipse (v4.7.0) 工作区中有 2 个 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(与第二个应用程序的战争)时,我在运行时收到 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)

我在 *** 中阅读了几个关于此异常的问题,但我仍然没有找到可行的解决方案:(

在我的 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");

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

我正在使用 Tomcat 8.5 和 JDK 1.8。

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

提前感谢您的帮助! :)

【问题讨论】:

Roberto,当您在应用程序文件夹中搜索 mysql-connector*.jar 时 - 它会给您任何结果吗?例如。 webapps/>/WEB-INF/lib?它可能是类路径上的另一个连接器 jar,它作为传递依赖出现。 是的,如果我在“webapps/mainapp-0.0.1-SNAPSHOT/WEB-INF/lib”中搜索“mysql-connector*.jar”,唯一的结果是:mysql-connector-java- 6.0.6.jar 制作WEB-INF/lib 的屏幕截图是否有意义,以便人们可以查看任何可以提供并发驱动程序实现的 jar? @RobertoMilani 你能运行我构建的快速示例吗:download。 Tomcat 应该是简单的,没有任何额外的驱动程序(从tomcat/lib 中删除连接器。它对我有用。唯一应该更改的是 index.jsp 文件中的连接属性。对我来说它有效。如果它不适合你这将意味着您的环境而不是代码有问题。我们会弄清楚的。导航到host:port/app 后,它应该在您将在 index.jsp 中设置的架构中创建一个sample @RobertoMilani,我想我没有 100% 抓住你。因此,如果您在运行版本时仍然遇到问题。给我您的战争文件甚至整个预配置的tomcat是否有意义,以便我可以详细查看问题。所以我们最终可以修复它并在这里提供一个合适的解决方案 =) 【参考方案1】:

根据我的理解提供意见

你提到了

我还注意到在第一个项目的 JAR 文件中(打开 它作为一个存档)里面没有 JDBC 连接器。正常吗?

当你构建 jar 不像战争时,你不会找到依赖项[只有一个没有 maven-shade-plugin 的 jar,它不会有它的依赖项]

所以使用 maven-shaded-plugin https://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 中的依赖项)

如果您提取具有更大尺寸的那个[具有依赖关系的那个] 你可以在这里找到 jdbc jar

现在是项目 2

当您将 project-1 作为依赖项包含时 [确保包含较大的而不是较小的(不包含依赖项)] 如果您在推送时使用远程存储库,则将推送较大的存储库 所以当你在 pom [project-1] 中提到它时,将下载更大的 jar 构建后检查 project-1 jar 是否有自己的依赖项

最后构建战争并部署

来源:同一种场景,看起来和我之前工作的很相似

让我知道结果[大多数情况下它会起作用,如果不是 mycontact :es12b1005@iith.ac.in 会尽力帮助]

谢谢:)

【讨论】:

几个疑问:当你在 db 工具中测试时,你如何测试你是否连接到 db,就像你如何将它作为应用程序运行一样,从 main 或通过 junit?尝试通过 cmd com.yourpackage.YourClass 创建 jar 后调用类方法[像单独的应用程序] 在这里你必须给你的类名,你要调用 [where你将在 application-2] 中以这种方式调用它,甚至在包含在 project-2 中之前你可以确保 project-1 工作正常:) 谢谢【参考方案2】:

首先要熟悉 JDBC 4.0 here 的自动类加载。

现在,查看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 thro' 传递依赖的WEB-INF/lib 中。因此,您不需要将其包含在 tomcat 库中。

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

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

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

【讨论】:

以上是关于SQLException: 在两个 maven 项目之间没有找到适合 jdbc:mysql 的驱动程序的主要内容,如果未能解决你的问题,请参考以下文章

java.sql.SQLException: 找不到适合 jdbc:sqlserver 的驱动程序... (intellij, maven)

Maven - 相同依赖项的多个版本

H2 java.sql.SQLException:找不到合适的驱动程序

Netbeans 中的 Maven Web 项目正在抛出 java.sql.SQLException:没有为 jdbc:mysql://localhost:3306/ 找到合适的驱动程序

Maven + SLF4J:使用需要两个不同 SLF4J 版本的两个不同依赖项时的版本冲突

如何使用maven shaded插件而不是两个创建一个包含所有依赖项的可执行jar