2

TL; DR:REPLは、最初のバリアントを使用するとオブジェクトを正常に実行しますが、コンパイルするためにimporttest._をpackagetestに置き換えると、正常にコンパイルされたコードでさえ実行に失敗します。

私はScalaで書かれたシンプルなHelloWorldアプリを持っています:

import test._
object TestApp {
  def main (args: Array[String]) {
    val p = new HelloWorldPrinter
    p.output()
  }
}

HelloWorldPrinter.output()メソッドはprintln("Hello World");

アプリを実行してscala TestApp.scalaHelloWorldを出力しますが、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すると、2番目のエラーが発生します。メインフォルダで実行scala TestApp.scalaすると、次のようになります。

TestApp.scala:1: error: illegal start of definition
package test
^
one error found

編集2:REPLがパッケージ宣言を含むコードを実行できないことがわかったので、上記のエラーが発生する理由を理解しました。ただし、コンパイルしたコードを実行することはできません。

4

1 に答える 1

1

コンパイルされたコードをscala test.TestAppメインフォルダーから実行してみてください(コンパイルされたクラスを実行する場合はscala、ファイル名ではなくクラス名を引数として受け入れます)。

Scala(javaと同じように)には、クラスを検索する場所のリストがあります-classpathと呼ばれます。デフォルトでは、場所は現在のディレクトリに設定されています。次に、指定されたクラスpackageX.packageY.ClassNameについて、対応する.classファイルを検索しますpackageX/packageY/ClassName.class。したがって、scala test.TestApp明示的なクラスパスなしで実行すると、コンパイルされたファイルが検索されtest/TestApp.classて実行されます。

于 2012-10-10T08:15:04.897 に答える