1

サポートしている多くのアプリケーションに Flyway を実装しましたが、夢のように機能しました。

ただし、アプリケーションをテスト環境にデプロイするとすぐに、移行が機能しなくなりました。

調査の結果、移行がjarファイルにロードされたときにFlywayによって配置されていないことがわかりましたが、圧縮されていない場合(Eclipseで作業している場合や、jarをクラスパスに抽出した場合など)は機能します予想通り。

アプリケーションのプラグイン アーキテクチャのため、「デフォルト」設定を使用する立場にないため、Flyway オブジェクトを次のように設定しています。

Flyway flyway = new Flyway();
flyway.setDataSource(dataSource);
flyway.setBaseDir("za/co/company/application/plugin1/db/migration");
flyway.setTable(tableName);
flyway.setBasePackage("za.co.company.application.plugin1.db.migration");
flyway.init();
flyway.migrate();

jar ファイルを解凍すると、SQL ファイルは za/co/company/application/db/migration に配置されます。

前述のように、移行が機能することはわかっていますが、jar ファイルにあるときだけではありません。上記のコードは完全に実行されます。移行の一部として実行される sql ファイルが見つからないだけです。

もともと flyway-core-1.6 を使用して開発されましたが、1.6.1 と 1.7_SNAPSHOT リリースで (同じ否定的な結果で) 試しましたが、ここここで同様の問題が報告されました。

編集:追加情報

OS: Windows XP
JDK: 1.7.0_04
DB: SQL Server 2005
バット ファイルを介してコマンド ウィンドウから直接実行。

2012-06-27 15:50:05.855 main: flyway.migrate()
2012-06-27 15:50:05.886 Database: Microsoft SQL Server
2012-06-27 15:50:05.902 Schema: dbo
2012-06-27 15:50:05.902 Unable to find path for sql migrations: za\co\company\application\plugin1\db\migration
2012-06-27 15:50:05.918 Scanning URL: jar:file:/C:/Temp/lib/plugin1.jar!/za/co/company/application/plugin1/db/migration
2012-06-27 15:50:05.918 Filtering out resource: za/co/company/application/plugin1/db/migration/ (filename: )
2012-06-27 15:50:05.918 Filtering out resource: za/co/company/application/plugin1/db/migration/V1_1__Allows_cancelations.sql (filename: V1_1__Allows_cancelations.sql)
2012-06-27 15:50:05.918 Filtering out resource: za/co/company/application/plugin1/db/migration/V1__Base_version.sql (filename: V1__Base_version.sql)
2012-06-27 15:50:05.933 main: done Migrate.

デフォルトのプレフィックス (V) とサフィックス (.sql) を使用していることを確認しました。また、ログで除外されていると記載されている移行ファイルの名前は、実際に実行したい移行です。

編集:さらに詳しい情報。 ソース リポジトリのクローンを作成し、リソースが除外されたとしてログに記録される直前にスタック トレースを取得しました。

at com.googlecode.flyway.core.util.scanner.ClassPathScanner.filterResourceNames(ClassPathScanner.java:203)
at com.googlecode.flyway.core.util.scanner.ClassPathScanner.findResourceNames(ClassPathScanner.java:136)
at com.googlecode.flyway.core.util.scanner.ClassPathScanner.scanForClasses(ClassPathScanner.java:67)
at com.googlecode.flyway.core.migration.jdbc.JdbcMigrationResolver.resolveMigrations(JdbcMigrationResolver.java:51)
at com.googlecode.flyway.core.migration.CompositeMigrationResolver.collectMigrations(CompositeMigrationResolver.java:175)
at com.googlecode.flyway.core.migration.CompositeMigrationResolver.doFindAvailableMigrations(CompositeMigrationResolver.java:156)
at com.googlecode.flyway.core.migration.CompositeMigrationResolver.resolveMigrations(CompositeMigrationResolver.java:119)
at com.googlecode.flyway.core.Flyway$1.execute(Flyway.java:565)
at com.googlecode.flyway.core.Flyway$1.execute(Flyway.java:1)
at com.googlecode.flyway.core.Flyway.execute(Flyway.java:850)
at com.googlecode.flyway.core.Flyway.migrate(Flyway.java:561)

移行が除外されるのは、jar ファイルで移行が見つかったときだけであることを確認しました。.sql 移行が jar ファイル内にある場合はスキャンさえされないかのようです。

私はまだ探し回っていて、それに応じて更新します。

編集: ソース コード クエリ: 私は Flyway のソース コードにあまり慣れていませんが、数時間しか調べていません...

SqlMigrationResolver クラスの resolveMigrations メソッドにあるこのコードは何をするものですか? コードからそれを削除すると、SQLmigrations は Jar ファイルから完全にロードされますが、そうでない場合はロードされず、警告がログに記録されます。

    if (StringUtils.hasText(normalizedBaseDir)) && !new ClassPathResource(normalizedBaseDir + "/").exists() ) {
        LOG.warn("Unable to find path for sql migrations: " + location);
        return migrations;
    }
4

1 に答える 1

3

新しくリリースされた 1.7 を試してください。問題のある発言は削除されました。

于 2012-07-18T20:51:06.090 に答える