为什么 flyway 的数据库驱动程序依赖性没有在 Maven 的 pom.xml 中的插件本身内声明?

Why flyway's database driver dependency is not declared within the plugin itself in maven's pom.xml?

大多数依赖其他包的插件倾向于在插件配置中声明依赖。例如,spotbugs' doc 这样做

<plugin>
  <groupId>com.github.spotbugs</groupId>
  <artifactId>spotbugs-maven-plugin</artifactId>
  <version>4.2.0</version>
  <dependencies>
    <!-- overwrite dependency on spotbugs if you want to specify the version of spotbugs -->
    <dependency>
      <groupId>com.github.spotbugs</groupId>
      <artifactId>spotbugs</artifactId>
      <version>4.2.3</version>
    </dependency>
  </dependencies>
</plugin>

spotbugs“核心”的版本在plugin > dependencies > dependency中指定。

但是,flyway 似乎不能这样工作。例如,数据库驱动程序位于 <dependencies> 中的以下配置运行得很好。

    <dependencies>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
    </dependencies>

    ...

    <build>
        <plugins>
            <plugin>
                <groupId>org.flywaydb</groupId>
                <artifactId>flyway-maven-plugin</artifactId>
                <version>${flyway.version}</version>
                <configuration>
                    <url>jdbc:mysql://localhost:3306/mydb</url>
                    <user>root</user>
                    <password>root</password>
                </configuration>
            </plugin>
        </plugins>
    </build>

问题:

  1. 这是否意味着依赖项(至少是编译和运行时范围的依赖项)也在构建时目标的类路径中?
  2. 这可能是主观的,但如果确实有最佳实践,那显然会对像我这样的初学者有所帮助。那么在“全局”<dependencies>标签中写flyway的依赖是good/common编码风格吗?

驱动程序已捆绑,无需 Java 项目即可使用

为了在命令行和脚本中使用,Flyway 捆绑了多个数据库的 JDBC 驱动程序。

完成此捆绑后,非Java 开发人员和系统管理员可以按原样使用该工具,而无需建立 Java 环境。

请参阅支持的数据库 的文档。每个数据库产品的每个页面都提到是否包含驱动程序。

Flyway 可能没有捆绑最新的 JDBC 驱动程序。但这并不重要,因为 Flyway 使用的 JDBC API 非常少。 All Flyway 只是执行您的 SQL 脚本,并记录这些执行。这项工作涉及对 JDBC 更基​​本功能的调用很少,不太可能受到次要驱动程序更新的影响。

带上您自己的驱动程序,以便在 Java 项目中使用

如果在 Java 项目中使用 Flyway,那么您应该已经为您的特定数据库安装了您选择的 JDBC 驱动程序。

针对各种数据库,来自多个供应商的多种多种驱动程序存在多个版本。 Flyway 无法知道什么适合您的情况。因此,将 JDBC 驱动程序安装到您的 Java 项目中不是 Flyway 的责任。那是你的责任。

请注意,依赖项管理和构建配置工具(如 Maven)具有安装依赖项的功能,仅供 IDE 使用,但不用于部署。在某些情况下,例如使用 Apache Tomcat 等应用程序服务器,您可能需要单独安装 JDBC 驱动程序,而不是捆绑在 JAR/WAR/EAR 文件中。

mvn flyway:migrate为例

source mojo has requiresDependencyResolution = ResolutionScope.TEST configured in its annotation, which according to maven's doc 将允许访问 <dependencies> 中定义的几乎所有依赖项。

然后在AbstractFlywayMojo.java(这是MigrateMojo.java的超级class),编译和运行class路径元素是addedclassloader.它稍后由 org.flywaydb.core.internal.scanner.Scanner 处理以加载必要的 class.