在Dispatchers.IO上启动Kotlin协程时出错

问题描述

我正在尝试使用runIde任务运行一个简单的Intellij Idea插件,但无法启动此协程:

GlobalScope.launch(dispatchers.IO) {}

如果使用dispatchers.Swing可以正常工作,但是如果使用IO,Main和Default调度程序,则会抛出错误。 如果将代码作为独立的Java应用程序运行,我也不会收到错误消息。

我正在使用kotlin 1.4.0和这些依赖项:

implementation(kotlin("stdlib"))
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.9")
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-jdk8:1.3.9")
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-swing:1.3.9")

错误

java.lang.ExceptionInInitializerError
at kotlin.random.Random.<clinit>(Random.kt:242)
at kotlinx.coroutines.scheduling.Coroutinescheduler$Worker.<init>(Coroutinescheduler.kt:638)
at kotlinx.coroutines.scheduling.Coroutinescheduler$Worker.<init>(Coroutinescheduler.kt:593)
at kotlinx.coroutines.scheduling.Coroutinescheduler.createNewWorker(Coroutinescheduler.kt:482)
at kotlinx.coroutines.scheduling.Coroutinescheduler.tryCreateWorker(Coroutinescheduler.kt:440)
at kotlinx.coroutines.scheduling.Coroutinescheduler.signalBlockingWork(Coroutinescheduler.kt:421)
at kotlinx.coroutines.scheduling.Coroutinescheduler.dispatch(Coroutinescheduler.kt:402)
at kotlinx.coroutines.scheduling.ExperimentalCoroutinedispatcher.dispatchWithContext$kotlinx_coroutines_core(dispatcher.kt:111)
at kotlinx.coroutines.scheduling.Limitingdispatcher.dispatch(dispatcher.kt:164)
at kotlinx.coroutines.scheduling.Limitingdispatcher.dispatch(dispatcher.kt:154)
at kotlinx.coroutines.dispatchedContinuationKt.resumeCancellableWith(dispatchedContinuation.kt:288)
at kotlinx.coroutines.intrinsics.CancellableKt.startCoroutineCancellable(Cancellable.kt:26)
at kotlinx.coroutines.Coroutinestart.invoke(Coroutinestart.kt:109)
at kotlinx.coroutines.AbstractCoroutine.start(AbstractCoroutine.kt:158)
at kotlinx.coroutines.BuildersKt__Builders_commonKt.launch(Builders.common.kt:56)
at kotlinx.coroutines.BuildersKt.launch(UnkNown Source)
at kotlinx.coroutines.BuildersKt__Builders_commonKt.launch$default(Builders.common.kt:49)
at kotlinx.coroutines.BuildersKt.launch$default(UnkNown Source)
at MyToolWindowFactory.createtoolWindowContent(MyToolWindowFactory.kt:28)
at com.intellij.openapi.wm.impl.ToolWindowImpl.ensureContentinitialized(ToolWindowImpl.java:534)
at com.intellij.openapi.wm.impl.ToolWindowManagerImpl.lambda$initToolWindow$10(ToolWindowManagerImpl.java:511)
at com.intellij.openapi.wm.impl.ToolWindowManagerImpl.initToolWindow(ToolWindowManagerImpl.java:514)
at com.intellij.openapi.wm.impl.ToolWindowManagerImpl$6.run(ToolWindowManagerImpl.java:465)
at com.intellij.openapi.wm.impl.CommandProcessor.runNext(CommandProcessor.java:78)
at com.intellij.openapi.wm.impl.CommandProcessor.run(CommandProcessor.java:59)
at com.intellij.openapi.wm.impl.commands.FinalizableCommand.finish(FinalizableCommand.java:36)
at com.intellij.openapi.wm.impl.ToolWindowsPane$AddToolStripeButtonCmd.run(ToolWindowsPane.java:990)
at com.intellij.openapi.wm.impl.CommandProcessor.runNext(CommandProcessor.java:78)
at com.intellij.openapi.wm.impl.CommandProcessor.run(CommandProcessor.java:59)
at com.intellij.openapi.wm.impl.CommandProcessor.flush(CommandProcessor.java:32)
at com.intellij.openapi.wm.impl.ToolWindowManagerImpl.flushCommands(ToolWindowManagerImpl.java:597)
at com.intellij.openapi.wm.impl.ToolWindowManagerImpl.access$3100(ToolWindowManagerImpl.java:74)
at com.intellij.openapi.wm.impl.ToolWindowManagerImpl$InitToolWindowsActivity.lambda$runActivity$0(ToolWindowManagerImpl.java:2367)
at java.desktop/java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:313)
at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:776)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:727)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:721)
at java.base/java.security.AccessController.doPrivileged(Native Method)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:746)
at com.intellij.ide.IdeEventQueue.defaultdispatchEvent(IdeEventQueue.java:906)
at com.intellij.ide.IdeEventQueue._dispatchEvent(IdeEventQueue.java:779)
at com.intellij.ide.IdeEventQueue.lambda$dispatchEvent$8(IdeEventQueue.java:422)
at com.intellij.openapi.progress.impl.CoreProgressManager.computePrioritized(CoreProgressManager.java:687)
at com.intellij.ide.IdeEventQueue.dispatchEvent(IdeEventQueue.java:421)
at com.intellij.ide.IdeEventQueue.pumpEventsForHierarchy(IdeEventQueue.java:963)
at com.intellij.openapi.progress.util.ProgressWindow.startBlocking(ProgressWindow.java:193)
at com.intellij.openapi.progress.util.ProgressWindow.startBlocking(ProgressWindow.java:179)
at com.intellij.openapi.application.impl.ApplicationImpl.runProcessWithProgressSynchronously(ApplicationImpl.java:455)
at com.intellij.openapi.progress.impl.CoreProgressManager.runProcessWithProgressSynchronously(CoreProgressManager.java:453)
at com.intellij.openapi.progress.impl.ProgressManagerImpl.runProcessWithProgressSynchronously(ProgressManagerImpl.java:82)
at com.intellij.openapi.progress.impl.CoreProgressManager.runProcessWithProgressSynchronously(CoreProgressManager.java:250)
at com.intellij.platform.ProjectUiFrameAllocator$run$1.run(ProjectFrameAllocator.kt:64)
at com.intellij.openapi.application.TransactionGuardImpl.runSyncTransaction(TransactionGuardImpl.java:83)
at com.intellij.openapi.application.TransactionGuardImpl.submitTransactionAndWait(TransactionGuardImpl.java:149)
at com.intellij.platform.ProjectUiFrameAllocator.run(ProjectFrameAllocator.kt:62)
at com.intellij.platform.PlatformProjectOpenProcessor.openExistingProject(PlatformProjectOpenProcessor.java:234)
at com.intellij.ide.RecentProjectsManagerBase.openProject(RecentProjectsManagerBase.kt:379)
at com.intellij.ide.RecentProjectsManagerBase.reopenLastProjectsOnStart(RecentProjectsManagerBase.kt:467)
at com.intellij.idea.IdeStarter$main$4.run(ApplicationLoader.kt:533)
at com.intellij.openapi.application.TransactionGuardImpl.runSyncTransaction(TransactionGuardImpl.java:83)
at com.intellij.openapi.application.TransactionGuardImpl.lambda$submitTransaction$1(TransactionGuardImpl.java:107)
at com.intellij.openapi.application.TransactionGuardImpl.submitTransaction(TransactionGuardImpl.java:116)
at com.intellij.openapi.application.TransactionGuard.submitTransaction(TransactionGuard.java:121)
at com.intellij.idea.IdeStarter.main(ApplicationLoader.kt:523)
at com.intellij.idea.ApplicationLoader$startApp$8$1.run(ApplicationLoader.kt:242)
at com.intellij.openapi.application.TransactionGuardImpl.performUserActivity(TransactionGuardImpl.java:193)
at com.intellij.idea.ApplicationLoader$startApp$8.run(ApplicationLoader.kt:241)
at java.base/java.util.concurrent.CompletableFuture$UniRun.tryFire(CompletableFuture.java:783)
at java.base/java.util.concurrent.CompletableFuture$Completion.run(CompletableFuture.java:478)
at java.desktop/java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:313)
at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:776)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:727)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:721)
at java.base/java.security.AccessController.doPrivileged(Native Method)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:746)
at com.intellij.ide.IdeEventQueue.defaultdispatchEvent(IdeEventQueue.java:906)
at com.intellij.ide.IdeEventQueue._dispatchEvent(IdeEventQueue.java:779)
at com.intellij.ide.IdeEventQueue.lambda$dispatchEvent$8(IdeEventQueue.java:422)
at com.intellij.openapi.progress.impl.CoreProgressManager.computePrioritized(CoreProgressManager.java:698)
at com.intellij.ide.IdeEventQueue.dispatchEvent(IdeEventQueue.java:421)
at java.desktop/java.awt.EventdispatchThread.pumpOneEventForFilters(EventdispatchThread.java:203)
at java.desktop/java.awt.EventdispatchThread.pumpEventsForFilter(EventdispatchThread.java:124)
at java.desktop/java.awt.EventdispatchThread.pumpEventsForHierarchy(EventdispatchThread.java:113)
at java.desktop/java.awt.EventdispatchThread.pumpEvents(EventdispatchThread.java:109)
at java.desktop/java.awt.EventdispatchThread.pumpEvents(EventdispatchThread.java:101)
at java.desktop/java.awt.EventdispatchThread.run(EventdispatchThread.java:90)
Caused by: java.lang.classCastException: Instance classloader: com.intellij.util.lang.urlclassloader@cb5822,base type classloader: PluginClassLoader[app_name,0.0.1] com.intellij.ide.plugins.cl.PluginClassLoader@3e71da83
at kotlin.internal.PlatformImplementationsKt.<clinit>(PlatformImplementations.kt:54)
... 88 more
Caused by: java.lang.classCastException: class kotlin.internal.jdk8.JDK8PlatformImplementations cannot be cast to class kotlin.internal.PlatformImplementations (kotlin.internal.jdk8.JDK8PlatformImplementations is in unnamed module of loader com.intellij.util.lang.urlclassloader @cb5822; kotlin.internal.PlatformImplementations is in unnamed module of loader com.intellij.ide.plugins.cl.PluginClassLoader @3e71da83)
... 89 more

任何想法或建议都非常受欢迎。

解决方法

由于您将implementation(kotlin("stdlib"))implementation("org.jetbrains.kotlinx:kotlinx-coroutines-jdk8:1.3.9")的依赖项混合使用而导致该错误,这可能会导致kotlin-stdlib中缺少某些类。 通过使用兼容的依赖项,可以轻松解决此问题:

implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.4.0")
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-jdk8:1.3.9")

这是一篇很好的文章,解释了不同版本的stdlib之间的区别:https://medium.com/@mbonnin/the-different-kotlin-stdlibs-explained-83d7c6bf293

这个问题也可能会帮助您Which standard library to use in Kotlin