为啥 Spring JPA Mysql 数据连接可以在 IntelliJ 中正确初始化,但不能在命令行中初始化?

Posted

技术标签:

【中文标题】为啥 Spring JPA Mysql 数据连接可以在 IntelliJ 中正确初始化,但不能在命令行中初始化?【英文标题】:Why Spring JPA Mysql data connection can be initialized properly in IntelliJ but not on command line?为什么 Spring JPA Mysql 数据连接可以在 IntelliJ 中正确初始化,但不能在命令行中初始化? 【发布时间】:2022-01-21 03:02:41 【问题描述】:

我有以下 gradle 依赖项:

    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    implementation 'mysql:mysql-connector-java:8.0.27'

我的 application-local.yaml 有以下内容:(编辑了 yml 文件名中的错字)

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/local_test
    username: root
    password: root
    driver-class-name: com.mysql.cj.jdbc.Driver

我在 IntelliJ 上构建并运行了我的应用程序(只需运行具有 SpringApplication.run 的主类 MainApplication)并且连接正常。我查看了 IntelliJ 使用的幕后命令,是这样的:

<jvmdirectory>/Contents/Home/bin/java 
-XX:TieredStopAtLevel=1 
-noverify 
-Dspring.profiles.active=local 
-Dspring.output.ansi.enabled=always 
-javaagent:/Applications/IntelliJ IDEA.app/Contents/lib/idea_rt.jar=58413:/Applications/IntelliJ IDEA.app/Contents/bin 
-Dcom.sun.management.jmxremote 
-Dspring.jmx.enabled=true 
-Dspring.liveBeansView.mbeanDomain 
-Dspring.application.admin.enabled=true 
-Dfile.encoding=UTF-8 
-classpath <many jar files here, some come from ~/.gradle/caches/, some come from my app directory .out/lib/> com.x.MainApplication 
--logging.config=classpath:log4j2.xml

它运行并且初始化 Hibernate/JPA/Database bean 设置没有错误。

但是,如果我在命令行上运行它们(稍后我将不得不这样做,因为我将在 Docker 上运行它),它不会在数据源初始化之后继续进行。这是我使用的命令:

java \
 -XX:TieredStopAtLevel=1 -noverify \
 -Dspring.config.activate.on-profile=local \
 -Duser.timezone=UTC \
 -jar .out/libs/app-x-1.0.0-SNAPSHOT.jar \
 --logging.config="classpath:log4j2.xml" \

它给出了这个非常常见的错误:


  "timestamp": "2021-12-18T17:41:53,080Z",
  "level": "ERROR",
  "thread": "main",
  "message": "

***************************
APPLICATION FAILED TO START
***************************
Description:
Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be configured.
Reason: Failed to determine a suitable driver class


Action:

Consider the following:tIf you want an embedded database (H2, HSQL or Derby), please put it on the classpath.
\tIf you have database settings to be loaded from a particular profile you may need to activate it (the profiles x are currently active).
",
  "logger": "org.springframework.boot.diagnostics.LoggingFailureAnalysisReporter"

关于这个错误有很多 SO 帖子,每个人都建议排除 DatasourceAutoConfiguration.class 但老实说,我不太了解这一点(没有人真正解释它的作用以及为什么排除它)而且我不知道如果排除它对我来说是正确的。我确实希望数据源在 Spring 应用启动时启动。

我的问题有两个部分:

    为什么通过 IntelliJ 和命令行运行应用程序的行为差异如此之大? 我应该像其他人一样排除 DatasourceAutoConfiguration.class 吗?如果是,为什么?

提前致谢!

【问题讨论】:

您确定您的问题不仅仅是与您正在加载的 applcation-dev.yml 而不是 application.yml 相关吗? @NoDataFound 抱歉,错字,我加载了 application-local.yml。已更新。 【参考方案1】:

什么对我有用: 使用-Dspring.profiles.active=local 而不是-Dspring.config.activate.on-profile=local

我不知道为什么会这样。如果有人知道,请回复此答案。

另外,我不需要排除DatasourceAutoConfiguration.class

【讨论】:

根据我对docs.spring.io/spring-boot/docs/current/reference/html/… 文档的理解,spring.config.activate.on-profile 应在特定 YAML 文档中使用,以在该条件下激活该文档。所以在命令行上使用它没有任何效果。 spring.profiles.active 专门用于配置活动配置文件。

以上是关于为啥 Spring JPA Mysql 数据连接可以在 IntelliJ 中正确初始化,但不能在命令行中初始化?的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot JPA 连接数据库

spring boot 通过jpa连接mysql失败

配置 Spring JPA 连接 MySQL

两小时上手Spring Boot (开发红包程序———通过JPA 连接Mysql ,事务等内容) 遇到的问题

基于可编辑位置属性的 Spring Data JPA 自动排序行

MYSQL Workbench 未填充 Spring Boot JPA 实体的表数据