2017-03-26 3 views
7

Java 9では、場合によってはパッケージの衝突が少し違って扱われるのはなぜですか?私は、Java 9で実験し、次のシナリオで探しています

実験1

  • モジュール
  • モジュールB
  • の両方が、com.fooという名前の非空のパッケージを宣言しますをエクスポートしないでください。

    java.lang.RuntimeException:モジュールBおよびモジュールの両方にパッケージcom.foo

  • 両方が「C」からメインの実行第3モジュールC

によって要求されると、ランタイムエラーを与えます

実験前と同じ2

が、この時間の両方の輸出com.foo。 Cから主実行

結果:

java.lang.module.ResolutionException:モジュールBおよびエクスポートパッケージcom.fooはC

実験3

同じ

をモジュール2としましたが、今度はモジュールcom.fooをモジュールCで宣言しました。

コンパイルエラーが発生しました: エラー:(4、1)java:モジュールCがAとBの両方からパッケージcom.fooを読み込みます

なぜコンパイル時に最初の2つのケースがキャッチされないのですか?プログラムを実行する前に解決を妨げることに気づいていない実行時プロパティがありますか?

さらに、エラーメッセージに関する限り、実験2のエラーメッセージは、実験1で与えられたエラーメッセージよりも優れています。モジュールの1つがエクスポートしないと、最終結果異なるものになります。言い換えれば、異なるエラーメッセージを生成する背後にある考慮点は何ですか?

+2

* "コンパイル時に最初の2つのケースが検出されないのはなぜですか?" *コンパイラはモジュールCで直接使用されていないパッケージの*拡張*分析を行っていないためです。 #3だけでも、コンパイラはパッケージ 'com.foo'を見ます。あなたの#2が 'com.foo'からクラスを' import'しようとすると、コンパイラはそれを取得するモジュールを見つけなければならないので、おそらくコンパイルに失敗します。 – Andreas

+1

@Andreas、それについてはわからない - すべての同じパッケージが両方のモジュールでエクスポートされた後。私は実際にシルバープレート上のコンパイラにそれを与えています:)。たとえそれがキーワードを考慮して長い連鎖であったとしても、これは計算上複雑な問題ではありません。彼らはすでに読みやすさグラフを作成しているので、すべてがそこにあります。 – Vitaliy

+1

それで、彼らは余分な(オプション)仕事をしませんでした。重要であると思う場合は、「なぜ?*」と尋ねるのではなく、あなたが強化要求を提出することをお勧めします。 – Andreas

答えて

7

実験#2と#3は分割されたパッケージの問題であり、コンパイル時と実行時の両方でエラーになるはずです。 #2の場合は、あなたの投稿から、Cをコンパイルするときにコンパイルエラーが表示されないことはありません。「モジュールCは、AとBの両方からパッケージcom.fooを読み込みます。

実験#1はおそらく、重複しているパッケージのために同じ名前空間(同じクラスローダー)にすべて住むことができないアプリケーションモジュールパス上のA、B、Cです。最近表示されたビルドでは、表示されるエラーメッセージが少し改善されています。

ここでの実験はjigsaw-devの多くのスレッドで議論されていますが、少なくともJDK 9はまだ開発中ですが、質問や経験を積むのに適しているかもしれません。

+0

ありがとうアラン。私が正しく理解すれば、私はすべての場合にコンパイルエラーを起こすはずです。 必要に応じてメーリングリストでこれを再確認して再投稿します。私はそれを考えて、私はIntellijのEAバージョンの実験を行っています。彼らは何かが欠けているかもしれないかもしれません。 – Vitaliy

+2

実験#1でコンパイルエラーが発生することはありませんが、他の2つはエラーです。 #1は、アプリケーションモジュールのパスではなく、モジュールが子レイヤにロードされるときに実行時に動作します。 –

+1

あなたは@AlanBateman自身からの答えを得たのでとても冷静です! – Eugene

関連する問題