2012-06-27 36 views
1

我在許多支持的應用程序中實施了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發佈試用過(與負面結果相同),我發現herehere報告了類似的問題。

編輯:附加信息

操作系統: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; 
    } 
+0

你可以發佈調試日誌輸出,並提供一些關於你的配置(操作系統,JDK,AppServer)的更多細節?謝謝。 –

+0

感謝您發佈的詳細信息。我已經看了一些東西,困惑我:爲什麼是「無法找到SQL遷移的路徑」消息報告\的位置,你的配置有/。這是從同一個運行?此外,至少1.6.1,因爲它修復了一些重要的錯誤。你能否提出一個問題,以便我們能夠了解這一點? –

回答

3

嘗試新發布的1.7。違規聲明已被刪除。