如何解决Scala中zio.Runtime.default.unsafeRun无法调用的问题?
问题解决步骤
1. 清理并修复依赖
你的依赖存在版本冲突和重复引入问题,这会导致API不兼容:
- 统一ZIO核心版本为
2.0.4,移除重复的zio依赖项 - 移除
zhttp依赖(它是旧版ZIO HTTP,与当前zio-http冲突) - 对齐
zio-json版本为你定义的0.3.0,而非RC测试版
修复后的build.sbt依赖部分:
scalaVersion := "3.2.1" organization := "dev.zio" name := "zio-quickstart-restful-webservice" val zioV = "2.0.4" val zioNioV = "2.0.0" val zioHttpV = "0.0.3" val zioJsonV = "0.3.0" libraryDependencies ++= Seq( "dev.zio" %% "zio-http" % zioHttpV, "dev.zio" %% "zio" % zioV, "dev.zio" %% "zio-streams" % zioV, "dev.zio" %% "zio-nio" % zioNioV exclude("org.scala-lang.modules", "scala-collection-compat_2.13"), "dev.zio" %% "zio-json" % zioJsonV, "io.getquill" %% "quill-zio" % "4.3.0", "io.getquill" %% "quill-jdbc-zio" % "4.3.0", "com.h2database" % "h2" % "2.1.214", "org.slf4j" % "slf4j-simple" % "2.0.5" % Test, "com.softwaremill.sttp.client3" %% "http4s-backend" % "3.8.3", "io.7mind.izumi" %% "distage-core" % "1.1.0-M10" )
2. 正确使用unsafeRun(ZIO 2.x规范)
ZIO 2.x将所有unsafe操作封装在Unsafe作用域内,必须显式声明才能调用unsafeRun:
必要导入
移除冗余重复的导入,保留核心依赖:
import zio._ import zio.Unsafe import zio.http._ import zio.http.model.Method import zio.json._ import scala.language.postfixOps
调用方式
用Unsafe.unsafe块包裹unsafeRun调用,获取纯净值:
// 假设someStuff()返回ZIO[R, E, A] val pureValue: A = Unsafe.unsafe { implicit unsafe => Runtime.default.unsafeRun(someStuff()) }
如果想直接抛出失败时的异常,可使用unsafeRunOrThrow简化:
val pureValue: A = Unsafe.unsafe { implicit unsafe => Runtime.default.unsafeRunOrThrow(someStuff()) }
注意事项
unsafeRun会阻塞当前线程,仅在非ZIO应用上下文(如测试、非ZIOAppDefault的main方法)中使用- 若基于
ZIOAppDefault编写应用,推荐通过run方法返回ZIO,而非直接调用unsafe操作
内容的提问来源于stack exchange,提问作者BlackFriday
相关产品推荐
相关产品推荐

