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>
问题:
- 这是否意味着依赖项(至少编译和运行时范围的依赖项)也在构建时目标的类路径中李>
- 这可能是主观的,但如果真的有一个最佳实践,它显然会帮助像我这样的初学者。那么,在“global”
<dependencies>
标记中编写flyway的依赖项是一种好的/通用的编码风格吗李>
# 1 楼答案
以
mvn flyway:migrate
为例source mojo在其注释中配置了
requiresDependencyResolution = ResolutionScope.TEST
,根据maven's doc,该注释将允许访问<dependencies>
中定义的几乎所有依赖项然后在
AbstractFlywayMojo.java
(这是MigrateMojo.java
的超类)中,编译和运行时类路径元素是added到classloader
。它随后由org.flywaydb.core.internal.scanner.Scanner
处理以加载必要的类# 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文件中