我在許多支持的應用程序中實施了Flyway,並且它像夢一樣工作。Flyway未在jar文件中找到遷移
但是,只要我將應用程序部署到測試環境,遷移就停止工作。
經過一番調查後,我發現當它們被加載到一個jar文件中時,它們沒有被Flyway找到,但是當它們沒有被壓縮時(比如我在Eclipse中工作時,或者如果我將jar提取到類路徑)它按預期工作。
由於我沒有在使用「默認」設置的位置,因此我設置遷飛對象像這樣的應用程序的插件架構:
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發佈試用過(與負面結果相同),我發現here和here報告了類似的問題。
編輯:附加信息
操作系統:Windows XP
JDK:1.7.0_04
DB:SQL Server 2005中
通過一個bat文件在命令窗口直線行駛。
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文件時甚至沒有被掃描。
我仍在四處尋找,並會相應更新。
編輯:源代碼查詢: 我不是過於熟悉飛行用的源代碼,我一直關注着在它只有幾個小時......
這是什麼一段代碼在應該這樣做的SqlMigrationResolver類的resolveMigrations方法?如果我將它從代碼中移除,那麼SQLmigrations將從Jar文件中完美加載,如果不是,則它們不會加載並且會記錄警告。
if (StringUtils.hasText(normalizedBaseDir)) && !new ClassPathResource(normalizedBaseDir + "/").exists()) {
LOG.warn("Unable to find path for sql migrations: " + location);
return migrations;
}
你可以發佈調試日誌輸出,並提供一些關於你的配置(操作系統,JDK,AppServer)的更多細節?謝謝。 –
感謝您發佈的詳細信息。我已經看了一些東西,困惑我:爲什麼是「無法找到SQL遷移的路徑」消息報告\的位置,你的配置有/。這是從同一個運行?此外,至少1.6.1,因爲它修復了一些重要的錯誤。你能否提出一個問題,以便我們能夠了解這一點? –