使用JHipster添加实体后执行mvn liquibase:diff报错:Found multiple catalogs matching schema
我之前在JHipster项目搭配MySQL 5.7开发时,也碰到过一模一样的问题。本质原因是Liquibase在MySQL环境里对catalog和schema的边界比较模糊——MySQL里这两个概念其实都指向数据库名,当没有明确指定要操作的目标数据库时,Liquibase扫描到多个匹配项,就会抛出这个错误。下面是几个亲测有效的解决办法:
在配置文件里明确Liquibase的目标schema
打开src/main/resources/config/application-dev.yml(对应你当前使用的环境配置文件),找到liquibase配置段,添加default-schema参数,值填你的数据库名称:liquibase: contexts: dev change-log: classpath:config/liquibase/master.xml default-schema: your_database_name parameters: databaseChangeLogTableName: databasechangelog databaseChangeLogLockTableName: databasechangeloglock同时要确认数据源的JDBC URL已经指定了数据库,比如:
jdbc:mysql://localhost:3306/your_database_name?useUnicode=true&characterEncoding=utf8&useSSL=false执行diff命令时显式指定schema参数
如果不想修改配置文件,也可以在执行命令时直接附加schema参数:mvn -e compile liquibase:diff -Dliquibase.schema=your_database_name在pom.xml里配置Liquibase插件的默认schema
打开项目的pom.xml,找到liquibase-maven-plugin的配置块,添加defaultSchemaName节点来指定目标数据库:<plugin> <groupId>org.liquibase</groupId> <artifactId>liquibase-maven-plugin</artifactId> <version>3.5.3</version> <configuration> <changeLogFile>src/main/resources/config/liquibase/master.xml</changeLogFile> <driver>com.mysql.jdbc.Driver</driver> <!-- MySQL5.7适配这个驱动 --> <url>jdbc:mysql://localhost:3306/your_database_name?useUnicode=true&characterEncoding=utf8&useSSL=false</url> <username>your_db_username</username> <password>your_db_password</password> <defaultSchemaName>your_database_name</defaultSchemaName> <verbose>true</verbose> </configuration> </plugin>
这几个方法核心都是帮Liquibase精准定位要操作的数据库,避免它扫描到多个匹配的catalog/schema。一般选其中一个就能解决问题。
内容的提问来源于stack exchange,提问作者Samuel Gwokuda

