You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 19:15:23