首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >flyway-在远程位置运行基于SQL和Java的脚本

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

Stack Overflow用户
提问于 2018-06-01 12:18:14
回答 1查看 1.6K关注 0票数 3

正在尝试运行基于Java(已编译)的迁移文件,这些文件不在配置了Flyway的项目中。谁能告诉我有没有可能做到这一点?

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

已尝试将迁移添加到脚本位置和db/ 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

EN

回答 1

Stack Overflow用户

发布于 2018-06-03 05:37:28

为了成为discovered,Java迁移应该放在包含db.migration包的src/main/java

例如:

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

同样值得注意的是,如果您已经使用filesystem:路径覆盖了locations设置,则documentation会声明该目录“可能只包含sql迁移”,任何java迁移都将被忽略。

更新2018-06-03

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

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

更新2018-06-09

由于flyway-database-migrations.jar使用Spring Boot Executable Jar格式打包的方式,所有应用程序依赖项都放在可执行jar内的BOOT-INF/lib目录中,并由独立于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的目录,其结构如下( .jar作为Flyway 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

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

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

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

这种方法的另一个缺点是,如果有人添加了带有额外依赖项(例如commons-lang3等)的新java迁移,则该依赖项也需要添加到<RUNNER_DIR>/lib目录中。

希望这能有所帮助!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50636034

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档