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.scala
HelloWorldを出力しますが、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がパッケージ宣言を含むコードを実行できないことがわかったので、上記のエラーが発生する理由を理解しました。ただし、コンパイルしたコードを実行することはできません。