CodeGym /コース /JAVA 25 SELF /Java プロジェクトの構成:src、package、classpath

Java プロジェクトの構成:src、package、classpath

JAVA 25 SELF
レベル 5 , レッスン 4
使用可能

1. フォルダ src — あなたのコードがある場所

もし Java プロジェクトが家だとしたら、src フォルダは住人(あなたのクラス)が集まる居間のようなものです。ソースコードのファイルは必ずここに置きます。プロジェクトのルートや設定用フォルダ、デスクトップなどには置きません(たとえ置きたくなっても)。

なぜソースを他のものと分けるのか?

  • src フォルダには、あなたが手で書くファイルだけを置きます:.java
  • ビルド過程で生成されるもの(例:.class ファイル、一時ファイル)は別のフォルダ(outbuildtarget など)に置かれます。
  • これによりナビゲーションが楽になり、プロジェクトがすっきりし、IDE もご機嫌になります。

シンプルなプロジェクトの構成例:

MyFirstProject/
├── .idea/           # IntelliJ IDEA の内部ファイル。触らない
├── out/             # コンパイルされた .class ファイルが生成される場所
├── src/             # ここにソースコードを置く!
│   └── Main.java
├── MyFirstProject.iml
└── README.md

重要:
あなたが自分で書くもの—クラス、パッケージ、インターフェース—はすべて src フォルダ内に置きます。画像、音楽、秘伝のレシピなどは入れないでください—それらには別のフォルダを使います。

2. パッケージ package

Java ではクラスを「パッケージ」でグループ化するのが一般的です。これはファイルシステムにおけるフォルダのようなもので、クラス用のフォルダだと思ってください。パッケージは次の役に立ちます。

  • 同じ名前のクラスが 2 つあっても、別パッケージなら衝突を避けられます(例:Main が複数あっても問題なし)。
  • コードを論理的に構造化できます(例:com.codegym.taskscom.mycompany.utils)。
  • クラスやメソッドへのアクセス制御ができます。

パッケージ宣言の構文

各 Java ファイルの冒頭(すべての importclass より前)に次の 1 行を書きます。

package com.codegym.lesson05;

これは、このファイルのクラスが com.codegym.lesson05 パッケージに属することを意味します。

重要:
ファイルシステム上のフォルダ構成はパッケージ名と一致していなければなりません。もし package com.codegym.lesson05; と書いたなら、ファイルへのパスは次のようになります。

src/com/codegym/lesson05/Main.java

IntelliJ IDEA でパッケージを作成する方法

  1. プロジェクトパネルで src フォルダを右クリックします。
  2. New → Package を選びます。
  3. 名前を入力します。例:com.codegym.lesson05(IDE が自動で入れ子のフォルダを作成します)。
  4. 次にこのパッケージ内に新しいクラスを作成します。com.codegym.lesson05 フォルダを右クリックし、New → Java Class を選んで名前を入力します。

例:

src/
└── com/
    └── codegym/
        └── lesson05/
            └── User.java

なぜすべてを単に src に突っ込んではいけないのか?

すべてのクラスをごちゃ混ぜにすると、プロジェクトはあっという間に「ゴミ山」になり、必要なファイルを見つけるのが学生寮でノートPCの充電器を探すよりも難しくなります。パッケージを使いましょう—そうすればプロジェクトの拡張、外部ライブラリの導入、チーム間でのコード分割がずっと簡単になります。

3. クラスの完全修飾名

Java の各クラスは必ず何らかのパッケージに属します。パッケージはクラスライブラリ内の「フォルダ」のようなものです。例えば:

  • System クラスは java.lang パッケージにあります。完全修飾名は java.lang.System です。
  • Scanner クラスは java.util パッケージにあります。完全修飾名は java.util.Scanner です。
  • ArrayListjava.util にあるので、完全修飾名は java.util.ArrayList です。

つまり、クラスの完全修飾名 = パッケージ名 + ドット + クラス名です。

コードで使ってみましょう。

java.util.Scanner sc = new java.util.Scanner(System.in);
String name = sc.nextLine();
System.out.println("こんにちは、" + name);

ここでは java.util.Scanner を明示しています。プログラム内に別の Scanner という名前のクラスがあっても、コンパイラはどのクラスのことかを正しく理解できます。

これはとても重要です。クラス名は同じでも構いませんが、完全修飾名は常に一意です。

完全修飾名が必要な理由

たとえば、異なる 2 つの Date クラスがあるとします。

  • java.util.Date(古い日付操作用のクラス)、
  • java.sql.Date(データベース用の日付)。

もし単に次のように書くと:

Date d = new Date();

