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



大多数依赖其他包的插件倾向于在插件配置中声明依赖项。例如,spottbugs的文档执行

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

斑点虫的版本";核心";在CCD_ 1中指定。

然而,天桥似乎不是这样运作的。例如,以下数据库驱动程序位于<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>标签

驱动程序是捆绑的,用于不带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文件中。

mvn flyway:migrate为例。

源mojo在其注释中配置了requiresDependencyResolution = ResolutionScope.TEST,根据maven的文档,这将允许访问<dependencies>中定义的几乎所有依赖项。

然后在AbstractFlywayMojo.java(它是MigrateMojo.java的一个超类(中,将编译和运行时类路径元素添加到classloader中。它稍后由plugin > dependencies > dependency0处理以加载必要的类。

相关内容

最新更新