プログラムは,パッケージの集合で構成する。各パッケージは,型に対する名前の独自の集合をもつことで,名前の衝突を防ぐのを支援する。最上位の型は,publicと宣言した場合に限り,それを宣言しているパッケージの外部からアクセス可能とする(6.6)。パッケージの名前付けの構造は階層的とする(7.1)。パッケージのメンバは,そのパッケージのコンパイル単位内で宣言した,クラス及びインタフェース型(7.6),並びにそれ自体がコンパイル単位及び下位パッケージを含んでもよい下位パッケージとする。パッケージは,ファイルシステム(7.2.1)又はデータベース(7.2.2)に格納できる。ファイルシステムに格納するパッケージは,単純な実装がクラスをたやすく検出できるように,コンパイル単位の構成に制約をもつ。一つのパッケージは,複数のコンパイル単位で構成する(7.3)。型を自動的にインポートする。小規模なプログラム及び暫定的な開発では,パッケージに名前を付けなかったり(7.4.2),単純名を用いることもできるが,Javaコードを広く配布する場合は,一意なパッケージ名を選択することが望ましい(7.7)。これによって,二つの開発グループが偶然同じパッケージ名を使用し,それらのパッケージを後に一つのプログラムで使用する場合に発生する名前の衝突を防ぐことができる。パッケージのメンバパッケージのメンバは,下位パッケージ及び,パッケージのすべてのコンパイル単位(7.3)で宣言された,すべての最上位の(7.6)クラス(8)及び最上位のインタフェース(9)とする。Javaアプリケーションプログラムインタフェースでは,次のようになっている。utilをもつが,コンパイル単位はもたない。いう下位パッケージをもち,さらに,クラス及びインタフェース型の宣言を含む多くのコンパイル単位をもつ。下位パッケージの完全限定名とする。パッケージは,同じ名前の二つのメンバを含んではならない。なければ,コンパイル時エラーを生じる。いう名前のクラス又はインタフェース型の宣言を含むことはできない(そして含んでいない)。いう完全限定名をもつパッケージは存在できない。するパッケージは存在できない。パッケージの階層化された名前付け構造は,関係するパッケージを慣用的な形式で構成するのに便利であることを意図しているが,パッケージ内で宣言した最上位の型(7.6)と同じ単純名をもつ下位パッケージの禁止という点を除けば重要ではない。いう名前のパッケージの間にも特別なアクセス関係は存在しない。内で宣言した型に,他のパッケージ内のコードよりもアクセスしやすいということはない。各ホストは,パッケージ,コンパイル単位及び下位パッケージの生成方法及び格納方法,並びに,特定のコンパイルにおいてどのコンパイル単位が観測可能(7.3)であるかを決定する。コンパイル単位の観測可能性が,どのパッケージが観測可能であるか,及びどのパッケージが有効範囲内なのかを決定する。Javaプラットフォームの単純な処理系では,パッケージを局所的なファイルシステムに格納してもよい。他の処理系では,Javaのソースコード及び(又は)バイナリコードを,分散ファイルシステム又はデータベースの何らかの形式に格納してもよい。簡単な例として,一つのシステム上での,すべてのパッケージ,ソース及びバイトコードが,一つのディレクトリ及びその下位ディレクトリに格納されているとする。このディレクトリの各々の直下の下位ディレクトリは,最上位のパッケージ,つまり完全限定名が一つの単純名から構成されるものを示す。ディレクトリが,次に示す直下の下位ディレクトリを含むとする。アプリケーションプログラムインタフェースパッケージを含む。この規定の三人の著者が,個人使用及び小グループ内で互いの共有のために作成したパッケージを含む。パッケージに一意な名前を付けるために7.7で説明する規約を使った,会社から調達したパッケージを含んでいる。少なくとも次の下位ディレクトリを含んでいる。中を見れば,次のファイルを見つけるだろう。ファイルがコンパイルしたバイナリ形式を含む。この単純なパッケージ構成において,Javaプラットフォームの処理系によっては,パッケージ名の構成要素を連結し,ファイル名の分離子(ディレクトリ表示子)を隣接する構成要素間に挟んで,パッケージ名をパス名に変換する。次のパッケージ名,jag.scrabble.boardは,次のディレクトリ名へと変換される。jag/scrabble/boardそして,com.sun.sunsoft.DOEは次のディレクトリ名へと変換される。com/sun/sunsoft/DOEファイル名にASCII文字しか許さないシステム上でのUnicode文字のように,パッケージ名の構成要素又はクラス名が,ホストのファイルシステムでの通常のディレクトリ名では正しく出現できない文字を含むかもしれない。その文字の数値を与える4桁の16進数字を続けることで,エスケープできる。このとき次のパッケージ名children.activities.crafts.papierM\u00e2ch\u00e9は,すべてUnicode文字を使って次のように書くことができる。children.activities.crafts.papierMâchéさらに,これは次のディレクトリ名に写像される。ホストのファイルシステムで有効でない文字ならば,識別子として有効でない他の文字を代わりに用いることも可能とする。データベース内のパッケージの格納ホストシステムは,パッケージ並びにそれらのコンパイル単位及び下位パッケージを,データベース内に格納してもよい。そのようなデータベースが,ファイルに基づいた処理系におけるコンパイル単位上のオプションの制約(7.6)を強要してはならない。クラス又はインタフェースの最大数を制限する必要はない。データベースを使用するシステムは,ファイルに基づいた処理系へとエクスポートするために,プログラムをこの制約に従った形式に変換する方法を提供しなければならない。コンパイル単位CompilationUnitは,Javaプログラムの構文文法(2.3)の目標記号(2.1)とする。コンパイル単位は,次の生成規則で定義する。TypeDeclaration別のコンパイル単位で宣言した型は,循環的に相互に依存可能とする。Javaコンパイラは,それらの型すべてを同時にコンパイルするように処理しなければならない。次の三つの部分で構成される。各部分は省略してもよい。コンパイル単位が属するパッケージの完全限定名(6.7)を指定する。パッケージ宣言をもたないコンパイル単位は名前なしパッケージ(7.4.2)の一部とする。他のパッケージの型を単純名を使って参照可能とする。クラス及びインタフェース型の最上位の型宣言(7.6)どのコンパイル単位が観測可能(observable)であるかは,ホストシステムにより決定される。常に観測可能でなければならない。コンパイル単位の観測可能性はパッケージの観測可能性(7.4.3)に影響を及ぼす。型名を,自動的及び暗黙的にインポートし,それらの型の名前は単純名として使用できる。パッケージ宣言パッケージ宣言は,コンパイル単位内に出現し,そのコンパイル単位が属するパッケージを示す。コンパイル単位が属するパッケージの名前(6.2)を指定する。;パッケージ宣言内で用いるパッケージ名は,パッケージの完全限定名(6.7)でなければならない。名前なしパッケージパッケージ宣言をもたないコンパイル単位は,名前なしパッケージの一部とする。パッケージ宣言の構文は常に名前付きの最上位のパッケージへの参照を含まなければならないため,名前なしパッケージは下位パッケージをもつことができない点に注意すること。次のコンパイル単位を考える。you.");}}これは,非常に単純なコンパイル単位を,名前なしパッケージの一部として定義する。Javaプラットフォームの処理系は,少なくとも一つの名前なしパッケージを提供しなければならない。システムは複数の名前なしパッケージを提供してもよいが,これは必要とはしない。各々の名前なしパッケージ内にどのコンパイル単位が存在するかは,ホストシステムが決定する。パッケージを格納するのに階層型のファイルシステムを使用するJavaプラットフォームの処理系では,名前なしパッケージを各ディレクトリに関連付けることを典型的な方法とする。ある時点で観測可能な名前なしパッケージは一つだけ,つまり"現在の作業ディレクトリ"に関連付けられたパッケージとする。"現在の作業ディレクトリ"の正確な意味は,ホストシステムに依存する。Javaプラットフォームでは名前なしパッケージを,主として,小さな若しくは一時的なアプリケーションの開発時に,又は開発の初期段階に便利なように提供する。パッケージの宣言を含むコンパイル単位が観測可能である。パッケージの下位パッケージが観測可能である。常に観測可能であると結論付けることができる。観測可能な(7.4.3)最上位のパッケージの宣言の有効範囲は,すべての観測可能なコンパイル単位(7.3)とする。観測可能でないパッケージの宣言が有効範囲に入ることはない。下位パッケージ宣言が有効範囲に入ることはない。パッケージ宣言は決して他の宣言をおおい隠すことはない。指定した型を,一つの識別子からなる単純名(6.2)で参照できるようにする。宣言を使用せずに,他のパッケージで宣言した型を参照する唯一の方法は,その完全限定名(6.7)を使用することとする。ImportDeclaration:SingleTypeImportDeclarationTypeImportOnDemandDeclaration単一の型インポート宣言(7.5.1)は,その正準名を記述することで一つの型をインポートする。要求時の型インポート宣言(7.5.2)は,指定した型又はパッケージのすべてのアクセス可能な型を必要に応じてインポートする。単一の型インポート宣言(7.5.1)又は要求時の型インポート宣言(7.5.2)でインポートされた型の有効範囲は,インポート宣言が存在するコンパイル単位の中のすべてのクラス及びインタフェースの型宣言(7.6)とする。宣言を含むコンパイル単位内でだけ,単純名によって型を使用可能とする。宣言,並びに同じパッケージ内の他のコンパイル単位を含まない。説明的な例としては7.5.4を参照すること。正準名を与えて単一の型をインポートし,単一の型インポート宣言が存在するコンパイル単位のクラス宣言及びインタフェース宣言内で,単純名を使用可能とする。クラス又はインタフェース型の正準名でなければならない。指定した型が存在しなければ,コンパイル時エラーが発生する。指定した型はアクセス可能(6.6)でなければならない。ないときには,コンパイル時エラーが発生する。中で次の宣言をおおい隠す。いう名前の最上位の型。