2016-04-19 17 views
1

私が見たすべてのJavaプロジェクトは、パッケージ構造に従ったフォルダ構造を使用しています。これにより、ファイルが含まれていない多数のフォルダが作成されます。Javaパッケージ構造とフォルダ構造

したがって、パッケージはcom.mydomain.mysystem.myutilityで始まります。これにより、ファイルが含まれていないsrc\comsrc\com\mydomainsrc\com\mydomain\mysystemというフォルダが作成されます。ほとんどの場合、myutilityにはフォルダのみが含まれます。また、名前myutilityが含まれているプロジェクトフォルダが存在しますほとんどの

ので、完全なフォルダパスがmyutility\src\main\java\com\mydomain\mysystem\myutility\otherfolder

可能性があり、この練習は非常に一般的ですが、それは、我々はそれがどのように役に立つ思ってしまいます。これらの余分なフォルダが作成されない状況と比較した場合の利点は何ですか?たとえば、myutility\src\main\java\otherfolder

これはちょうど有効であるように見えますが、余分なナビゲーションステップをすべて節約できます。両方のアプローチでJavaソースファイルをコンパイルできます。

プロジェクトでは、通常、すべてのソースはcom\mydomain\mysystemです。これらの「空の」フォルダをすべてのプロジェクトに入れる利点は何ですか?

私はパッケージ構造の有用性に疑問を呈していません。またMavenも明らかです。

質問は、組織のリポジトリ全体で通常は同じ空のフォルダを使用する理由です。

+0

多分、この答えはいくつかの光を放つでしょう:http://stackoverflow.com/questions/1510291/eclipse-java-project-folder-organization/1510717#1510717 –

+0

あなたがそれを管理しなければならない代替あなた自身。 25年もの間、それを 'make 'と友達としました。 – EJP

答えて

2

ソース(およびクラス)ファイルは、Javaコンパイラ(および実行時環境)がそれらを見つけることができるように編成されています。

Javaコンパイラがクラスをコンパイルするとき、そのクラスが依存する各クラスのソースファイルまたはクラスファイルが必要です。クラスが存在するかどうか、すべてのメソッドが正しい引数などで呼び出されるかどうかを確認できます。また、ソースファイルがクラスファイルではなく、クラスファイルがソースファイルよりも古い場合は、使用するクラスのソースファイルをコンパイルします。

もちろん、コンパイラはクラスパスのすべてのサブフォルダやディスク全体をチェックすることもできますが、それには時間がかかります。この規約のため、コンパイラはクラスパスエントリごとに1つのサブフォルダのみをチェックする必要があります。もちろん、この問題のさまざまな解決策について考えることができますが、(当時の)Sunの人々はこれが最良の選択だと考えました。

もちろん、上記は実行時に読み込まれるクラスファイルにも適用されるため、クラスファイルも同様のフォルダ構造に格納されます。

Javaアプリケーションとライブラリは、多くの場合、ファイルシステム内で単一のファイルとして表示されるため、Jarファイル(基本的には同じフォルダ構造のZIPファイル)としてパッケージ化されることがあります。

+1

コンパイラはコンパイルすべきすべてのファイル名を与えることができます。他の多くのケースで起こります... –

+1

@JonSkeetはい、私が答えに書いたように、他の可能性があります。私は、フォルダ構造体系がコンパイルされたクラスファイルを見つけるのに理にかなっていると思っています。それで、ソースファイルには全く異なるスキームを使用しないのが理にかなっています。実際には、IDEはJavaソースファイルのフォルダ構造と他の言語のためにコンパイラに提供されるソースのリストを管理するため、重要なことはありません。 – Hoopje

0

このようにしたのは、競合を防ぎ、クラスを一意に識別できるようにするためです。つまり、2つのクラスが同じ名前を持つ場合でも、異なるインポートによってロードできます。例えば

com.google.<classname>

これを行うための最も安全な方法は、固有の性質により、あるドメイン名を使用することです。

あなたのアプローチは機能し、いくつかの空のフォルダを保存しますが、スケーラビリティはありません。

+1

これは、すべてのソースファイル(およびここで尋ねられているのはソースファイルです)に同じプレフィックスが付いている場合は、スケールがきれいです。 .NETの規約では、特定の名前空間を表すソース階層の「ルート」ディレクトリがあり、その中に「サブネームスペース」用のディレクトリが追加されています。絶対にうまく動作します。 –

+0

@Jon Skeet、興味深いことに、少なくとも私の経験から、プロジェクトはより多くのサードパーティライブラリに依存する傾向があるJavaの世界で同じアプローチがうまくいくと思いますか? – StuPointerException

+1

はい、絶対に - サードパーティ製のライブラリをソースコードと一緒に置くのは一般的ではありませんか?これはソースファイルレイアウトのパッケージ名の変更を示唆するものではないことに注意してください。サードパーティのライブラリを使用すると、なぜそれが妨げられますか? 「完全修飾名」と「ソースファイルのフォルダ階層」を区別することは非常に重要です。 –