Java SE 9のモジュール・システムには、古いコードベースからの移行のために、二種類の特殊なモジュールが存在します。自動モジュール (automatic module) と、無名モジュール (unnamed module) のふたつです。
自動モジュールは、典型的には、モジュール・レイヤーを構成するモジュールのうち、module-info.classを持たないものです。たとえば、モジュールパス上に存在するJARファイルのうち、module-info.classを持たないものは、自動モジュールとして読み込まれます。JARのマニフェスト (META-INF/MANIFEST.MF) にAutomatic-Module-Name属性が存在する場合、その値が自動モジュールの名前となります。Automatic-Module-Name属性がない場合は、JARファイル名にしたがってモジュール名が決定されます(cf. ModuleFinder.ofのJavadoc)。 Automatic-Module-Name属性の有無は、モジュール名以外には影響がありません。
自動モジュールのアクセス権とアクセシビリティは次のように定義されています(cf. ModuleDescriptorのJavadoc)。
- 同一モジュールレイヤー上のすべてのモジュールをreadする。
- すべての無名モジュールをreadする。
- すべてのパッケージをexportする。
- すべてのパッケージをopenする。
無名モジュールは、モジュール・レイヤーに属さないモジュールです。たとえば、クラスパス上のクラスファイルは、無名モジュールに属します。
無名モジュールのアクセス権とアクセシビリティは次のように定義されています (cf. JVMS9 §5.3.6)。
- すべてのモジュールをreadする。
- すべてのパッケージをexportする。
module-info.javaでは、自動モジュールに対するrequires文を含むことはできますが、無名モジュールに対するrequires文は不可能です。したがって、たとえば、クラスパス上のクラスをコンパイル時に触ることはできません。実行時に、たとえばリフレクションを通じて触るためには、たとえばModule.addReadsを用いたアクセス権の変更が必要です。