为什么 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>
问题:
- 这是否意味着依赖项(至少是编译和运行时范围的依赖项)也在构建时目标的类路径中?
- 这可能是主观的,但如果确实有最佳实践,那显然会对像我这样的初学者有所帮助。那么在“全局”
<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路径元素是added到classloader
.它稍后由 org.flywaydb.core.internal.scanner.Scanner
处理以加载必要的 class.
大多数依赖其他包的插件倾向于在插件配置中声明依赖。例如,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>
问题:
- 这是否意味着依赖项(至少是编译和运行时范围的依赖项)也在构建时目标的类路径中?
- 这可能是主观的,但如果确实有最佳实践,那显然会对像我这样的初学者有所帮助。那么在“全局”
<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路径元素是added到classloader
.它稍后由 org.flywaydb.core.internal.scanner.Scanner
处理以加载必要的 class.