为啥 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 连接Mysql ,事务等内容) 遇到的问题