相关:How can I compile "import pack.*" with ant/javac, when there are no such classes?
假设我们有给定的包结构
parent
|
---a
---b
包parent
只包含两个子包a
和b
(包parent
下没有类)。
代码import parent.*
位于除parent
之外的包中,使用Maven编译(即javac
)会引发编译时错误。错误是:
包父不存在
我查看了关于这种情况的Java语言规范(按需导入的声明,其中没有实际导入任何类型)。关于按需导入声明的Paragraph 7.5.2 of the JLS似乎没有指定这种行为。
这是javac
的错误吗?我不是在问如何规避编译错误。我想知道为什么javac
会抛出错误,因为我在JLS中找不到它应该引用的任何引用;让我相信这可能是一个错误。
我测试了JDK 1.4,1.6,1.7和1.8,错误是一样的。
作为旁注,Eclipse中使用相同的代码没有编译错误(使用Eclipse Indigo,Juno,Luna和Mars进行测试)。
注意:当“纯化”仅依赖于Eclipse编译器的(旧)现有项目时,我遇到了这种行为。我花了一段时间才发现这是我得到的编译错误的根本原因。
答案 0 :(得分:2)
我认为你要找的是section7.4.3
当且仅当:
时,包是可观察的
包含包的声明的编译单元是 可观察的(§7.3)。
可以观察到包裹的子包装。
java,java.lang和java.io包总是可以观察的。
并在7.5.2
如果无法访问命名包或类型,则为编译时错误(第6.6节)。
因此,如果包中没有任何内容,则它不存在,并且该错误实际上位于Eclipse编译器的一侧;它在very old bug report中被描述为处于“LATER”状态,直到最终该状态被弃用并且它被移动到WONT_FIX。如果您认为值得修复(现在JLS在此领域得到澄清),请随意重新打开它。