4

相关:当没有这样的类时,如何使用 ant/javac 编译“import pack.*”?

假设我们有给定的包结构

parent
|
---a
---b

其中包parent只包含两个子包ab(包下没有类parent)。

import parent.*位于 以外的包中的代码parent用 Maven(即javac)编译会引发编译时错误。错误是:

包父级不存在

我查看了有关这种情况的 Java 语言规范(实际没有导入类型的按需导入声明)。JLS 关于按需进口声明的第 7.5.2 段似乎没有指定这种行为。

这是一个错误javac吗?我不是在问如何规避编译错误。我想知道为什么javac会抛出错误,因为我在 JLS 中找不到它应该的任何引用;让我相信这可能是一个错误。

我用JDK 1.4、1.6、1.7和1.8测试过,错误是一样的。

附带说明一下,在 Eclipse 中使用相同的代码没有编译错误(使用 Eclipse Indigo、Juno、Luna 和 Mars 测试)。

注意:我在“mavenizing”仅依赖 Eclipse 编译器的(旧)现有项目时遇到了这种行为。我花了一段时间才确定这是我得到的编译错误的根本原因。

4

1 回答 1

2

我认为您正在寻找的是第 7.4.3 节

一个包是可观察的当且仅当:

  • 包含包声明的编译单元是可观察的(第 7.3 节)。

  • 包的子包是可观察的。

包 java、java.lang 和 java.io 始终是可观察的。

7.5.2中

如果指定的包或类型不可访问(第 6.6 节),则为编译时错误。

因此,如果包中没有任何内容,则它不存在,并且错误实际上在 Eclipse 编译器一侧;它在一个非常古老的错误报告中进行了描述,该报告一直处于“LATER”状态,直到最终该状态被弃用,而是被移至 WONT_FIX。如果您认为值得修复,请随时重新打开它(现在 JLS 在这方面已得到澄清)

于 2015-08-31T15:38:36.770 回答