【问题标题】:scala - package not found when running from command linescala - 从命令行运行时找不到包
【发布时间】:2016-06-27 01:44:49
【问题描述】:

我正在使用this book 学习 Scala,但在尝试运行其中一个示例后出现错误。代码:

shapes.scala

package shapes {  
  class Point(val x: Double, val y: Double) {
    override def toString() = "Point(" + x + "," + y + ")"
  }

  abstract class Shape() { 
    def draw(): Unit
  }

  class Circle(val center: Point, val radius: Double) extends Shape {
    def draw() = println("Circle.draw: " + this)
    override def toString() = "Circle(" + center + "," + radius + ")"
  }

  class Rectangle(val lowerLeft: Point, val height: Double, val width: Double)
        extends Shape {
    def draw() = println("Rectangle.draw: " + this)
    override def toString() = 
      "Rectangle(" + lowerLeft + "," + height + "," + width + ")"
  }

  class Triangle(val point1: Point, val point2: Point, val point3: Point) 
        extends Shape {
    def draw() = println("Triangle.draw: " + this)
    override def toString() = 
      "Triangle(" + point1 + "," + point2 + "," + point3 + ")"
  }
}

shapes-actor.scala

package shapes {
  import scala.actors._
  import scala.actors.Actor._

  object ShapeDrawingActor extends Actor {
    def act() {
      loop {
        receive {
          case s: Shape => s.draw()
          case "exit"   => println("exiting..."); exit
          case x: Any   => println("Error: Unknown message! " + x)
        }
      }
    }
  }
}

shapes-actor-script.scala

import shapes._

ShapeDrawingActor.start()

ShapeDrawingActor ! new Circle(new Point(0.0,0.0), 1.0)
ShapeDrawingActor ! new Rectangle(new Point(0.0,0.0), 2, 5)
ShapeDrawingActor ! new Triangle(new Point(0.0,0.0),
                                 new Point(1.0,0.0),
                                 new Point(0.0,1.0))
ShapeDrawingActor ! 3.14159

ShapeDrawingActor ! "exit"

现在我尝试从命令行运行以下命令:

scalac shapes.scala shapes-actor.scala
scala -cp . shapes shapes-actor-script.scala

第一个命令将类编译为.class 文件,位于名为shapes 的目录中,但第二个命令引发错误:

/Users/simon/Documents/playground/code-examples/Introdu
cingScala/shapes-actor-script.scala:3: error: not found
: value shapes
import shapes._
       ^
...

我编译/运行程序的方式有问题吗?

【问题讨论】:

    标签: scala


    【解决方案1】:

    您似乎将 Scala 视为 Python。不幸的是,这行不通。我想你误解了什么

    % scala -cp . shapes shapes-actor-script.scala
    

    的意思。当您执行该命令时,至少在 OS X 10.11.5 上;斯卡拉 2.11.8; Java 1.8.0_60;那么你会得到这个错误:

    java.io.IOException: no such file: shapes
        at scala.tools.nsc.ScriptRunner.runScript(ScriptRunner.scala:194)
        at scala.tools.nsc.ScriptRunner.runScriptAndCatch(ScriptRunner.scala:205)
        at scala.tools.nsc.MainGenericRunner.runTarget$1(MainGenericRunner.scala:67)
        at scala.tools.nsc.MainGenericRunner.run$1(MainGenericRunner.scala:87)
        at scala.tools.nsc.MainGenericRunner.process(MainGenericRunner.scala:98)
        at scala.tools.nsc.MainGenericRunner$.main(MainGenericRunner.scala:103)
        at scala.tools.nsc.MainGenericRunner.main(MainGenericRunner.scala) 
    

    它抱怨找不到shapes,因为我们弄乱了 exec 语法。请记住语法是 scala -cp PATHS CLASS,其中 shell 会将 PATHS 视为单个参数。所以上面的命令是告诉 Scala 执行类名shapes 的 main 方法,而我们没有。

    我们可以通过更正命令并使用: 连接路径来解决此问题。像这样:

    % scala -cp .:shapes shapes-actor-script.scala
    

    现在我们得到了这个错误:

    error: error while loading ShapeDrawingActor, class file 'shapes/ShapeDrawingActor.class' has location not matching its contents: contains class ShapeDrawingActor
    error: error while loading Circle, class file 'shapes/Circle.class' has location not matching its contents: contains class Circle
    error: error while loading Point, class file 'shapes/Point.class' has location not matching its contents: contains class Point
    error: error while loading Rectangle, class file 'shapes/Rectangle.class' has location not matching its contents: contains class Rectangle
    error: error while loading Triangle, class file 'shapes/Triangle.class' has location not matching its contents: contains class Triangle
    5 errors found
    

    这里的问题有两个方面: - 1) Scala 将为您在类路径中指定的每个目录递归加载每个类文件。所以我们双重加载每个文件。 - 2) scala 期望类文件的目录布局与包布局相匹配,这意味着如果我们将shapes 列为我们唯一的类路径目录,然后尝试加载类shapes.Triangle,那么我们真的在尝试查找和加载文件shapes/shapes/Triangle.class。那不存在,所以脚本失败了。

    让我们从类路径中删除 shapes 并重试:

    % scala -cp . shapes-actor-script.scala
    Circle.draw: Circle(Point(0.0,0.0),1.0)
    Rectangle.draw: Rectangle(Point(0.0,0.0),2.0,5.0)
    Triangle.draw: Triangle(Point(0.0,0.0),Point(1.0,0.0),Point(0.0,1.0))
    Error: Unknown message! 3.14159
    exiting...
    

    有效!

    实际上,您还有其他几种方法可以调用此脚本。 scala 命令默认会从. 中查找类文件,所以我们可以这样写:

    % scala shapes-actor-script.scala
    

    如果您想将shapes-actor-script.scala 作为真正的脚本执行,那么最简单的方法是按照标题Script it! 下的说明进行操作。只需添加:

    #!/bin/sh
    exec scala "$0" "$@"
    !#
    ...rest of shapes-actor-script.scala
    

    然后您可以像执行任何其他脚本一样在命令行上执行它(确保文件是可执行的!):

    % ./shapes-actor-script.scala
    

    祝你学习 scala 好运!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-09-14
      • 1970-01-01
      • 1970-01-01
      • 2014-01-05
      • 1970-01-01
      • 2013-05-27
      • 2017-10-01
      相关资源
      最近更新 更多