为啥maven的pom.xml中插件本身没有声明flyway的数据库驱动依赖?

Posted

技术标签:

【中文标题】为啥maven的pom.xml中插件本身没有声明flyway的数据库驱动依赖?【英文标题】:Why flyway's database driver dependency is not declared within the plugin itself in maven's pom.xml?为什么maven的pom.xml中插件本身没有声明flyway的数据库驱动依赖? 【发布时间】:2021-07-12 21:04:09 【问题描述】:

大多数依赖于其他包的插件倾向于在插件配置中声明依赖。例如,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“core”的版本在plugin &gt; dependencies &gt; dependency中指定。

但是,flyway 似乎无法以这种方式工作。例如,数据库驱动程序位于&lt;dependencies&gt; 中的以下配置运行良好。

    <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>

问题:

    这是否意味着依赖项(至少是编译和运行时范围的)也在构建时目标的类路径中? 这可能是主观的,但如果确实有最佳实践,它显然会帮助像我这样的初学者。那么在“全局”&lt;dependencies&gt; 标记中编写 flyway 的依赖项是好的/常见的编码风格吗?

【问题讨论】:

【参考方案1】:

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

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

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

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

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

自带驱动程序,在 Java 项目中使用

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

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

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

【讨论】:

flyway commandline 似乎捆绑了很多驱动程序,导致压缩包更大。但是flyway-maven-plugin 和flyway-core 实际上很小。 flyway-parent 的 pom.xml 列出了 &lt;dependencyManagement&gt; 中的一些依赖版本,但这是否足够? @wlnirvana 我添加了一条关于在 Java 项目中安装您自己选择的驱动程序的说明。 感谢您的更新。 “已经安装了驱动程序”是否意味着依赖项也可用于 Maven 构建目标?我不是从 IDE 运行迁移,而是直接从命令行运行【参考方案2】:

mvn flyway:migrate为例。

source mojo 在其注解中配置了requiresDependencyResolution = ResolutionScope.TEST,根据maven's doc,它将允许访问&lt;dependencies&gt; 中定义的几乎所有依赖项。

然后在AbstractFlywayMojo.java(这是MigrateMojo.java的超类)中,编译和运行时类路径元素是added到classloader。稍后由org.flywaydb.core.internal.scanner.Scanner 处理以加载必要的类。

【讨论】:

以上是关于为啥maven的pom.xml中插件本身没有声明flyway的数据库驱动依赖?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Maven 命令“mvn sonar:sonar”在我的“pom.xml”中没有任何插件配置就可以工作?

eclipse 中创建maven 项目pom.xml配置好了不自动下载jar包是为啥

为啥 Maven 使用提供的构建插件的 pom.xml?

为啥eclipse能显示effective pom

maven,pom.xml里配置了插件,是怎么使用的

为啥 Intellij 在 pom.xml 中找不到任何 Maven 依赖项?