この内容は古いバージョンです。最新バージョンを表示するには、戻るボタンを押してください。
バージョン:6
ページ更新者:guest
更新日時:2026-06-11 07:07:02

タイトル: 全体構造
SEOタイトル: Java プログラムの全体構造 (package / import / class / main / module / Maven)

この記事の要点
  • Java の最小単位は .java ファイルpackageimportclass の順で書く
  • public class 名とファイル名は完全一致必須 (Hello.javapublic class Hello)
  • 実行のエントリは public static void main(String[] args)
  • javac.class (バイトコード) → java で JVM 上に実行
  • 配布単位は jar / war / ear。Java 9+ は module-info.java でモジュール定義
  • ビルドは Maven / Gradle が標準。src/main/java, src/test/java 規約

1. ファイル単位の構造

Java のソースは .java ファイル単位で管理されます。1 ファイルの中身は必ず次の順序です。

// 1. package 宣言 (省略可、ただし実務では必ず書く)
package com.example.demo;

// 2. import 宣言
import java.util.List;
import java.util.ArrayList;
import static java.lang.Math.PI;          // static import

// 3. 型宣言 (class / interface / enum / record)
public class Hello {

    // フィールド
    private static final String GREETING = "Hello, World!";

    // メソッド
    public static void main(String[] args) {
        System.out.println(GREETING);
    }
}

2. ファイル名と public class 名のルール

public な型は 1 ファイルに 1 つだけ、かつファイル名と完全一致させる必要があります。

// Hello.java
public class Hello { }              // ✅ ファイル名と一致

// Hello.java
public class GoodBye { }            // ❌ コンパイルエラー
                                    // class GoodBye is public, should be declared
                                    // in a file named GoodBye.java

// 同じファイルに非 public クラスは複数置ける
public class Hello { }
class HelloHelper { }               // OK (package-private)
class HelloUtil { }                 // OK

3. パッケージとディレクトリ

package com.example.demoディレクトリ階層 com/example/demo/ と一致させます。これは慣習ではなく仕様です。

src/main/java/
└── com/
    └── example/
        └── demo/
            ├── Hello.java          # package com.example.demo;
            ├── GoodBye.java
            └── util/
                └── DateUtil.java   # package com.example.demo.util;

4. main メソッド: 実行エントリ

public static void main(String[] args) {
    // public  : JVM から呼べる必要がある
    // static  : インスタンス化前に呼ぶので static
    // void    : 戻り値なし
    // String[]: コマンドライン引数
    System.out.println("args.length = " + args.length);
    for (String a : args) System.out.println(a);
}

// Java 21+ では簡略版 (preview) も登場
// void main() {
//     System.out.println("simpler");
// }

5. コンパイル → 実行

# 単一ファイル
javac Hello.java        # → Hello.class が生成される
java Hello              # 実行 (拡張子なし)

# パッケージ付き
javac -d build src/main/java/com/example/demo/Hello.java
java -cp build com.example.demo.Hello

# Java 11+ は javac 不要で直接実行できる (シングルファイル)
java Hello.java

# 引数を渡す
java Hello arg1 arg2

6. classpath とは

JVM が .class ファイルや .jar を探しに行くパスのこと。複数指定はコロン (Unix) / セミコロン (Windows) 区切り。

# Unix
java -cp build:lib/commons-lang3.jar:lib/guava.jar com.example.demo.Hello

# Windows
java -cp build;lib\commons-lang3.jar;lib\guava.jar com.example.demo.Hello

# 環境変数でも指定可能 (実務では推奨しない)
export CLASSPATH=build:lib/*
java com.example.demo.Hello

7. 配布単位: JAR / WAR / EAR

形式中身用途
.jarクラス + リソース (ZIP)ライブラリ / 単体アプリ
.warWeb App (WEB-INF/web.xml 等)Tomcat 等にデプロイ
.earJAR + WAR + アプリディスクリプタJava EE アプリサーバ用 (現代では稀)
# 自作 JAR
jar cf hello.jar -C build .
jar cfe hello.jar com.example.demo.Hello -C build .   # Main-Class 指定
java -jar hello.jar

# 中身を見る
jar tf hello.jar

8. module-info.java (Java 9+)

JPMS (Java Platform Module System)。アプリやライブラリをモジュールとして宣言できます。

// src/main/java/module-info.java
module com.example.demo {
    requires java.sql;                   // 依存モジュール
    requires transitive java.logging;    // 推移的に再エクスポート
    exports com.example.demo.api;        // 公開パッケージ
    opens com.example.demo.internal      // リフレクション開放
        to spring.core;
    provides com.example.spi.Driver
        with com.example.demo.MyDriver;
}

9. ビルドツールのディレクトリ規約

Maven / Gradle の標準ディレクトリレイアウト。手動より楽なので新規プロジェクトはツール前提

my-app/
├── pom.xml or build.gradle(.kts)
├── src/
│   ├── main/
│   │   ├── java/                    # 本体コード
│   │   │   └── com/example/demo/Hello.java
│   │   └── resources/               # 設定 (application.yml 等)
│   └── test/
│       ├── java/                    # テストコード
│       │   └── com/example/demo/HelloTest.java
│       └── resources/
└── target/  or  build/              # 出力先

Maven の例



  4.0.0
  com.example
  demo
  1.0.0

  
    21
    21
  

  
    
      org.apache.commons
      commons-lang3
      3.14.0
    
  

10. Hello World を一行ずつ読み解く

package com.example.demo;          // ← 名前空間
                                   //
public class Hello {               // ← 公開クラス (ファイル名と一致)
                                   //
    public static void main(       // ← JVM が呼ぶ標準エントリ
            String[] args) {       //    args はコマンドライン引数
                                   //
        System.out.println(        // ← java.lang.System の標準出力
            "Hello, World!");      //    String リテラル
    }
}

FAQ

Q: 1 ファイルに複数の public class を置けない理由は?
A: コンパイラがファイル名から型を引けるようにするためです。非 public なら 1 ファイルに複数置けます。

Q: package を書かないとどうなる?
A: 「無名パッケージ (default package)」になります。学習用には OK ですが、他パッケージから import できないので実務では必ず書きます。

Q: module-info.java は必須?
A: 必須ではありません。書かない場合は「unnamed module」として動きます。ライブラリ配布なら書いた方が良いです。