仅包含子包的按需导入声明

时间:2013-08-01 21:18:25

标签: java eclipse maven javac jls

相关:How can I compile "import pack.*" with ant/javac, when there are no such classes?

假设我们有给定的包结构

parent
|
---a
---b

parent只包含两个子包ab(包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编译器的(旧)现有项目时,我遇到了这种行为。我花了一段时间才发现这是我得到的编译错误的根本原因。

1 个答案:

答案 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在此领域得到澄清),请随意重新打开它。