gpt4 book ai didi

java - flyway-在远程位置同时运行基于 SQL 和 Java 的脚本

转载 作者:行者123 更新时间:2023-12-05 06:33:40 31 4
gpt4 key购买 nike

尝试运行基于 Java(已编译)的迁移文件,这些文件不在配置 Flyway 的项目中。谁能告诉我是否可以这样做?

我创建了一个 jar哪个use flyway做迁移。 Jar 需要一个参数,它是迁移脚本的位置。迁移脚本在不同的 location/project 中.到目前为止,所有脚本都是基于 SQL 的。 (即 XXX.sql)。需要给它添加一个基于java的迁移脚本,来做一些复杂的逻辑。

试图将 pom.xml 添加到脚本位置和 sample java migration script在数据库/迁移文件夹中。基于 Java 的迁移文件被 Flyway 忽略。是因为校验和 validation fail

基于 Java 的迁移已编译,.class 文件位于类路径中。我的文件夹结构如下。

C:/
└── database-migration-scripts
└── src/main/java/
└── db
└── migration
└── V1__m1.sql
└── V2__m2.sql
└── V3__SampleJava_script.java
└── target/classes/
└── db
└── migration
└── V3__SampleJava_script.class
└── pom.xml

W:/
└── someLocationOutsideProject
└── flyway-database-migration.jar

注意:flyway runner (jar) 和脚本将位于相同或不同机器中的不同位置。在上面的例子中,C:/ 中的迁移脚本和 W:/

中的 jar

最佳答案

为了得到discovered , Java 迁移应该在 src/main/java 下进行随包 db.migration

java migration location

例如

package db.migration; // <-- classpath:db/migration

import org.flywaydb.core.api.migration.jdbc.JdbcMigration;
import java.sql.Connection;

public class V3__SampleJava_script implements JdbcMigration {
public void migrate(Connection connection) throws Exception {
// your code...
}
}

如果没有看到您的 pom.xml 和您的 jar 是如何打包的,则很难进行诊断,但考虑到上面目标目录的文件夹结构,可能是 V3__SampleJava_script.class添加到 classpath:resources/db/migration 下的 jar 中或者根本不包括在内。

要检查,请尝试解压缩 jar 文件:

jar -xf flyway-database-migration.jar

或者只是列出内容:

jar -tf flyway-database-migration.jar

还值得注意的是,如果您覆盖了 locations设置 filesystem:路径,documentation指出目录“可能只包含 sql 迁移”,任何 java 迁移都将被忽略。


2018-06-03更新

鉴于 flyway-database-migration.jar正指向 filesystem:位置,只会发现 sql 迁移,而不是 java 迁移。 database-migration-scripts需要将目录添加到类路径并将飞路位置设置为 classpath:db/migration .

java -cp C:\database-migration-scripts;<existing classpath> ...

2018-06-09更新

因为 flyway-database-migrations.jar 的方式打包,使用 Spring Boot Executable Jar格式,所有应用程序依赖项都放在 BOOT-INF/lib 中可执行 jar 中的目录,并由来自 org.springframework.boot.loader.JarLauncher 的单独类加载器加载主课。因此,与上述相反,我不确定是否可以使用 -cp 将额外的类路径条目传递给应用程序。命令行选项。我认为您需要删除 spring boot 并将其打包为常规 jar 文件。我当然遇到了类可见性问题并决定尝试不同的方法。

我下载了 Flyway Command Line Runner并更新了 <RUNNER_DIR>/conf/flyway.conf设置如下:

flyway.url=jdbc:mariadb://localhost:3306/flyway?createDatabaseIfNotExist=true
flyway.user=root
flyway.password=yourPassword
flyway.locations=classpath:db/migration

我在 <RUNNER_DIR>/jars/ 下创建了一个目录称为 database-migration-scripts.jar具有以下结构(.jarFlyway will only add files or directories with this suffix to the classpath 一样重要):

database-migration-scripts.jar/
└── db
└── migration
├── V1__m1.sql
├── V2__m2.sql
└── V3__SampleJava_script.class

最后,我为 database-migration-scripts 添加了所有运行时依赖项 |项目<RUNNER_DIR>/lib :

lib/
├── animal-sniffer-annotations-1.14.jar
├── checker-compat-qual-2.0.0.jar
├── checker-qual-2.3.0.jar
├── error_prone_annotations-2.1.3.jar
├── flyway-commandline-5.1.1.jar
├── flyway-core-5.1.1.jar
├── guava-23.6-jre.jar
├── j2objc-annotations-1.1.jar
├── jcl-over-slf4j-1.7.25.jar
├── jsr305-1.3.9.jar
├── jul-to-slf4j-1.7.25.jar
├── log4j-over-slf4j-1.7.25.jar
├── logback-classic-1.1.11.jar
├── logback-core-1.1.11.jar
├── slf4j-api-1.7.25.jar
├── snakeyaml-1.17.jar
├── spring-aop-4.3.13.RELEASE.jar
├── spring-beans-4.3.13.RELEASE.jar
├── spring-boot-1.5.9.RELEASE.jar
├── spring-boot-autoconfigure-1.5.9.RELEASE.jar
├── spring-boot-starter-1.5.9.RELEASE.jar
├── spring-boot-starter-jdbc-1.5.9.RELEASE.jar
├── spring-boot-starter-logging-1.5.9.RELEASE.jar
├── spring-context-4.3.13.RELEASE.jar
├── spring-core-4.3.13.RELEASE.jar
├── spring-expression-4.3.13.RELEASE.jar
├── spring-jdbc-4.3.13.RELEASE.jar
├── spring-tx-4.3.13.RELEASE.jar
├── tomcat-jdbc-8.5.23.jar
└── tomcat-juli-8.5.23.jar

之后我能够成功运行:

./flyway migrate

并且能够验证 sql 和 java 迁移是否已成功应用:

./flyway info

+-----------+---------+-------------------+-------------+---------------------+---------+
| Category | Version | Description | Type | Installed On | State |
+-----------+---------+-------------------+-------------+---------------------+---------+
| Versioned | 1 | m1 | SQL | 2018-06-09 07:41:57 | Success |
| Versioned | 2 | m2 | SQL | 2018-06-09 07:41:57 | Success |
| Versioned | 3 | SampleJava script | SPRING_JDBC | 2018-06-09 07:47:56 | Success |
+-----------+---------+-------------------+-------------+---------------------+---------+

呸!在我看来,这比将迁移与应用程序打包要困难得多。

这种方法的另一个缺点是,如果有人添加一个新的 java 迁移和一个额外的依赖项(例如 commons-lang3 或其他任何东西),则需要将依赖项添加到 <RUNNER_DIR>/lib 中。目录也是如此。

希望这对您有所帮助!

关于java - flyway-在远程位置同时运行基于 SQL 和 Java 的脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50636034/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com