【问题标题】:Import-on-demand declaration with subpackages only仅包含子包的按需进口申报
【发布时间】:2013-08-01 21:18:25
【问题描述】:

相关: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 测试)。

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

【问题讨论】:

  • 只是学术兴趣还是有实用价值?对我来说,Eclipse 通过允许无意义的陈述表现得很愚蠢。
  • 这纯粹是出于兴趣。我实际上从不使用按需导入声明,而是更喜欢单一类型导入。
  • 您的问题是什么?你想知道如何让 Maven 编译这些类吗?你想知道JLS应该说什么吗?你想知道为什么 Eclipse 在不应该的情况下允许它吗?
  • Eclipse 不使用 javac。

标签: java eclipse maven javac jls


【解决方案1】:

我想你要找的是section7.4.3

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

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

  • 包的子包是可观察的。

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

7.5.2

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

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

【讨论】:

  • 有趣。但是,我在包parent.a 中添加了一个虚拟类,使该子包可观察,从而使parent 可通过该规则观察。而且错误是一样的。
  • 现在这听起来像是 javac 中的一个可怕的错误!
  • 找到更多细节
  • 我错了,只是重新测试,如果我在包parent.a 中添加一个虚拟类,代码实际上可以编译!我没有看 JLS 的这一部分,因为第 7.5.2 节中没有提到包的“可观察性”。我会暂时留下赏金,以防万一有另一个答案。
  • 我认为这是最好的答案,尽管下面@chrylis 删除的答案在这种情况下也很有用。 parent 在它或ab 包含编译单元(类、接口或枚举)之前是不可观察的。
猜你喜欢
  • 1970-01-01
  • 2015-10-15
  • 1970-01-01
  • 1970-01-01
  • 2017-01-06
  • 1970-01-01
  • 1970-01-01
  • 2017-11-21
  • 1970-01-01
相关资源
最近更新 更多