Scala搜索一个模糊的主类
我有一个简单的scala脚本,如下所示:Scala搜索一个模糊的主类,scala,scala-java-interop,Scala,Scala Java Interop,我有一个简单的scala脚本,如下所示: object SaveTaggedSenseTask { def main(args: Array[String]) { val reader:SenseEvalAllWordsDocumentReader = new SenseEvalAllWordsDocumentReader() reader.parse(args(0))
object SaveTaggedSenseTask {
def main(args: Array[String]) {
val reader:SenseEvalAllWordsDocumentReader = new SenseEvalAllWordsDocumentReader()
reader.parse(args(0))
println(reader.sentences)
reader.sentences()
}
}
senseevallallwordsdocumentreader
是一个java定义的类,它只是SAX解析器的包装器。调用语句只需返回另一个java定义的类(称为句子)的java列表。如果我使用
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.句子()
行,或者对其执行类似于调用size()
的操作,问题就会消失。我只能猜测scala以某种方式推断,由于这个调用,名为Main的类应该存在,但我没有看到任何明显的解决方法
想法?非常感谢您的帮助。您将Scala脚本和Scala程序混为一谈。使用
object
和def main
时,应使用scalac
编译程序,然后使用scala
调用它,并传递包含main
方法的对象的名称
当作为脚本调用时,应该删除对象
和def main
,只需将程序放入。参数仍将位于args
中
现在,Scala 2.9.1的一个特性是可以混合使用脚本和程序调用,但由于某些原因,它显然无法在这里工作。我建议您选择一种方法,并坚持下去。您的脚本定义了对象SaveTaggedSenseTask,但不执行任何操作
加上
SaveTaggedSenseTask.main(args)
到脚本文件的末尾。或者你可以删除object和def语句,就像@daniel-c-sobral建议的那样。谢谢你添加了框Rahul,我不知道我可以这么做!啊,很有趣。我对scala还是相当陌生,实际上不知道如何用fasion这样的脚本编写。此外,我尝试按照您的建议作为纯脚本运行,但仍然会抛出异常。但是,当我尝试用scalac编译它时,我得到了一个看起来更可怕的异常,它可以归结为句子正在使用的一些java类。我有一种感觉,这完全依赖于一些更深层次的依赖关系,不能在Scala中轻松使用这个库。不过,如果其他人遇到类似的问题,我会非常感兴趣。@fozziethebeat然后尝试将其编译为程序,并直接用“java”调用它。您只需在类路径中传递scala-library.jar。另外,当作为脚本运行时,尝试使用-usejavacp
。@fozziethebeat我刚刚想到了一些东西。。。您是否使用jar文件的相对路径?如果你是,不要。使用绝对路径。@daniel-c-sobral遗憾的是,这两个建议似乎都不起作用。我不能用scalac编译程序,而且-usejavacp似乎没有太大变化。但是谢谢你的建议。现在,我想我只需要用java编写这个东西。