gpt4 book ai didi

java - Scala 运行编译类失败,直接运行

转载 作者:行者123 更新时间:2023-11-30 11:40:19 25 4
gpt4 key购买 nike

TL;DR:当我使用第一个变体时,REPL 可以很好地运行对象,但是当我将 import test._ 替换为 package 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 进行编译时,它会生成一个具有相同包名的子文件夹“测试”并将 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 进入“test”以从那里运行编译的类,我会得到一个完全不同的错误:

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不能运行带包声明的代码,所以我明白为什么会出现上述错误。但是,我仍然无法运行编译后的代码。

最佳答案

尝试从主文件夹中将编译代码作为 scala test.TestApp 运行(在运行编译类的情况下 scala 接受类名作为其参数,而不是文件姓名)。

Scala(就像 java)有一个搜索类的位置列表 - 称为 classpath。默认情况下,位置设置为当前目录。然后对于给定的类 packageX.packageY.ClassName,它搜索相应的 .class 文件 packageX/packageY/ClassName.class。因此,如果您在没有显式类路径的情况下运行 scala test.TestApp,它会找到编译后的文件 test/TestApp.class 并运行它。

关于java - Scala 运行编译类失败,直接运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12806182/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com