【问题标题】:Why does the scala-ide not allow multiple package definitions at the top of a file?为什么scala-ide不允许文件顶部有多个包定义?
【发布时间】:2013-10-11 03:21:47
【问题描述】:

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

示例代码sn-p如下:

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 包的测试树中有一个文件(应该在同一个包中),但顶部有重复的包语句。我没有检查测试树,因为它不应该影响主树的编译,但显然我错了。

【问题讨论】:

    标签: scala scala-ide


    【解决方案1】:

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

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

    看看这是否能避免刺激 IDE。

    【讨论】:

    • 当然你可以这样做,但问题集中在为什么 IDE 的演示编译器需要普通编译器不需要的婴儿。
    • 我正在为问题的一部分提供解决方法:“我能做些什么来解决它吗?”没用吗?
    • 您的建议确实解决了我的问题。我真的想找到一种方法来实际修复它而无需更改代码,因为仅仅为了照顾日食而不得不放入 cruft 似乎很愚蠢。
    • @coltfred 您能否在Scala IDE issue tracker 提交一张票。请确保提供可用于重现问题的独立示例。事实上,我们自己也使用嵌套包(也在 Scala IDE 代码库中),但我们从未见过您在此处报告的问题。我试图重现这个问题,但我不走运。另外,下次如果您在使用 Scala IDE 时遇到问题,我建议您停止使用 scala-ide-user ML
    • 您似乎在 util 中有一个目录 com (如错误消息所述)。嵌套导入就是这样工作的。这个com 目录可以在目标目录中,也可以在源文件夹中。我的猜测是你在源文件夹中有它,而 Sbt 没有设置源路径。
    【解决方案2】:

    这是一个常见的烦恼,让 paulp 试图解决它。他的想法是不贡献类文件的目录不应该被视为一个包。如果您可以将util 视为scala.util,则应优先于foo.util,因为该util 为空。

    util 目录是通常的嫌疑人,因为谁没有 util 目录,特别是./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$ 
    

    要进行调试,请找出有问题的包是从哪里加载的。

    【讨论】:

    • 我将我的目录称为 pUtil。我总是在所有包名的开头使用“p”。
    • 我选择了这个作为“正确”答案,因为它是问题的根源,但要注意未来的人,测试文件也会被考虑在内!
    • @coltfred 这很好。在早期,我将测试保存在一个单独的 Eclipse 项目中。使用 sbt 或 maven 范围,问题不大。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-25
    相关资源
    最近更新 更多