Скала ищет неизвестный Главный класс - PullRequest
2 голосов
/ 24 сентября 2011

У меня есть простой сценарий 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.Вызывающие предложения должны просто возвращать Java-список другого Java-определенного класса, называемого Sentence.Если я запускаю этот код, используя

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 должен существовать из-за этого вызова, но я не вижу очевидного обходного пути.

Мысли?Любая помощь с благодарностью.

Ответы [ 2 ]

5 голосов
/ 24 сентября 2011

Вы совмещаете скрипт Scala и программу Scala. При использовании object и def main вы должны скомпилировать программу с scalac, а затем вызвать ее с scala, передав имя object, содержащее метод main.

При вызове скрипта вы должны удалить object и def main и просто поставить свою программу. Аргументы все еще будут в args.

Теперь, одна из особенностей Scala 2.9.1 заключается в том, что можно смешивать вызовы скрипта и программы, но он, очевидно, здесь не работает по какой-то причине. Я предлагаю вам выбрать один из способов ведения дел и придерживаться этого.

0 голосов
/ 08 августа 2014

Ваш скрипт определяет объект SaveTaggedSenseTask, но ничего не выполняет.

Просто добавьте

SaveTaggedSenseTask.main(args)

до конца файла скрипта. Или вы можете удалить операторы object и def, как предложено @ daniel-c-sobral.

...