Javaのソースファイルはpackageに対応したディレクトリ階層に置かなくても良い?
   2 min read

packageの宣言と実際のディレクトリが一致していなくてもmvn compile(やjavac)が成功するんですが、そういうもんでしたっけ?

classファイルのパッケージと実際のディレクトリーは対応させないといけないんですけど、ソースファイルについてはそういう制限は無いんですよね。でもけっこう勘違いされているような^^;

この辺の話が正当かどうか、という話です。

javac のリファレンス、 Arrangement of Source Code セクションには次のように書かれています:

In the Java language, classes and interfaces can be organized into packages, and packages can be organized into modules. javac expects that the physical arrangement of source files in directories of the file system will mirror the organization of classes into packages, and packages into modules.

Many implementations of the Java platform rely on hierarchical file systems to manage source and class files, although The Java Language Specification does not require this.

ちゃんと読んでないですが The Java® Language Specification だと 7.2. Host Support for Modules and Packages 辺りが該当するのでしょうか。

そんなわけで、(ソースファイルだけでなく)クラスファイルもディレクトリ階層とパッケージを対応付けているのは仕様に拠るものではない、ただし各種実装はそのようにファイルが配置されていることを期待しているのでそれに従いましょう、ということですね。

ソースファイルがどうでもよくてクラスファイルは従わなくてはならないのは「たまたま実装がそうなっているから」だ、ということのようです。

ちなみに java コマンドの source-file mode については、ディレクトリ階層は関係ないぜ、ってのが例から読み取れますね。