0

Java言語仕様で何かを誤解していると確信していますが、何がわかりません。私の質問は次のとおりです。多くのシステムでは、Java はディレクトリ構造を強制的にパッケージ名と並列化します。つまり、パッケージ名が foo.bar の場合、パッケージ ファイルは foo/bar フォルダに配置する必要があります。ただし、これは Java 言語仕様の一部ではなく、オプションと見なされます。では、あるプラットフォームにこれらのルールを強制する Java の実装と、そうでない別の実装があるとしたらどうでしょうか? ファイル階層を必要とする実装は、他の実装によって使用される非構造化パッケージ内のファイルを見つけることができますか? Javaは常にすべてのクラスパスでクラスファイルを再帰的に検索しますか? もしそうなら、そもそもパッケージ名がディレクトリ構造を模倣する必要があるのはなぜですか?

編集: たとえば、one.java と two.java という 2 つの Java ファイルがあるとします。これらのファイルの先頭に「package foo.bar;」を追加します。したがって、パッケージ foo.bar のこれらのファイルにラベルを付けます。現在、ほとんどの Java 実装では、これらのファイルをファイル階層に配置して、/foo/bar/one.java と /foo/bar/two.java を作成します。ただし、JLS によると、これは必須ではありません。ここで、それらを階層に配置することを強制しない Java 実装があるとします。つまり、.jar ファイルがあり、最上位ディレクトリにコンテンツ one.java と two.java があります。さて、その .jar ファイルをファイル階層に依存してクラス ファイルを検索するシステムにロードすると、それらのクラス ファイルを見つけることができるでしょうか?

編集:少し実験した後、jar cvf foo.jar one.class two.class によって適切なディレクトリ階層なしでパッケージをセットアップし、それらを foo.bar.two としてインポートしようとすると、 foo.bar.one パッケージが指定されていても機能しません - NoClassDefFoundError が発生します。http://docs.oracle.com/javase/tutorial/java/package/managingfiles.htmlが次のように述べていることを考えると、これは私にとって非常に興味深い結果です。ただし、Java 言語仕様ではこれを要求していません。"

つまり、階層ディレクトリ構造を使用してパッケージ (ほぼすべて) を管理することを決定した Java の実装に取り​​組んでいる場合、生成された jar ファイルは、そうでない他のシステムと互換性がない可能性があることを意味します。同じ方法で実装します。Java コミュニティは慣例によりこの問題を回避しているようですが、何か追加情報があればもっと知りたいです。

4

1 に答える 1

1

しかし、そのシステムを使用してパッケージ化された jar ファイルは、ファイルシステム階層のセットアップを使用したものと互換性がありません。これは、Java がどこを見ればよいか分からないためです。

私はそれを実際の質問と見なしていますが、正しくありません。JAR ファイルはプラットフォームに依存しないエンティティであり、ZIP 形式に基づいており、プラットフォームがそうであるかどうかに関係なく、内部にディレクトリを持つことができます。

于 2013-10-01T01:54:30.023 に答える