TL; DR:當我使用第一個變體時,REPL運行對象正常,但是當我用package test替換import test._時,即使成功編譯的代碼也無法運行爲了編譯。Scala無法運行編譯的類,但直接運行它
我用Scala編寫一個簡單的Hello World應用程序:
import test._
object TestApp {
def main (args: Array[String]) {
val p = new HelloWorldPrinter
p.output()
}
}
的HelloWorldPrinter.output()方法只是println("Hello World");
當我與scala TestApp.scala
它的工作原理和輸出的Hello World運行應用程序,然而,當我運行fsc或scalac進行編譯時,它會生成一個包含相同包名稱「test」的子文件夾,並將TestApp.class放在那裏。然後,如果我跑scala test/TestApp
它不工作,並拋出這個錯誤:
Exception in thread "main" java.lang.RuntimeException: Cannot figure out how to run target: test/TestApp
at scala.sys.package$.error(package.scala:27)
at scala.tools.nsc.GenericRunnerCommand.scala$tools$nsc$GenericRunnerCommand$$guessHowToRun(GenericRunnerCommand.scala:38)
at scala.tools.nsc.GenericRunnerCommand$$anonfun$2.apply(GenericRunnerCommand.scala:48)
at scala.tools.nsc.GenericRunnerCommand$$anonfun$2.apply(GenericRunnerCommand.scala:48)
at scala.Option.getOrElse(Option.scala:108)
at scala.tools.nsc.GenericRunnerCommand.<init>(GenericRunnerCommand.scala:48)
at scala.tools.nsc.GenericRunnerCommand.<init>(GenericRunnerCommand.scala:17)
at scala.tools.nsc.MainGenericRunner.process(MainGenericRunner.scala:33)
at scala.tools.nsc.MainGenericRunner$.main(MainGenericRunner.scala:89)
at scala.tools.nsc.MainGenericRunner.main(MainGenericRunner.scala)
但是,如果我cd
爲「測試」,以從那裏運行已編譯的類,我得到一個完全不同的錯誤:
Exception in thread "main" java.lang.NoClassDefFoundError: TestApp (wrong name: test/TestApp)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClassCond(ClassLoader.java:631)
at java.lang.ClassLoader.defineClass(ClassLoader.java:615)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:283)
at java.net.URLClassLoader.access$000(URLClassLoader.java:58)
at java.net.URLClassLoader$1.run(URLClassLoader.java:197)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at scala.tools.nsc.util.ScalaClassLoader$URLClassLoader.scala$tools$nsc$util$ScalaClassLoader$$super$findClass(ScalaClassLoader.scala:88)
at scala.tools.nsc.util.ScalaClassLoader$class.findClass(ScalaClassLoader.scala:44)
at scala.tools.nsc.util.ScalaClassLoader$URLClassLoader.findClass(ScalaClassLoader.scala:88)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at scala.tools.nsc.util.ScalaClassLoader$URLClassLoader.scala$tools$nsc$util$ScalaClassLoader$$super$loadClass(ScalaClassLoader.scala:88)
at scala.tools.nsc.util.ScalaClassLoader$class.loadClass(ScalaClassLoader.scala:50)
at scala.tools.nsc.util.ScalaClassLoader$URLClassLoader.loadClass(ScalaClassLoader.scala:88)
at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:247)
at scala.tools.nsc.util.ScalaClassLoader$$anonfun$tryClass$1.apply(ScalaClassLoader.scala:37)
at scala.tools.nsc.util.ScalaClassLoader$$anonfun$tryClass$1.apply(ScalaClassLoader.scala:37)
at scala.util.control.Exception$Catch$$anonfun$opt$1.apply(Exception.scala:104)
at scala.util.control.Exception$Catch$$anonfun$opt$1.apply(Exception.scala:104)
at scala.util.control.Exception$Catch.apply(Exception.scala:88)
at scala.util.control.Exception$Catch.opt(Exception.scala:104)
at scala.tools.nsc.util.ScalaClassLoader$class.tryClass(ScalaClassLoader.scala:36)
at scala.tools.nsc.util.ScalaClassLoader$class.tryToLoadClass(ScalaClassLoader.scala:31)
at scala.tools.nsc.util.ScalaClassLoader$URLClassLoader.tryToLoadClass(ScalaClassLoader.scala:88)
at scala.tools.nsc.util.ScalaClassLoader$.classExists(ScalaClassLoader.scala:120)
at scala.tools.nsc.GenericRunnerCommand.scala$tools$nsc$GenericRunnerCommand$$guessHowToRun(GenericRunnerCommand.scala:34)
at scala.tools.nsc.GenericRunnerCommand$$anonfun$2.apply(GenericRunnerCommand.scala:48)
at scala.tools.nsc.GenericRunnerCommand$$anonfun$2.apply(GenericRunnerCommand.scala:48)
at scala.Option.getOrElse(Option.scala:108)
at scala.tools.nsc.GenericRunnerCommand.<init>(GenericRunnerCommand.scala:48)
at scala.tools.nsc.GenericRunnerCommand.<init>(GenericRunnerCommand.scala:17)
at scala.tools.nsc.MainGenericRunner.process(MainGenericRunner.scala:33)
at scala.tools.nsc.MainGenericRunner$.main(MainGenericRunner.scala:89)
at scala.tools.nsc.MainGenericRunner.main(MainGenericRunner.scala)
什麼給?
編輯:
這是我TestApp.scala對象:https://gist.github.com/3863344
這是我Printers.scala類:https://gist.github.com/3863348
與FSC編譯後運行scala test/TestApp
給我的第一個錯誤。輸入test
子文件夾並運行scala TestApp
給我第二個錯誤。在主文件夾中運行scala TestApp.scala
給了我這樣的:
TestApp.scala:1: error: illegal start of definition
package test
^
one error found
編輯2:我剛剛發現REPL不能運行包聲明代碼,讓我明白爲什麼上面的錯誤發生。但是,我仍然無法運行我編譯的代碼。
你確定你不會錯過某處的'package test' - 只有這樣你才能在測試文件夾中結束這個類,你應該可以使用'scala test.TestApp'從外部測試中執行它' –
有趣的事實:如果我將「import test._」替換爲「包測試」,我不能再運行該腳本,但我可以編譯它,然後成功運行它,而無需進入測試構建子文件夾。無論我做什麼,看起來我都無法吃掉它 - 我可以在使用導入時運行腳本,或者在使用包時運行編譯後的類(最終在測試文件夾外部結束)。 – Swader
@BijuKunjummen有正確的答案。 – pedrofurla