【问题标题】:Scala: java.lang.VerifyError - Incompatible argument to function - runtime errorScala:java.lang.VerifyError - 函数参数不兼容 - 运行时错误
【发布时间】:2023-03-21 22:31:01
【问题描述】:

我在混合 Java/Scala 项目中使用 Scala 的 MongoDB Casbah 库。

此代码在 REPL 中运行良好:

studentCollection.distinct("districtlea").foreach(x => {
 println(x)
 val q = MongoDBObject("districtlea" -> x)
 val studentWithDistrict = studentCollection.findOne(q)
 studentWithDistrict match {
   case Some(s) => println(s.getAs[String]("districtname").getOrElse("NO DISTRICT NAME FOUND FOR LEA " + x))
   case None => println("NO DISTRICT FOUND WITH LEA ")
}
})

当我通过我的 Ant 构建运行它时(与我在 REPL 中使用的类路径相同),它编译得很好,但我在运行时得到了这个:

 [java] java.lang.VerifyError: (class: scala/collection/immutable/List, method: ms$1 signature: (Lscala/collection/immutable/List;Lscala/Function2;)Lscala/collection/immutable/List;) Incompatible argument to function
 [java]     at scala.sys.SystemProperties$.propertyHelp(SystemProperties.scala:57)
 [java]     at scala.sys.SystemProperties$.addHelp(SystemProperties.scala:59)
 [java]     at scala.sys.SystemProperties$.bool(SystemProperties.scala:63)
 [java]     at scala.sys.SystemProperties$.noTraceSupression(SystemProperties.scala:75)
 [java]     at scala.util.control.NoStackTrace$class.fillInStackTrace(NoStackTrace.scala:21)
 [java]     at scala.util.control.BreakControl.fillInStackTrace(Breaks.scala:77)
 [java]     at java.lang.Throwable.<init>(Throwable.java:181)
 [java]     at scala.util.control.BreakControl.<init>(Breaks.scala:77)
 [java]     at scala.util.control.Breaks.<init>(Breaks.scala:30)
 [java]     at scala.collection.Traversable$.<init>(Traversable.scala:103)
 [java]     at scala.collection.Traversable$.<clinit>(Traversable.scala)
 [java]     at scala.package$.<init>(package.scala:37)
 [java]     at scala.package$.<clinit>(package.scala)
 [java]     at scala.Predef$.<init>(Predef.scala:32)
 [java]     at scala.Predef$.<clinit>(Predef.scala)
 [java]     at com.enspire.hive.elements.pub.SelectionJson$$anonfun$1.apply(SelectionJson.scala:17)
...

该堆栈跟踪的最后一行指向“val q = ...”行。

我使用 Scala 2.9.0-1 构建了 Casbah 库 [2.9.0-1-2.2.0-SNAPSHOT],并使用它来运行它。我怀疑此错误与使用不兼容版本的 Scala 构建的类路径上的某些库有关,但我无法在任何地方找到它,我无法解释为什么相同的代码可以在 REPL 中使用相同的类路径。如果您有任何关于在哪里进一步挖掘的想法,我将不胜感激。

【问题讨论】:

    标签: java scala ant mongodb casbah


    【解决方案1】:

    看起来您的某个第三方库与旧版本的 Scala 相关联:

    [java] at com.enspire.hive.elements.pub.SelectionJson$$anonfun$1.apply(SelectionJson.scala:17)

    似乎是错误链接的根源。

    【讨论】:

    • 感谢您的回复......在我试图追踪这一点的过程中,我现在已经从类路径中删除了所有 Scala jar,除了 scala-library、casbah jar 和最小集让 casbah 运行的 jars (全部直接从 casbah 的 sbt lib_managed/scala_2.9.0-1 目录中提取)。 SelectionJson.scala:17 指向val q = MongoDBObject("districtlea" -&gt; x) 行。知道我应该在哪里继续寻找吗?下一步是放弃 ant 构建,完全切换到 sbt,反正也不错。
    • 进一步调查:如果我通过 JUnit 运行代码,无论是通过 Ant 还是直接运行,代码都使用完全相同的类路径。我现在怀疑问题在于我使用它的 Java 项目使用自定义类加载器来促进某些 Java 类的字节码检测。它与 Scala 没有任何关系,所以我仍然不确定它为什么会导致这个错误,但这是我能确定的唯一区别。我们现在已经解决了这个问题,但是当我有时间时,我会追踪这个问题,以了解发生了什么。
    • 是的,您显示的堆栈跟踪绝对与 Casbah 无关;我们也绝对不会在 Casbah 中使用 Break 或 BreakControl。
    猜你喜欢
    • 1970-01-01
    • 2022-07-09
    • 2012-07-17
    • 2013-08-09
    • 2022-12-12
    • 1970-01-01
    • 2011-06-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多