java - 使用最新版本的 Scala 会出现 java.lang.ClassNotFoundException : scala. Function1$class

标签 java scala dependencies sbt

所以我想使用 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 不存在。我在位于 $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 版本最好的方法是什么?

最佳答案

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 上托管一个分支,则可以通过 build.sbt 中的 URL 直接依赖它)

关于java - 使用最新版本的 Scala 会出现 java.lang.ClassNotFoundException : scala. Function1$class,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47043827/

相关文章:

java - BeanDefinitionRegistryPostProcessor - 如何将 @Configuration 类注册为 BeanDefinition 并同时注册它的 @Beans

scala - 记录器在集群上的 spark UDF 内不工作

json - 优雅的 Json 在 Spark 中展平

node.js - npm - 将安装的包保存为依赖项

javascript - 普通 JS 中的 Modernizr.mq

java - 从帖子中获取值

java - 如何在java中使用LIKE %编写正确的语句

json - 如何在 Scala 中将 Map 序列化为 JSON?

android - 如何在APK中包含其他文件?

java - 如何忽略数组适配器中的第一项