2

TL;DR:当我使用第一个变体时,REPL 运行对象很好,但是当我将 import test._ 替换为包 test 以进行编译时,即使成功编译的代码也无法运行。

我有一个用 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 无法运行带有包声明的代码,所以我明白为什么会发生上述错误。但是,我仍然无法运行我编译的代码。

4

1 回答 1

1

Try running the compiled code as scala test.TestApp from the main folder (in the case of running compiled classes scala accepts class name as its argument, not a file name).

Scala (just as java) has a list of locations to search classes in - called classpath. By default, the location is set to the current directory. Then for given class packageX.packageY.ClassName it searches for the corresponding .class file packageX/packageY/ClassName.class. So if you run scala test.TestApp with no explicit classpath it locates the compiled file test/TestApp.class and runs it.

于 2012-10-10T08:15:04.897 回答