我正在开发一个导入两个java库的Scala项目。通过糟糕的计划,两个java库具有相似的包名,一个在前面有com,一个没有。
问题是Scala首先在com中寻找包含com的包,并告诉我该包不存在。如果我使用包前面的com删除对库的所有引用,则编译工作。
显示一个有意义的例子:
在foo.jar,我们有一个包company.product.core
在bar.jar中我们有一个包com.company.product.other。
如果两个jar都在类路径上,则行:
import company.product.core.ClassName
失败并显示错误“value core不是com.companyname.product包的成员”如果我们删除bar.jar,编译工作正常。
Scala是否试图让我免于输入com。有没有办法告诉它只导入我告诉它的内容?
答案 0 :(得分:11)
在import语句中使用_root_
前缀。它使封装分辨率绝对。
import _root_.company.product.core.ClassName
import _root_.com.company.product.other.ClassName
引用你的评论:使用相对导入你可以做这样的事情。它基本上可以节省一些打字。
import _root_.company.product.core
import ClassAFromCore
import ClassBFromCore
答案 1 :(得分:4)
我猜你把那个导入行所在的地方属于以“com.
”开头的包,如下所示:
package com.whatever
import company.product.core.ClassName
这意味着所有com.
(包括com.company
)都是范围的一部分,因此com.company
将company
视为根,作为对象在层次结构范围内更接近那些更远的地方。
无论价值多少,Scala 2.8的规则都会略有不同。现在,如果我将我的包定义为:
package com.c.b.a
然后仅 a
将在范围内。如果我希望得到以前的行为,我需要做:
package com
package c
package b
package a