在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包的测试树中有一个文件(应该在同一个包中),但在顶部有一个重复的包语句。我没有检查测试树,因为它不应该影响主树的编译,但显然我错了。
答案 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$
要进行调试,请找出从中加载违规包的位置。