Java開発の“当たり前”になっている MavenGradle を、初心者でも迷わず使い分けられるように図解+コピペサンプルで丁寧に解説。
依存管理ラッパー(wrapper)ビルド〜テスト〜実行Eclipse連携実行可能JAR まで、この記事1本で“動く”ところまで行きます。

内部導線: 最初のJavaプロジェクト / Eclipse × Git入門

この記事のゴールと前提

  • Maven/Gradleの役割と違いが分かる
  • プロジェクトを最小構成でビルド・テスト・実行できる
  • 依存管理の基本(スコープ/構成/推移解決)を理解する
  • Eclipseで迷わず動かせる(インポート&ビルド)
  • 小さなアプリを実行可能JARとして配布できる

前提:JDKとEclipseが導入済み(未導入なら こちら)。

MavenとGradleの違い・選び方

項目MavenGradle
設定ファイルXML(pom.xml)Kotlin/DSL(build.gradle.kts)またはGroovy
学習コスト低め(定型が多い)やや高め(柔軟で表現力が高い)
標準性強い(ライフサイクルが固定)柔軟(タスク構成を組み替えやすい)
スピード十分実用キャッシュ/並列/設定キャッシュで高速化しやすい
初学者向け◎ 最初の一歩に○ 慣れたら移行

指針:最初はMavenで“型”を身につけ、その後Gradleで表現力を手に入れるのが自然です。

ビルドのライフサイクル(図解)

compile test package verify Maven → install / deploy に続く compileJava test jar assemble Gradle → check → build に続く
最短は「コンパイル → テスト → パッケージ」。Mavenはフェーズ、Gradleはタスク単位。

ラッパー(Wrapper)とは?

「プロジェクトが使ったビルドツールのバージョン」を固定し、誰でも同じ環境でビルドできる仕組みです。mvnw/gradlew を使えば、チーム全員が同じビルドを再現できます。リポジトリにコミットしてOK(超重要)。

  • Maven Wrapper:mvn -N io.takari:maven:wrapper などで生成(プロジェクトに mvnw/mvnw.cmd が追加される)
  • Gradle Wrapper:gradle wrapper で生成(gradlew/gradlew.bat などが追加)

コピペで動かす:Maven/Gradleタブ切替サンプル

プロジェクト構成(最小)

src/
 ├─ main/java/com/example/app/Main.java
 └─ test/java/com/example/app/MainTest.java
pom.xml

pom.xml(最小構成) — まずはバージョンをプロパティでまとめ、JUnitを使ってテスト可能にします。

<project xmlns="https://maven.apache.org/POM/4.0.0"
  xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="https://maven.apache.org/POM/4.0.0
                      https://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.example</groupId>
  <artifactId>hello-mvn</artifactId>
  <version>1.0.0</version>
  <properties>
    <maven.compiler.source>21</maven.compiler.source>
    <maven.compiler.target>21</maven.compiler.target>
    <junit.jupiter.version>5.10.0</junit.jupiter.version> <!-- 適宜更新 -->
  </properties>

  <dependencies>
    <dependency>
      <groupId>org.junit.jupiter</groupId>
      <artifactId>junit-jupiter</artifactId>
      <version>${junit.jupiter.version}</version>
      <scope>test</scope>
    </dependency>
  </dependencies>

  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <version>3.2.5</version> <!-- 適宜更新 -->
        <configuration>
          <useModulePath>false</useModulePath>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>

Main.java(最小)

package com.example.app;

public class Main {
  public static void main(String[] args) {
    System.out.println("Hello, Maven!");
  }
}

MainTest.java(最小)

package com.example.app;

import static org.junit.jupiter.api.Assertions.assertEquals;
import org.junit.jupiter.api.Test;

class MainTest {
  @Test void hello() {
    assertEquals(2, 1 + 1);
  }
}
ビルド/テスト/実行(コマンド)
# ラッパーがある場合
./mvnw -q -v
./mvnw -q clean test
./mvnw -q package

# classpath指定で実行(アプリ化は後述の実行可能JARへ)
java -cp target/hello-mvn-1.0.0.jar com.example.app.Main

依存管理の基礎:スコープ/構成と落とし穴

