2011-01-26 13 views
4

次の文は不安な関数に思える:クラスは、パッケージが指定するディレクトリとは別のディレクトリにあります。

[email protected]:~/tmp> cat org/foo/Bar.java 
public class Bar { 

} 

[email protected]:~/tmp> javac org/foo/Bar.java 
[email protected]:~/tmp> javap org.foo.Bar 
Compiled from "Bar.java" 
public class org.something.Bar extends java.lang.Object{ 
    public org.something.Bar(); 
} 

バークラスファイルがorg/fooディレクトリにあり、org.somethingパッケージを宣言しますが、コンパイラは文句はありません。私は、javaがパッケージ名に続くディレクトリ階層を義務づけているという印象を受けました。私は間違っていたのですか?もしそうなら、パッケージ名を混ぜるとどうなるでしょうか?

答えて

2

純粋に慣例です。コンパイラはパッケージ名を使用します。

このように言われても、通常この慣習で打ち切るのは良い考えではありません。それは矛盾(生成されるクラスはパッケージに続くディレクトリにあります)といくつかの混乱を引き起こします!

3

ソースディレクトリ構造は、パッケージの命名に従うことを必要とされていません(それはほとんど常に慣例によってんが。)

私はなど、日/オラクルのjavacの、てjavap、Javaのを考える。ツール(と私が知っている他のすべてのJava実装)は、(デフォルトのクラスローダーと一緒に)パッケージ名ごとのサブディレクトリコンポーネントルールを強制するものです。私は権威何かを見つけることができませんでしたが、Java言語仕様の要件ではないようです。

+0

良い答えを、同様の研究のための感謝を。私の例はオラクルの 'javac'と' javap'で行われています。 –

+0

「必要」とは、これらのツールがパッケージ構成を生成し、_runtime_にそれを必要とすることを意味します。 javac/javapプログラムでは、ソースファイルを必要としません。言語(およびJVM)仕様の重要なポイントは、サブディレクトリの編成を必要としませんが、すべての標準javaツールの実装が行います。 – kaliatech

+0

また、依存クラスをコンパイルするためにコンパイル時にも必要です。 BarとBarに依存していた他のクラスをコンパイルしても、それがコンパイルされていない場合、Bar.javaが適切な場所にないとコンパイルが失敗します。 – EJP

関連する問題