4

関連 :そのようなクラスがない場合、ant/javac で "import pack.*" をコンパイルするにはどうすればよいですか?

与えられたパッケージ構造があるとします

parent
|
---a
---b

パッケージには 2 つのサブパッケージと(パッケージの下にクラスはありません)parentのみが含まれます。abparent

Maven でコンパイルされたimport parent.*以外のパッケージにあるコード(つまり) は、コンパイル時エラーをスローします。エラーは次のとおりです。parentjavac

パッケージの親が存在しません

そのような場合(実際には型がインポートされないオンデマンド宣言)についてJava言語仕様を調べました。インポートオンデマンド宣言に関するJLSのパラグラフ7.5.2は、この動作を指定していないようです。

これは のバグjavacですか? コンパイル エラーを回避する方法を尋ねているわけではありません。javacJLS で必要な参照が見つからないため、エラーがスローされる理由を知りたいです。これはバグかもしれないと私に信じ込ませました。

JDK 1.4、1.6、1.7、および 1.8 でテストしましたが、エラーは同じです。

ちなみに、Eclipse では同じコードを使用してもコンパイル エラーは発生しません (Eclipse Indigo、Juno、Luna、および Mars でテスト済み)。

注: Eclipse コンパイラーのみに依存する (古い) 既存のプロジェクトを "mavenize" しているときに、この動作に遭遇しました。これがコンパイル エラーの根本的な原因であることを特定するのにしばらく時間がかかりました。

4

1 に答える 1

2

あなたが探しているのはsection7.4.3だと思います

次のいずれかの場合に限り、パッケージは監視可能です。

  • パッケージの宣言を含むコンパイル単位は監視可能です (§7.3)。

  • パッケージのサブパッケージは監視可能です。

パッケージ java、java.lang、および java.io は常に監視可能です。

そして7.5.2で

指定されたパッケージまたは型にアクセスできない場合、コンパイル時エラーになります (§6.6)。

したがって、パッケージに何も含まれていない場合、パッケージは存在せず、バグは実際には Eclipse コンパイラー側にあります。それは非常に古いバグレポートで説明されており、最終的にその状態が非推奨になり、代わりに WONT_FIX に移動されるまで「LATER」状態のままでした。修正する価値があると思われる場合は、お気軽に再度開いてください (JLS がこの領域で明確になったため)。

于 2015-08-31T15:38:36.770 に答える