我正在尝试设置一个 ant 构建来调用一些 Flyway-ant 目标,但我总是以构建失败告终
Flyway Error: No database found to handle jdbc:mariadb://<some_host>:3306/<some_db>
或类似(不同的 JDBC URL,取决于配置)。在 build.xml 中,我引用了一个 fat jar,它肯定包含来自 Flyway-core、flyway-mysql、flyway-ant 和各种 JDBC 驱动程序包的所有类,包括 mariadb、mysql 等:
<path id="tools.lib.classpath" location="path/to/my/fat.jar" />
<path id="flyway.lib.path" refid="tools.lib.classpath" />
<path id="flyway.classpath" >
<pathelement path="path/to/my/sql/migrations"/>
<path refid="tools.lib.classpath"/>
</path>
<taskdef uri="antlib:org.flywaydb.ant" resource="org/flywaydb/ant/antlib.xml" classpathref="flyway.lib.path" />
<target name="db-info">
<property name="flyway.url" value="jdbc:mariadb://<some_host>:3306/<some_db>" />
<property name="flyway.user" value="some_user" />
<property name="flyway.password" value="psst!" />
<flyway:info/>
</target>
该异常起源于flyway的org.flywaydb.core.internal.database.DatabaseTypeRegister,显然找不到MariaDB URL的DatabaseType。 (使用 MySQL URL 时也会出现同样的问题。)
但是,当在开发中的实际应用程序中使用时,相同的flyway设置(与fat jar中使用的相同的maven包,相同的jdbc URL)工作得很好。
我使用的是 Flyway 8.5.13(由 Spring Boot 管理的版本)和 Flyway-ant 2.19.3。
有什么想法吗?
好的,明白了:Flyway 的数据库适配器是通过调用
org.flywaydb.core.internal.plugin.PluginRegister
在 ServiceLoader.load(Plugin.class, CLASS_LOADER)
中作为“服务”提供和加载的。在 flyway-core
和 flyway-mysql
包中,服务都是在名为 META-INF\services\org.flywaydb.core.extensibility.Plugin
的文件中定义的,并且由于我的 fat jar 仅包含前者,因此未检测到 MariaDB 适配器。
由于一个 jar 几乎不可能包含共享相同路径的两个文件,我想我必须重新考虑我的项目的打包......但无论如何,谜团解决了! :)
我添加了同样的问题,下面的这篇文章帮助了我flyway-database-mysql