使用Scala符号文字导致NoSuchMethod

时间:2010-05-19 05:30:22

标签: scala dsl symbols literals nosuchmethoderror

我最近开始使用Scala。我在其中编写了一个DSL,可用于描述medici中的处理管道。在我的DSL中,我使用了符号来表示一个锚点,它可以用来在管道中放置一个叉子(或者一个T恤,如果你愿意的话)。这是一个正确运行的小样本程序:

object Test extends PipelineBuilder {
    connector("TCP") / Map("tcpProtocol" -> new DirectProtocol())
    "tcp://localhost:4858" --> "ByteToStringProcessor" --> Symbol("hello")
    "stdio://in?promptMessage=enter name:%20" --> Symbol("hello")
    Symbol("hello") --> "SayHello" / Map("prefix" -> "\n\t")  --> "stdio://out"
}

出于某种原因,当我在程序中使用符号文字时,我在运行时得到NoSuchMethod异常:

java.lang.NoSuchMethodError: scala.Symbol.intern()Lscala/Symbol;
        at gov.pnnl.mif.scaladsl.Test$.<init>(Test.scala:7)
        at gov.pnnl.mif.scaladsl.Test$.<clinit>(Test.scala)
        at gov.pnnl.mif.scaladsl.Test.main(Test.scala)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at scala.tools.nsc.ObjectRunner$$anonfun$run$1.apply(ObjectRunner.scala:75)
        at scala.tools.nsc.ObjectRunner$.withContextClassLoader(ObjectRunner.scala:49)
        at scala.tools.nsc.ObjectRunner$.run(ObjectRunner.scala:74)
        at scala.tools.nsc.MainGenericRunner$.main(MainGenericRunner.scala:154)
        at scala.tools.nsc.MainGenericRunner.main(MainGenericRunner.scala)

无论符号如何使用,都会发生这种情况。具体来说,我尝试在管道中使用符号,并使用简单的println('foo)语句。

问题:什么可能导致符号文字的存在导致NoSuchMethodError?在我的DSL中,我使用了一个隐式函数,它将符号转换为Anchor类的实例,如下所示:

    implicit def makeAnchor(a: Symbol):Anchor = anchor(a)

可悲的是,我对Scala的理解很弱,以至于我无法想到为什么会导致我的NoSuchMethodError。

2 个答案:

答案 0 :(得分:4)

最可能的解释是,您使用不同版本的Scala进行编译,而不是在运行时使用类路径进行编译。

检查Scala的运行时版本

将以下内容添加到main()方法中:

println(classOf[scala.Symbol].getProtectionDomain.getCodeSource)

这将告诉您从哪里加载Scala库,例如:

  

(档案:/Users/jason/usr/scala-2.8.0.RC2/lib/scala-library.jar)

检查Scala的编译时版本

我不知道你是如何调用scalac的。假设它来自命令行,请运行scalac -version

答案 1 :(得分:1)

你是否可能安装了多个版本的Scala,至少从2.7.1源代码开始( http://scala-tools.org/scaladocs/scala-library/2.7.1/Symbol.scala.html)它看起来像是否有一个实习方法?