6.

Java(.java/.class/.jar)完全ガイド — JVM・バイトコード・JAR の ZIP 構造・Maven/Gradle

編集
この記事の要点
  • Java は Sun Microsystems の James Gosling が 1995 年に公開。現在は Oracle が管理する静的型付け JVM 言語
  • ソース .javajavac でコンパイル → .class(JVM バイトコード) → JVM が実行
  • 配布形式の .jar は実体が ZIP アーカイブ。.class とリソースをまとめる
  • JVM(Java Virtual Machine)が OS 差異を吸収。「Write Once, Run Anywhere」が標語
  • ジェネリクスは「型消去(type erasure)」方式で、実行時には型情報が消える。List<String>List<Integer> も実行時は同じ List
  • ビルドツールは Maven(pom.xml)と Gradle(build.gradle / .kts)が二大勢力
  • Spring / Spring Boot がエンタープライズ Web の事実上の標準。Android(旧来)でも採用

概要

Java は、Sun Microsystems の James Gosling らが 1991 年に「Oak」という名前で開発を始め、1995 年 5 月 23 日に「Java」として正式公開された静的型付けオブジェクト指向言語です。Sun が 2010 年に Oracle に買収されて以降、現在は Oracle が管理しています。最大の特徴は「Write Once, Run Anywhere(一度書けばどこでも動く)」というスローガンに表れているとおり、JVM(Java Virtual Machine)上でバイトコードを実行することで OS 差異を吸収する点です。

ソースファイルの拡張子は .java、コンパイルすると .class という JVM バイトコードのファイルが生成され、JVM がこれを解釈・実行(または JIT コンパイル)します。複数の .class とリソース(画像・設定ファイルなど)をまとめた配布形式が .jar(Java ARchive)で、その実体は ZIP アーカイブです。unzip foo.jar で中身を取り出せます。Web アプリ向けには .war(Web ARchive)、エンタープライズ向けには .ear(Enterprise ARchive)もあり、これらもすべて ZIP ベースです。

Java の型システムには ジェネリクスがありますが、「型消去(type erasure)」方式で実装されています。これは List<String>List<Integer>実行時には単なる List として扱われることを意味します。後方互換性のため採用された設計ですが、new T() ができない・プリミティブ型をジェネリクスに使えないなどの制約を生んでいます。

用途は エンタープライズ Web アプリ(Spring / Spring Boot)・Android(公式は Kotlin に移行中だが既存は Java)・ビッグデータ基盤(Hadoop / Kafka / Cassandra / Elasticsearch)・金融系基幹システム など極めて幅広く、世界の Web サービスの裏側で最も多く動いている言語のひとつです。半年ごとにリリースされる現行版(OpenJDK 21 LTS, 17 LTS, 11 LTS)が広く使われています。

ファイル種類とビルド成果物

拡張子役割変換ステップ
.javaソースコード入力
.classJVM バイトコード(クラスごとに 1 ファイル)javac File.java
.jar複数 .class + リソースを ZIP 圧縮した配布形式jar cf app.jar -C target/classes .
.warWeb アプリ用 JAR(WEB-INF/web.xml 構造)Tomcat 等に配置
.earエンタープライズ JAR(EJB コンテナ用)JBoss / WildFly 等
MANIFEST.MFJAR 内のメタ情報(Main-Class など)META-INF/ 直下

ビルドフロー: Hello.javajavac Hello.javaHello.classjar cfe hello.jar Hello Hello.classjava -jar hello.jar。最終的に JVM がバイトコードを実行(JIT で機械語に変換)します。

「Hello, World」

// Hello.java
public class Hello {
    public static void main(String[] args) {
        System.out.println("Hello, World");

        // ジェネリクスの例
        java.util.List<String> names = new java.util.ArrayList<>();
        names.add("Java");
        names.add("Kotlin");
        for (String n : names) {
            System.out.println(n);
        }
    }
}
$ javac Hello.java          # Hello.class が生成される
$ java Hello                # JVM で実行
Hello, World

# JAR にまとめる
$ jar cfe hello.jar Hello Hello.class
$ java -jar hello.jar
Hello, World

パッケージ管理・ビルドツール

Java のビルドツールは長らく Apache Maven(XML ベース pom.xml)と Gradle(Groovy / Kotlin DSL)が二大勢力で、依存は Maven Central から取得します。

<!-- pom.xml (Maven) -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <version>3.2.0</version>
</dependency>
// build.gradle (Gradle / Groovy DSL)
dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web:3.2.0'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
mvn clean package         # Maven: ビルド + テスト + JAR 生成
mvn spring-boot:run       # Spring Boot 起動
gradle build              # Gradle: ビルド
gradle bootRun            # Spring Boot 起動

関連言語との比較

項目JavaKotlinC#Go
実行環境JVMJVM(および JS / Native).NET CLRネイティブ
Null 安全なし(NPE 多発)あり(String?あり(string?nil チェック必要
ジェネリクス型消去型消去(reified 例外)具象化(実行時に型保持)1.18+ 型パラメータ
記述量多い(冗長)少ない中程度少ない
Androidレガシー採用公式推奨

注意点・落とし穴

  • NullPointerException(NPE):null チェック忘れで頻発。Optional<T> や Kotlin 移行が対策。
  • 型消去によるジェネリクス制約new T()T.class が書けない。Class<T> をパラメータで渡す回避策が必要。
  • checked exception の伝染throws IOException が呼び出し元に波及し、ボイラープレートが増える。
  • JAR Hell / classpath 地獄:同名クラスが複数 JAR に存在するとロード順で挙動が変わる。モジュールシステム(JPMS, Java 9+)が対策だが普及途上。
  • 起動時間とメモリ:JVM 起動コストが大きく、CLI 用途には不向き。GraalVM Native Image で改善可。

関連リンク

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. Python(.py / .pyc)
  2. JavaScript(.js / .mjs / .cjs)
  3. TypeScript(.ts / .tsx)
  4. Go(.go)
  5. Rust(.rs)
  6. Java(.java / .class / .jar)
  7. C / C++(.c / .h / .cpp / .hpp)
  8. Ruby(.rb)
  9. Swift(.swift)
  10. Kotlin(.kt / .kts)

最近更新/作成されたページ