1) スコープ/構成

  • Mavencompile(デフォルト)、provided(実行時は不要)、runtimetest など。
  • Gradleimplementation(推移依存は公開しない)、api(ライブラリ公開用)、runtimeOnlytestImplementation など。

2) 推移(transitive)依存

あるライブラリが内部で別ライブラリに依存しているケース。不要な推移依存は明示的にexcludeし、競合はバージョン調整で解決します。

Mavenで推移依存を除外する例
<dependency>
  <groupId>com.example</groupId>
  <artifactId>foo</artifactId>
  <version>1.2.3</version>
  <exclusions>
    <exclusion>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-log4j12</artifactId>
    </exclusion>
  </exclusions>
</dependency>
Gradleで推移依存を除外する例
dependencies {
  implementation("com.example:foo:1.2.3") {
    exclude(group = "org.slf4j", module = "slf4j-log4j12")
  }
}

3) バージョンの決め方

  • プロジェクトでプロパティ/バージョンカタログに集約(Maven:<properties>、Gradle:libs.versions.toml)。
  • 大幅アップデート時はまずテストをパスさせ、ランタイムとの相性を確認。

Eclipseとの連携(インポート手順)

Mavenプロジェクトをインポート

  1. File > Import… > Maven > Existing Maven Projects
  2. ルートディレクトリを選択 → pom.xml が検出される → Finish
  3. 依存は自動解決。エラーが出たら Project > Update Maven Project

Gradleプロジェクトをインポート

  1. File > Import… > Gradle > Existing Gradle Project
  2. ルートを選んで次へ → 依存同期(Buildship)
  3. エラー時は右クリック → Gradle > Refresh Gradle Project

実行は Run As > Java Application(Gradleなら applicationRun も便利)。

実行可能JARの作り方

Maven(例:シンプルなmainクラスをJAR化)

<build>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-jar-plugin</artifactId>
      <version>3.3.0</version>
      <configuration>
        <archive>
          <manifest>
            <mainClass>com.example.app.Main</mainClass>
          </manifest>
        </archive>
      </configuration>
    </plugin>
  </plugins>
</build>

java -jar target/hello-mvn-1.0.0.jar で実行可能に。外部依存を含めたい場合は「シェード(fat JAR)」プラグインを使います。

Gradle(applicationプラグインの配布物)

plugins {
  java
  application
  // fat JAR を作るなら Shadow プラグインを追加(任意)
  // id("com.github.johnrengelman.shadow") version "8.1.1"
}

application {
  mainClass.set("com.example.app.Main")
}

tasks.register<Copy>("dist") {
  dependsOn("installDist") // build/install ディレクトリへ配布物を生成
}

./gradlew installDistbuild/install/ 以下に起動スクリプト付きの配布物ができます(Windows/Mac両対応)。

よくあるエラーと対処

  • Could not resolve dependencies:一時的なネットワーク不調/レポジトリ未設定。mavenCentral()やプロキシ設定を確認し、再試行。
  • JDKミスマッチ:ソース/ターゲット(Maven)やtoolchain(Gradle)がJDKに合っているか。
  • 文字化け:Eclipseのワークスペース/コンソールをUTF-8に。Mavenは project.build.sourceEncoding をUTF-8に設定。
  • テストが走らない:JUnit 5 なら Surefire の設定(Maven)/useJUnitPlatform()(Gradle)を確認。
  • Windowsの改行(CRLF)問題:Gitの自動変換設定(core.autocrlf)とEditorの設定をチームで統一。

完了チェックリスト

  • ラッパー(mvnw/gradlew)を生成し、リポジトリにコミットした
  • 最小サンプルで build/test/run が成功した
  • 依存は プロパティ/カタログで一元管理した
  • Eclipseにインポートして実行できた
  • 配布用に 実行可能JAR/配布物 を作成した

この次に知りたい情報

FAQ

初心者はどちらから始める?

定型的で迷いにくいMavenからを推奨。Gradleは柔軟性が高い分、表現力を活かせる段階で触ると理解が速いです。

Wrapperは必ず使うべき?

はい。ビルドの再現性(CI/CDや他PC)に直結します。必ずコミットしてください。

依存競合の解決は?

Mavenは<dependencyManagement>でバージョン統一、Gradleはバージョンカタログや明示除外で調整します。

著者:まーくん|更新日:2025-08-27