今天我清理了我的 .ivy 缓存并清理了我的项目输出目标。从那时起,我在使用 SBT 运行测试或在 Scala IDE 中进行编辑时遇到了非常奇怪的行为。
鉴于以下情况:
package com.abc.rest
import com.abc.utility.IdTLabel
我会收到以下错误:
object utility is not a member of package com.abc.rest.com.abc
请注意,com.abc
它重复了两次,因此编译器在执行导入时似乎使用了当前包的上下文(也许它应该这样做,但我以前从未注意到它)。
此外,如果我尝试从包com.abc
中的任何位置com.abc.rest
(即使使用完整路径)访问包中的类,编译器也会抱怨找不到类型。
似乎只有当我尝试包含父包中的文件时才会出现错误。我觉得奇怪的是我的代码曾经可以工作。它只是在我清理了我的项目和我的常春藤缓存之后才开始发生的,所以也许更高版本的编译器比以前的版本更严格。
我很想知道我可能做错了什么,或者我可以如何解决这个问题。
更新:
通过首先导入父类,然后定义当前包,问题就消失了:
import com.abc.utility.IdTLabel
import com.abs._
package com.abc.rest {
// Define classes belonging to com.abc.rest here
}
所以这行得通,但我仍然很想知道为什么反过来工作,然后停止工作,以及我到底该如何解决它。我仔细看了看,在父包中的任何地方都找不到以 com 为名的包、对象或特征。
与工作表相关的更新:
属于同一个包的 Scala 工作表共享相同的范围,这听起来很明显,但事实并非如此。工作表不是沙盒式的——它们可以看到项目,项目也可以看到它们。因此,您在工作表文件中创建的所有“测试”对象、特征和类也将在项目的其余部分中可见。
我有这么多工作表,我什至没有试图找出问题出在哪里。我只是将它们全部移到了自己的包中,就像魔术一样,问题就消失了。
因此,今天的经验教训是:如果您在工作表内创建内容,则可以从工作表外部看到它。
无论如何,这些新发现的知识将派上用场,这意味着可以在工作表中构建、监控和调整任何“有趣”的东西,而项目的其余部分可以实际使用它。其实很酷。
sbt clean
想想一个和清理过的常春藤缓存如何设法突出以前隐藏的问题仍然很有趣,但是嘿,那是另一个故事......