为什么scala-ide不允许在文件顶部放置多个包定义?

时间:2013-10-09 23:46:07

标签: scala scala-ide

在scala中,通常的做法是堆栈包语句to allow shorter imports,但是当我使用堆栈包将文件加载到scala ide中并且我尝试使用从同一组织开始的导入时,我收到编译器错误什么似乎是演示文稿编译器。代码在IDE之外的sbt中编译良好。

示例代码段如下:

package com.coltfred
package util
package time

import com.github.nscala_time.time.Imports._

在导入时,我收到错误object github is not a member of package com.coltfred.util.com

如果我将导入移动到单行,则错误将消失,但我们在代码库中经常使用这种做法,因此将它们全部更改为单行包语句会很麻烦。

为什么会发生这种情况,我能做些什么来解决它?

编辑:

我使用eclipse-sbt插件为此生成eclipse项目文件。目录结构应该是它,所有依赖项都在类路径中。

编辑2:

事实证明,util包的测试树中有一个文件(应该在同一个包中),但在顶部有一个重复的包语句。我没有检查测试树,因为它不应该影响主树的编译,但显然我错了。

2 个答案:

答案 0 :(得分:3)

不确定为什么Scala IDE不喜欢这个,但您可以使用_root_强制导入从顶层开始:

import _root_.com.github.nscala_time.time.Imports._

看看是否可以避免刺激IDE。

答案 1 :(得分:1)

这是一种常见的烦恼,让人感到厌烦,试图修复它。他的想法是,一个不提供类文件的目录不应该被视为一个包。如果您可以util作为scala.util,那么您应该优先考虑那个util为空的foo.util

util dir是通常的嫌疑人,因为谁没有工具目录,尤其是./util

apm@mara:~/tmp/coltfred$ mkdir -p com/coltfred/util/time
apm@mara:~/tmp/coltfred$ mkdir -p com/coltfred/util/com
apm@mara:~/tmp/coltfred$ vi com/coltfred/util/time/test.scala
apm@mara:~/tmp/coltfred$ scalac com/coltfred/util/time/test.scala
./com/coltfred/util/time/test.scala:5: error: object github is not a member of package com.coltfred.util.com
import com.github.nscala_time.time._
           ^
one error found
apm@mara:~/tmp/coltfred$ cat com/coltfred/util/time/test.scala
package com.coltfred
package util
package time

import com.github.nscala_time.time._

class Test

apm@mara:~/tmp/coltfred$ 

要进行调试,请找出从中加载违规包的位置。