有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Why flyway的数据库驱动程序依赖项没有在maven的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>

spotbug“core”的版本在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. 这可能是主观的,但如果真的有一个最佳实践,它显然会帮助像我这样的初学者。那么,在“global”<dependencies>标记中编写flyway的依赖项是一种好的/通用的编码风格吗

共 (2) 个答案

  1. # 1 楼答案

    mvn flyway:migrate为例

    source mojo在其注释中配置了requiresDependencyResolution = ResolutionScope.TEST,根据maven's doc,该注释将允许访问<dependencies>中定义的几乎所有依赖项

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

  2. # 2 楼答案

    驱动程序是捆绑的,可以在没有Java项目的情况下使用

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

    这种捆绑是为了让非Java开发人员和系统管理员可以按原样使用该工具,而无需建立Java环境

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

    Flyway可能没有捆绑最新的JDBC驱动程序。但这几乎无关紧要,因为Flyway很少使用JDBCAPI。All Flyway只执行SQL脚本,并记录这些执行。这项工作涉及很少调用JDBC更基本的功能,不太可能受到驱动程序更新的影响

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

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

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

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