我应该是一个简单的scala脚本,如下所示:
object SaveTaggedSenseTask {
def main(args: Array[String]) {
val reader:SenseEvalAllWordsDocumentReader = new SenseEvalAllWordsDocumentReader()
reader.parse(args(0))
println(reader.sentences)
reader.sentences()
}
}
SenseEvalAllWordsDocumentReader
是一个java定义的类,它只是SAX解析器的包装器。调用句子应该只返回另一个名为Sentence的java定义类的java List。如果我使用
scala -cp jar-with-everything.jar SaveTaggedSenseTask.scala path/to/file.xml
我得到以下可怕的输出:
java.lang.ClassNotFoundException: Main (args = /home/stevens35/senseEval/senseEval3-allwords/english-all-words.xml, classpath = /tmp/scalascript7300484879512233483.tmp:/usr/java/jdk1.6.0_26/jre/lib/resources.jar:/usr/java/jdk1.6.0_26/jre/lib/rt.jar:/usr/java/jdk1.6.0_26/jre/lib/jsse.jar:/usr/java/jdk1.6.0_26/jre/lib/jce.jar:/usr/java/jdk1.6.0_26/jre/lib/charsets.jar:/home/stevens35/devel/src/scala-2.9.1.final/lib/jline.jar:/home/stevens35/devel/src/scala-2.9.1.final/lib/scala-compiler.jar:/home/stevens35/devel/src/scala-2.9.1.final/lib/scala-dbc.jar:/home/stevens35/devel/src/scala-2.9.1.final/lib/scala-library.jar:/home/stevens35/devel/src/scala-2.9.1.final/lib/scalap.jar:/home/stevens35/devel/src/scala-2.9.1.final/lib/scala-swing.jar:/usr/java/jdk1.6.0_26/jre/lib/ext/sunjce_provider.jar:/usr/java/jdk1.6.0_26/jre/lib/ext/sunpkcs11.jar:/usr/java/jdk1.6.0_26/jre/lib/ext/localedata.jar:/usr/java/jdk1.6.0_26/jre/lib/ext/dnsns.jar:/home/stevens35/devel/C-Cat/wordnet/.:/home/stevens35/devel/C-Cat/wordnet/target/extendOntology-wordnet-1.0-jar-with-dependencies.jar:/home/stevens35/devel/C-Cat/wordnet/../data/target/extendOntology-data-1.0.jar)
at scala.tools.nsc.util.ScalaClassLoader$URLClassLoader.run(ScalaClassLoader.scala:103)
at scala.tools.nsc.ObjectRunner$.run(ObjectRunner.scala:33)
at scala.tools.nsc.ObjectRunner$.runAndCatch(ObjectRunner.scala:40)
at scala.tools.nsc.ScriptRunner.scala$tools$nsc$ScriptRunner$$runCompiled(ScriptRunner.scala:171)
at scala.tools.nsc.ScriptRunner$$anonfun$runScript$1.apply(ScriptRunner.scala:188)
at scala.tools.nsc.ScriptRunner$$anonfun$runScript$1.apply(ScriptRunner.scala:188)
at scala.tools.nsc.ScriptRunner$$anonfun$withCompiledScript$1.apply$mcZ$sp(ScriptRunner.scala:157)
at scala.tools.nsc.ScriptRunner$$anonfun$withCompiledScript$1.apply(ScriptRunner.scala:131)
at scala.tools.nsc.ScriptRunner$$anonfun$withCompiledScript$1.apply(ScriptRunner.scala:131)
at scala.tools.nsc.util.package$.waitingForThreads(package.scala:26)
at scala.tools.nsc.ScriptRunner.withCompiledScript(ScriptRunner.scala:130)
at scala.tools.nsc.ScriptRunner.runScript(ScriptRunner.scala:188)
at scala.tools.nsc.ScriptRunner.runScriptAndCatch(ScriptRunner.scala:201)
at scala.tools.nsc.MainGenericRunner.runTarget$1(MainGenericRunner.scala:58)
at scala.tools.nsc.MainGenericRunner.process(MainGenericRunner.scala:80)
at scala.tools.nsc.MainGenericRunner$.main(MainGenericRunner.scala:89)
at scala.tools.nsc.MainGenericRunner.main(MainGenericRunner.scala)
我假设这意味着scala正在寻找一个名为Main的类而无法找到它,但我无法弄清楚为什么它甚至会想到这个。此外,如果我删除了reader.sentences()
行,或者在其上执行类似调用size()
的操作,问题就会消失。我只能猜测scala以某种方式推断出由于这个调用而存在一个名为Main的类,但我没有看到任何明显的解决方法。
思考?非常感谢任何帮助。
答案 0 :(得分:5)
您正在混淆Scala脚本和Scala程序。使用object
和def main
时,您应该使用scalac
编译该程序,然后使用scala
调用该程序,并传递包含object
的{{1}}名称{1}}方法。
作为脚本调用时,您应该删除main
和object
,然后放置您的程序。参数仍然在def main
。
现在,Scala 2.9.1的一个特性是可以混合脚本和程序调用,但显然由于某些原因它在这里不起作用。我建议你选择一种做事方式,并坚持下去。
答案 1 :(得分:0)
您的脚本定义了SaveTaggedSenseTask对象,但不执行任何操作。
添加
SaveTaggedSenseTask.main(args)
到脚本文件的末尾。或者您可以删除对象和def语句,例如@ daniel-c-sobral建议。