如何从Scala中的其他目录导入文件?

时间:2011-05-15 14:04:03

标签: scala import directory compilation subdirectory

我有dir等级,例如:

src
src/Model
src/View
src/Controller

现在我想构建我的应用程序。如何从模型视图和控制器导入/包含类,因为编译器看不到它们?

//编辑

的src / App.scala

import swing._

object App extends Application {

  val model       = new Model
  val view        = new View(model)
  val controller  = new Controller(model, view)

  view.visible = true

}

的src /型号/ Model.scala

class Model {
  // some code
}

SRC /视图/ View.scala

import swing._

class View(model:Model) extends MainFrame {
  // some code
}

SRC /控制器/ Controller.scala

class Controller(model:Model, view:View) {
  // some code
}

这是一个构建脚本

#!/bin/bash

source ${0%/*}/config.inc.sh

if [ ! -d $CLASSES_PATH ]; then
  notice "Creating classes directory..."
  mkdir $CLASSES_PATH
fi

notice "Building VirtualCut..."
scalac $SOURCE_PATH/Model/*.scala -d $CLASSES_PATH || error "Build failed (Model)."
scalac $SOURCE_PATH/View/*.scala -d $CLASSES_PATH || error "Build failed (View)."
scalac $SOURCE_PATH/Controller/*.scala -d $CLASSES_PATH || error "Build failed (Controller)."
scalac $SOURCE_PATH/*.scala -d $CLASSES_PATH || error "Build failed."
success "Building complete."

exit 0

当所有文件都在src目录中时,一切正常。

2 个答案:

答案 0 :(得分:5)

  1. 使用成熟的构建工具,而不是乱搞手动shell脚本。 SBT必须是你最好的选择。

  2. 在每个源文件的顶部,指定它应该属于哪个包。不建议将所有内容转储到默认包中 - 这是未来命名空间冲突的保证配方。

  3. 确保每个文件也是import依赖于它的类。

答案 1 :(得分:3)

由于你还没有报告你得到的错误,我们只能猜测。但是,基本错误似乎只是您编译的代码在不同的步骤中相互引用。解决方案很简单:不要这样做。这样做:

scalac $SOURCE_PATH/Model/*.scala $SOURCE_PATH/View/*.scala $SOURCE_PATH/Controller/*.scala $SOURCE_PATH/*.scala -d $CLASSES_PATH || error "Build failed."
success "Building complete."

但是,如果您确定没有交叉依赖关系,则需要将CLASSES_PATH作为类路径传递:

scalac $SOURCE_PATH/Model/*.scala-d $CLASSES_PATH || error "Build failed (Model)."
scalac $SOURCE_PATH/View/*.scala -cp $CLASSES_PATH -d $CLASSES_PATH || error "Build failed (View)."
scalac $SOURCE_PATH/Controller/*.scala -cp $CLASSES_PATH -d $CLASSES_PATH || error "Build failed (Controller)."
scalac $SOURCE_PATH/*.scala -cp $CLASSES_PATH -d $CLASSES_PATH || error "Build failed."