使用最新版本的Scala会产生java.lang.ClassNotFoundException:scala.Function1 $ class

时间:2017-10-31 20:14:35

标签: java scala dependencies sbt

所以我想在我的SBT项目中使用cronish库。

我的build.sbt看起来像是

name := "SampleName"
version := "1.0"
scalaVersion := "2.12.4"
libraryDependencies += "com.github.philcali" % "cronish_2.11" % "0.1.3"

我必须明确提及cronish_2.11,因为cronish_2.12不存在。我在位于$ProjectRoot/src/main/scala

的workers.scala中运行该项目
import cronish._
import cronish.dsl._

object workers {
  def main(args: Array[String]) : Unit = {

    val payroll: CronTask = task {
      println("You have just been paid... Finally!")
    }

    payroll executes "every 5 seconds"
  }
}

当我使用sbt run运行它时会出现以下错误:

[error] (run-main-0) java.lang.NoClassDefFoundError: scala/Function1$class
java.lang.NoClassDefFoundError: scala/Function1$class
    at scala.util.parsing.combinator.Parsers$Parser.<init>(Parsers.scala:225)
    at scala.util.parsing.combinator.RegexParsers$$anon$1.<init>(RegexParsers.scala:84)
    at scala.util.parsing.combinator.RegexParsers$class.literal(RegexParsers.scala:84)
    at cronish.dsl.Cronish$.literal(dsl.scala:209)
    at cronish.dsl.CronParsers$class.$init$(dsl.scala:28)
    at cronish.dsl.Cronish$.<init>(dsl.scala:209)
    at cronish.dsl.Cronish$.<clinit>(dsl.scala)
    at cronish.dsl.package$.string2cron(package.scala:7)
    at cronish.dsl.package$.<init>(package.scala:18)
    at cronish.dsl.package$.<clinit>(package.scala)
    at workers$.main(workers.scala:8)
    at workers.main(workers.scala)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
Caused by: java.lang.ClassNotFoundException: scala.Function1$class
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    at scala.util.parsing.combinator.Parsers$Parser.<init>(Parsers.scala:225)
    at scala.util.parsing.combinator.RegexParsers$$anon$1.<init>(RegexParsers.scala:84)
    at scala.util.parsing.combinator.RegexParsers$class.literal(RegexParsers.scala:84)
    at cronish.dsl.Cronish$.literal(dsl.scala:209)
    at cronish.dsl.CronParsers$class.$init$(dsl.scala:28)
    at cronish.dsl.Cronish$.<init>(dsl.scala:209)
    at cronish.dsl.Cronish$.<clinit>(dsl.scala)
    at cronish.dsl.package$.string2cron(package.scala:7)
    at cronish.dsl.package$.<init>(package.scala:18)
    at cronish.dsl.package$.<clinit>(package.scala)
    at workers$.main(workers.scala:8)
    at workers.main(workers.scala)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)

如果我将scalaVersion更改为2.11.x,我可以将其付诸实践。但我很想知道导致错误的原因是什么?什么是使用我当前的Scala版本的最佳方法?

1 个答案:

答案 0 :(得分:4)

Scala在主要版本中没有二进制兼容性(2.11.x是与2.12.x不同的主要版本)。

这意味着你绝对不能在使用Scala 2.12的项目中使用针对Scala 2.11编译的库,抱歉。

您可能想要:

  • 通过设置scalaVersion := "2.11.11"
  • 降级项目
  • 等待cronish发布针对Scala 2.12
  • 编译的版本
  • 尝试针对Scala 2.12编译cronish(如果您在github上托管一个fork,可以直接通过build.sbt中的URL依赖它)