flyway-ant:找不到处理 jdbc 的数据库:

问题描述 投票:0回答:2

我正在尝试设置一个 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。

有什么想法吗?

ant flyway
2个回答
1
投票

好的,明白了: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 几乎不可能包含共享相同路径的两个文件,我想我必须重新考虑我的项目的打包......但无论如何,谜团解决了! :)


0
投票

我添加了同样的问题,下面的这篇文章帮助了我flyway-database-mysql

© www.soinside.com 2019 - 2024. All rights reserved.