Использование последней версии Scala дает java.lang.ClassNotFoundException: scala.Function1 $ class

2

Поэтому я хочу использовать библиотеку cronish в своем проекте SBT.

Мой файл 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 не существует. Я запускаю проект в worker.scala, расположенный в $ProjectRoot/src/main/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?

Теги:
dependencies
sbt

1 ответ

4
Лучший ответ

Scala не имеет бинарной совместимости в основных выпусках (и 2.11.x - это другой основной релиз от 2.12.x).

Это означает, что вы абсолютно не можете использовать библиотеку, составленную против Scala 2.11 в проекте, который использует Scala 2.12, извините.

Вы можете:

  • Снизьте свой проект, установив scalaVersion := "2.11.11"
  • Подождите, пока cronish выпустит версию, составленную против Scala 2.12.
  • Попробуйте скомпилировать cronish против Scala 2.12 (если вы, например, размещаете fork на github, можно напрямую зависеть от него по URL-адресу в файле build.sbt)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню