語境Occasionaly接受的,而不是造成PathClassLoader遷徙路線WarningContextClassLoader崩潰
在我的Android應用程序,我用遷徙路線更新我的DB模式。到目前爲止,我只有一次遷移,即創建了3個表。飛行的簡單和平常的業務。它工作得很好......大部分時間!有時這種錯誤(全棧下文)崩潰:
java.lang.ClassCastException: android.app.LoadedApk$WarningContextClassLoader
cannot be cast to dalvik.system.PathClassLoader
我有相關的錯誤幾個問題:
- 什麼是LoadedApk.WarningContextClassLoader?
- 爲什麼它有時用來代替dalvik.system.PathClassLoader?
- 這是我的應用程序,Android系統或Flyway中的錯誤?
我也注意到,我可以明確地注入內飛行用的類加載器(Flyway.setClassLoader())
- 我怎樣才能得到確保正確的類加載器?
請注意,我在Flyway注入應用程序上下文,而不是特定活動的上下文。
版本
我使用org.flywaydb:飛路核:4.0.2
我Android中4.2.2(傑利貝恩,API級17)和4.4(奇巧,API注意到了這個問題19級)。 AFAIK,它從來沒有出現在更高的版本。
堆棧跟蹤
Exception java.lang.RuntimeException: Unable to start activity ComponentInfo{com.mycompany.myapp.free.debug/com.mycompany.MainActivity}: java.lang.ClassCastException: android.app.LoadedApk$WarningContextClassLoader cannot be cast to dalvik.system.PathClassLoader
android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2306)
android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:2358)
android.app.ActivityThread.access$600 (ActivityThread.java:156)
android.app.ActivityThread$H.handleMessage (ActivityThread.java:1340)
android.os.Handler.dispatchMessage (Handler.java:99)
android.os.Looper.loop (Looper.java:153)
android.app.ActivityThread.main (ActivityThread.java:5299)
java.lang.reflect.Method.invokeNative (Method.java)
java.lang.reflect.Method.invoke (Method.java:511)
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run (ZygoteInit.java:833)
com.android.internal.os.ZygoteInit.main (ZygoteInit.java:600)
dalvik.system.NativeStart.main (NativeStart.java)
Caused by java.lang.ClassCastException: android.app.LoadedApk$WarningContextClassLoader cannot be cast to dalvik.system.PathClassLoader
org.flywaydb.core.internal.util.scanner.classpath.android.AndroidScanner.<init> (AndroidScanner.java:46)
org.flywaydb.core.internal.util.scanner.Scanner.<init> (Scanner.java:38)
org.flywaydb.core.Flyway.execute (Flyway.java:1353)
org.flywaydb.core.Flyway.info (Flyway.java:1040)
com.mycompany.db.FlywayHelper.info (FlywayHelper.java:54)
com.mycompany.db.FlywayHelper.migrate (FlywayHelper.java:45)
com.mycompany.db.GW2DatabaseHelper.migrate (GW2DatabaseHelper.java:56)
com.mycompany.db.DbInit.initKeyGuild (DbInit.java:62)
com.mycompany.db.DbInit.init (DbInit.java:42)
com.mycompany.business.BootApp.boot (BootApp.java:79)
com.mycompany.MainActivity.onCreate (MainActivity.java:51)
android.app.Activity.performCreate (Activity.java:5122)
android.app.Instrumentation.callActivityOnCreate (Instrumentation.java:1081)
android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2270)
android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:2358)
android.app.ActivityThread.access$600 (ActivityThread.java:156)
android.app.ActivityThread$H.handleMessage (ActivityThread.java:1340)
android.os.Handler.dispatchMessage (Handler.java:99)
android.os.Looper.loop (Looper.java:153)
android.app.ActivityThread.main (ActivityThread.java:5299)
java.lang.reflect.Method.invokeNative (Method.java)
java.lang.reflect.Method.invoke (Method.java:511)
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run (ZygoteInit.java:833)
com.android.internal.os.ZygoteInit.main (ZygoteInit.java:600)
dalvik.system.NativeStart.main (NativeStart.java)
研究更新
雖然其目的不明確給我,LoadedApk.WarningContextClassLoader似乎是一個有效的類加載器,然後應該由遷飛支持。 A pull request已提交。
在這兩者之間,一個解決方法需要實現,注入預期的類裝載器:
private void injectClassLoader(Flyway flyway) {
ClassLoader classLoader = flyway.getClassLoader();
if (classLoader != null && !(classLoader instanceof PathClassLoader)){
flyway.setClassLoader(classLoader.getParent());
}
}
不,不。我查過了(flyway是開源的),上下文並不是用來抓取類加載器的。其實flyway只是像這樣初始化它的類加載器:'private ClassLoader classLoader = Thread.currentThread()。getContextClassLoader();'但是感謝分享! – Benoit