我如何使用部署在战争 Spring Boot 应用程序中的 mysql jdbc 驱动程序

Posted

技术标签:

【中文标题】我如何使用部署在战争 Spring Boot 应用程序中的 mysql jdbc 驱动程序【英文标题】:How I can use the mysql jdbc driver deployed inside a war spring boot application 【发布时间】:2020-03-02 12:27:59 【问题描述】:

我使用 JPA 和 mysql 创建了一个 Spring Boot 应用程序。当我将应用程序部署为 jar 文件时,一切正常。如果我按照客户的要求将应用程序部署为 tomcat 8.0 上的 war 文件,则应用程序无法找到 jdbc 驱动程序,除非我将其放在 TOMCAT_HOME/lib 目录中。我的客户没有将驱动程序放入 TOMCAT_HOME/lib 的内容。我收到此错误:

Caused by: java.sql.SQLException: No suitable driver found for jdbc:mysql://localhost:3306/database_name
    at java.sql.DriverManager.getConnection(DriverManager.java:689)
    at java.sql.DriverManager.getConnection(DriverManager.java:208)
    at org.springframework.jdbc.datasource.DriverManagerDataSource.getConnectionFromDriverManager(DriverManagerDataSource.java:154)
    at org.springframework.jdbc.datasource.DriverManagerDataSource.getConnectionFromDriver(DriverManagerDataSource.java:145)
    at org.springframework.jdbc.datasource.AbstractDriverBasedDataSource.getConnectionFromDriver(AbstractDriverBasedDataSource.java:205)
    at org.springframework.jdbc.datasource.AbstractDriverBasedDataSource.getConnection(AbstractDriverBasedDataSource.java:169)
    at org.hibernate.engine.jdbc.connections.internal.DatasourceConnectionProviderImpl.getConnection(DatasourceConnectionProviderImpl.java:122)
    at org.hibernate.internal.NonContextualJdbcConnectionAccess.obtainConnection(NonContextualJdbcConnectionAccess.java:35)
    at org.hibernate.resource.jdbc.internal.LogicalConnectionManagedImpl.acquireConnectionIfNeeded(LogicalConnectionManagedImpl.java:106)
    ... 65 more

有没有办法让tomcat 引用位于war 文件中的jdbc 驱动程序? 我的 pom.xml 文件具有以下依赖项

    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <scope>runtime</scope>
    </dependency>

...

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-tomcat</artifactId>
   <scope>provided</scope>
</dependency>   


<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>3.1.0</version>
    <scope>provided</scope>
</dependency>

【问题讨论】:

您正在自己配置数据源。让 Spring Boot 为你做这件事。此外,DriverManagerDataSource 并不是真正用于生产,因为它不是连接池。所以放弃你的DataSource bean 定义(删除@Bean 方法)并将所需的spring.datasource.* 属性添加到application.properties 并重新启动你的应用程序。 【参考方案1】:

我找到了错误的来源。我在没有指定驱动类的情况下手动初始化了数据源

    final DriverManagerDataSource dataSource = new DriverManagerDataSource();
    dataSource.setUrl(env.getProperty("spring.datasource.url"));
    dataSource.setUsername(env.getProperty("spring.datasource.username"));
    dataSource.setPassword(env.getProperty("spring.datasource.password"));
    return dataSource;

有效的代码是:

    final DriverManagerDataSource dataSource = new DriverManagerDataSource();
    dataSource.setUrl(env.getProperty("spring.datasource.url"));
    dataSource.setUsername(env.getProperty("spring.datasource.username"));
    dataSource.setPassword(env.getProperty("spring.datasource.password"));
    dataSource.setDriverClassName(env.getProperty("spring.datasource.driver-class-name"));
    return dataSource;

【讨论】:

以上是关于我如何使用部署在战争 Spring Boot 应用程序中的 mysql jdbc 驱动程序的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Tomcat 部署(和访问)Spring Boot 战争? (使用入门指南)

Tomcat中的spring-boot应用程序战争部署,现有的spring web应用程序失败

在tomcat 8上部署战争时未加载Spring Boot应用程序

如何使用 Jenkins 部署 Spring Boot Maven 应用程序?

为 Spring Boot 应用程序生成战争

从 Spring Boot 项目部署战争