コンパイラはどの Date を使うのか分かりません。しかし完全修飾名で書けば:

java.util.Date d1 = new java.util.Date();
java.sql.Date d2 = new java.sql.Date(System.currentTimeMillis());

— 混同は起きません。

4. import

毎回クラスの完全修飾名を書くのは不便です。そのために Java にはimport 文があります。

次のように書くと:

import java.util.Scanner;

「このプログラムでは java.util パッケージの Scanner クラスを使います」という意味になります。これ以降は次のように短く書けます。

Scanner sc = new Scanner(System.in);

コンパイラは、それが java.util.Scanner のことだと理解します。

通常の import(単一クラス)

最も一般的な方法です。特定のクラスを指定します。

import java.util.Scanner;
import java.util.ArrayList;

これで ScannerArrayList といった短い名前で書けます。

パッケージ全体の import *

同じパッケージのクラスを多数使う場合には、次のように書けます。

import java.util.*;

これは「java.util パッケージ内のすべてのクラスを完全修飾名なしで使うことを許可する」という意味です。

この場合は次のように書けます。

Scanner sc = new Scanner(System.in);
ArrayList<String> list = new ArrayList<>();

ただし重要な注意import java.util.*;java.util パッケージ内のクラスだけを対象とし、サブパッケージは含みません。例えば java.util.concurrent.ConcurrentHashMap は含まれないため、個別に import する必要があります。

import でできないこと

  • import はメソッドの中では使えません—ファイルの先頭にのみ書きます。
  • import はクラスをメモリに読み込むものではありません。コンパイラにクラスの所在を教えるだけです。
  • import は、同名のクラスが 2 つある場合に完全修飾名の代替にはなりません。

5. Classpath — Java がクラスを探す仕組み

Classpath は、プログラム実行時に Java がクラスを探す「経路」です。Java が必要な .class.java をコンパイルしたもの)を探しに行くフォルダのリストだと考えてください。

通常、IDE は自動的に src(またはコンパイル後のクラスが入るフォルダ、例:out/production/ProjectName)を classpath に追加します。つまり、com.codegym.lesson05 パッケージにクラスを書いたなら、Java は次のパスでそれを探します。

out/production/ProjectName/com/javarush/lesson05/Main.class

IntelliJ IDEA における classpath の仕組み

  • IDE からプログラムを実行すると、必要な classpath は自動的に設定されます。
  • コマンドラインから実行する場合は、フラグ -cp または -classpath で明示的に classpath を指定する必要があります。
  • プロジェクト内のクラスや追加ライブラリのクラスは、classpath に指定されたフォルダ内に存在していなければなりません。

6. プロジェクト内のコードの整理

1 クラス = 1 ファイル

Java では、各 public クラスをクラス名と同名の別ファイルに置くのが慣例です。例えばクラス名が Person なら、ファイル名は Person.java でなければなりません。

例:

src/com/javarush/lesson05/Person.java
package com.codegym.lesson05;

public class Person {
    String name;
}

ファイル名とクラス名は一致させる

クラス名が MySuperClass の場合、ファイル名は MySuperClass.java でなければなりません。これは単なる気まぐれではなく、Java コンパイラの要件です。間違えるとコンパイル時にエラーになります。

リソース(画像、テキストファイル)はどこに置く?

  • リソース用には通常、resourcesres といった専用フォルダを作成します。
  • IntelliJ IDEA では、そのフォルダを右クリックして Mark Directory as → Resources Root を選択できます。
  • Java コードは classpath 経由でこれらのファイルにアクセスできます。

構成例:

MyFirstProject/
├── src/
│   └── com/javarush/lesson05/
│       └── Main.java
├── resources/
│   └── config.txt

8. プロジェクト構成でよくあるミス

フォルダ構成とパッケージの不一致
ファイルの冒頭に package com.codegym.lesson05; と書いてあるのに、ファイルが src/Main.java に置かれていると、コンパイラは "package does not exist""class not found" といったエラーを出します。フォルダ構成がパッケージ名に対応しているか、常に確認しましょう。

ファイル名とクラス名の不一致
クラスが Person なのにファイル名が People.java だと、"class Person is public, should be declared in a file named Person.java" というエラーになります。

パッケージを更新せずにファイルを手動で移動する
ファイルを別フォルダに移動したのに、package 行の更新を忘れると、プログラムはコンパイルできません。IDE の Project ウィンドウで操作しましょう—IDE が package を自動更新してくれます!

リソースが classpath に含まれていない
ファイル(例えばテキストファイル)を resources 以外に置き、そのフォルダを Resources Root としてマークしていない場合、classpath 経由では見つけられません。

コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION