【问题标题】:Class java.time.Duration not found - continuing with a stub找不到类 java.time.Duration - 继续使用存根
【发布时间】:2016-06-30 01:01:51
【问题描述】:

给定:

$cat build.sbt 
scalaVersion := "2.11.8"

libraryDependencies ++= List(
  "io.spray"          %% "spray-client"        % "1.3.3"
  ,"io.spray"          %%  "spray-json"         % "1.3.2"
  ,"com.typesafe.akka" %% "akka-actor"          % "2.4.2"
  ,"com.typesafe"      % "config" % "1.3.0"
  ,"org.scalatest" % "scalatest_2.11" % "2.2.6" % "test"
)

使用这个answer,我尝试使用JDK 7。

但是,我收到以下错误:

$sbt -java-home /Library/Java/JavaVirtualMachines/jdk1.7.0_79.jdk/Contents/Home/ clean test
[info] Loading project definition from /Users/Kevin/Workspace/Work/project/project
[info] Set current project to project (in build file:/Users/Kevin/Workspace/Work/project/)
[success] Total time: 0 s, completed Mar 14, 2016 3:51:10 PM
[info] Updating {file:/Users/Kevin/Workspace/Work/project/}project...
[info] Resolving jline#jline;2.12.1 ...
[info] Done updating.
[info] Compiling 9 Scala sources to /Users/Kevin/Workspace/Work/project/target/scala-2.11/classes...
[error] Class java.time.Duration not found - continuing with a stub.
[error] Class java.time.Duration not found - continuing with a stub.
[error] two errors found
[error] (compile:compileIncremental) Compilation failed
[error] Total time: 5 s, completed Mar 14, 2016 3:51:16 PM

看着这个answer,我猜测/推测我需要添加一个 java8 时间库作为依赖项?

【问题讨论】:

  • 那么这是否意味着我的依赖项之一正在使用 JDK8 的 java.time.Duration

标签: scala sbt


【解决方案1】:

Akka 2.4 需要 JDK8,除非您使用的是商业版本,这在 documentation 中有所提及。

相关摘录

Akka 要求您在计算机上安装 Java 8 或更高版本。

Typesafe 提供 Akka 和相关项目(例如 Scala 或 Play)的商业版本,作为 Reactive Platform 的一部分,该平台可用于 Java 6,以防您的项目暂时无法升级到 Java 8。它还包括其他商业功能或库。

Typesafe config 1.3.0 还有depends on java8

1.2.1 及更早的版本是为 Java 6 构建的,而更新的版本(1.3.0 及更高版本)将为 Java 8 构建。

还要注意 spray-client 1.3.3 依赖于 Akka 2.3.9(参见 http://spray.io/project-info/current-versions/#current-versions) 您可能想升级到 akka-http,它是 Spray 的继任者。

(由于您似乎使用的是 posix 兼容系统,您可能需要查看 jenv 以管理每个项目的 jdk 版本)

【讨论】:

  • 根据docs 中的Akka 2.3.14 (previous stable release) for Scala 2.10 / 2.11 and Java 6+,我从Akka v.2.4.2 降级到2.3.14。但是,当重新运行相同的 sbt -java-home .../jdk7/... 时,我得到了同样的错误。
  • 检查您的类型安全配置版本,同时降级 akka 和类型安全配置,警告消失。
  • 谢谢,Jean,降级到 "com.typesafe.akka" %% "akka-actor" % "2.3.14""com.typesafe" % "config" % "1.2.1" 为 JDK7 工作。你怎么知道也要更改typesafe config
  • 通过技术观察,我知道 lightbend/typesafe 一直在迁移其 OSS 库以支持 java 8(用于 lambda 字节码发射器的性能以及通过向付费客户提供 java 6 兼容构建来实现业务)。我复制了 akka hello-world 示例并尝试使用您的构建定义来编译它们。降级 akka 后,我注意到我仍然收到警告并检查了 config 文档:)
【解决方案2】:

我不确定如何解决此错误。

此错误表明您在代码中的某处转发 java.time.Duration,这是 Java 8 中公开的新 API。由于您已降级到 Java 7,因此该类不再可用。

要么删除依赖,要么恢复到 Java8。

【讨论】:

  • 我如何跟踪这种依赖关系?
  • @Kevin 你可以使用sbt-dependency-graph 找出你的依赖链
  • 这个特定的类可用作 JDK 6/7 github.com/ThreeTen/threetenbp987654322@的后向端口
  • 谢谢 - 这是一个有用的插件。我确实在 Akka v. 2.4.2 下看到了 [info] | +-org.scala-lang.modules:scala-java8-compat_2.11:0.7.0。然后,在使用 v.2.3.14 之后,我不再通过 sbt dependencyTree 看到 jdk8 依赖项,但是在重新运行 sbt -java-home ... 时我看到了同样的错误
  • @Kevin 你重新加载 sbt 了吗?
猜你喜欢
  • 1970-01-01
  • 2016-12-10
  • 2015-03-17
  • 1970-01-01
  • 2018-10-10
  • 2015-10-13
  • 1970-01-01
  • 2023-02-10
  • 1970-01-01
相关资源
最近更新 更多