尝试运行基于Java(已编译)的迁移文件,这些文件不在配置Flyway的项目中。任何人都可以告诉我是否可以这样做?
我创建了jar use flyway进行迁移。 Jar期望一个参数是迁移脚本的位置。迁移脚本使用不同的location/project。到目前为止,所有脚本都基于SQL。 (即XXX.sql
)。需要向其添加基于java的迁移脚本,以执行一些复杂的逻辑。
尝试将pom.xml添加到脚本位置,并在db / migration文件夹中添加sample java migration script。 Flyway忽略了基于Java的迁移文件。是由于校验和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:/
答案 0 :(得分:0)
要成为discovered,Java迁移应位于src/main/java
下,包含db.migration
e.g。
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表明目录&#34;可能只包含sql迁移&#34 ;,任何Java迁移都将被忽略。
鉴于flyway-database-migration.jar
指向filesystem:
位置,只会发现sql迁移,而不是java迁移。需要将database-migration-scripts
目录添加到类路径,并将flyway位置设置为classpath:db/migration
。
java -cp C:\database-migration-scripts;<existing classpath> ...
由于使用Spring Boot Executable Jar格式打包flyway-database-migrations.jar
的方式,所有应用程序依赖项都放在可执行jar内的BOOT-INF/lib
目录中并由单独加载来自org.springframework.boot.loader.JarLauncher
主类的classloader。因此,与上述相反,我不确定是否可以使用-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/
的{{1}}下创建了一个目录,其结构如下(database-migration-scripts.jar
非常重要Flyway will only add files or directories with this suffix to the classpath):
.jar
最后,我将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
并且能够验证是否已成功应用sql和java迁移:
./flyway migrate
唷!在我看来,这比使用应用程序打包迁移要困难得多。
这种方法的另一个缺点是,如果有人添加了一个带有附加依赖项的新java迁移(例如commons-lang3或其他任何东西),那么依赖项也需要添加到./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 |
+-----------+---------+-------------------+-------------+---------------------+---------+
目录中
希望这有帮助!