2025年 8月 の投稿一覧

Maven/Gradle超入門:依存管理とビルドの基礎(Java)

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

Eclipse × Git(EGit)入門:初回コミットとリモート連携を最短で理解する

Eclipse(Pleiades含む)でGitを使い始めるための最短ガイド。Share Projectから.gitignore作成、初回コミットGitHub等リモート連携ブランチ運用の基本よくあるエラー解決まで、初心者でも迷わない具体的な手順を順番に解説します。

この記事のゴールと前提

  • Eclipse上で既存/新規プロジェクトをGit管理に切り替えられる
  • .gitignoreを理解して、不要ファイルをコミットしない
  • 初回コミット→リモート連携(Push)まで完了できる
  • 基本のブランチ運用と、つまずきやすいエラー解決がわかる

前提:JDKとEclipseの導入が済んでいること。未済なら先に 導入ガイド を参照。

用語ミニ辞典(最小限)

  • Git:ソースコードの変更履歴を管理するツール(分散型)
  • リポジトリ:Gitで管理される保管庫(プロジェクトの履歴)
  • コミット:変更点のスナップショットを保存すること
  • ブランチ:開発ライン(mainとは別に機能開発用の枝を作れる)
  • リモート:オンラインの共有リポジトリ(GitHub等)。通常名「origin」
  • Push/Pull:ローカル→リモートへ送る/リモート→ローカルに取り込む

事前準備:GitとEGitの確認

  1. PCにGitが入っているか確認(任意) ターミナル/コマンドプロンプトで git --version を実行。入っていなければ公式からインストール。
  2. ユーザー情報を設定(一度だけ)
    git config --global user.name "Your Name"
    git config --global user.email "you@example.com"
    
    EGitからも設定できます(Preferences > Team > Git > Configuration)。
  3. EGit(Eclipse Gitプラグイン)の確認 Pleiades All in One なら標準同梱が多いです。メニューに Team 項目があればOK。

プロジェクトをGit管理にする(Share Project)

  1. Package Explorerで対象プロジェクトを右クリック → Team > Share Project…
  2. ウィザードでGitを選択 → Use or create repository in parent folder of project(推奨)
  3. Createを押すと、プロジェクト直上に .git が作成され、Git管理が始まります。
  4. 初回は「未追跡(Untracked)」状態。Team メニューからステージ/コミットを進めます。

複数プロジェクトを1リポジトリで管理したい場合は、親フォルダで共有する構成も可能です。

.gitignoreを作る(コピペ可)

IDEやビルド生成物をコミットすると、差分がノイズだらけになります。.gitignoreで不要ファイルを除外しましょう。以下をプロジェクトのルートに作成します。

# --- OS ---
.DS_Store
Thumbs.db

# --- Eclipse ---
.classpath
.project
.settings/

# --- IntelliJ(将来併用のため)---
.idea/
*.iml

# --- Build outputs ---
bin/
build/
out/
target/

# --- Gradle ---
.gradle/
# gradle-wrapperはバージョン固定に必須のためコミットする(ignoreしない)
# gradle/wrapper/gradle-wrapper.jar などは含める

# --- Maven ---
# mvnw, mvnw.cmd はコミットする(ラッパー)
# .mvn/wrapper 内のファイルもコミット

# --- Logs/Temp ---
*.log
tmp/

重要:Gradle/Mavenのラッパーはプロジェクトを再現可能にするためコミットします(誤って無視しない)。

初回コミットとメッセージの書き方

  1. プロジェクト右クリック → Team > Commit… を開く。
  2. 画面左側の「Unstaged Changes」から、コミットしたいファイルを選択し+で「Staged Changes」へ移動。
  3. メッセージ欄にコミットメッセージを入力し、Commit(ローカル保存)または Commit and Push(リモートへ同時送信)。

メッセージは短く具体的に。慣れたら「Conventional Commits」風にすると管理が楽です:

feat: 初期Javaプロジェクトを追加
fix: NPEになる箇所をnullチェックで修正
docs: READMEにビルド手順を追記
refactor: TaskServiceの責務を整理
chore: .gitignoreを整備

後から小さな修正を同じコミットにまとめたい時は「Amend」を使います(Commitダイアログのチェック)。

リモート連携(GitHub/GitLab/Bitbucket)

1) リモートを用意する

  1. Gitホスティング(例:GitHub)でNew repositoryを作成(READMEは未作成でOK)。
  2. 表示されたリモートURL(HTTPS or SSH)を控える。

2) EGitからリモートを設定してPush

  1. プロジェクト右クリック → Team > Remote > Push…
  2. URIにリモートURLを貼り付け。 – HTTPS:ユーザー名とパスワード/トークン(PAT) – SSH:秘密鍵(~/.ssh/id_rsa 等)を使用
  3. 「Next」で送信元(例:main)と送信先(refs/heads/main)を対応付け。
  4. Finish → 初回Pushが成功すればOK。

HTTPSとSSH、どちらを使う?

  • HTTPS:設定が簡単。GitHubではパスワードの代わりにPersonal Access Token(PAT)が一般的。資格情報はEclipseのSecure Storageに保存可能。
  • SSH:一度鍵を作ればパスワード入力なしで快適。複数リポジトリでも楽。

Pull / Fetch / Merge の違い

  • Fetch:リモートの新しい履歴を取得(ローカルには反映しない)
  • Merge:取得済みのリモート履歴を作業ブランチに取り込む
  • Pull:Fetch + Merge をまとめて実行

安全に行きたい場合は Fetch → 差分を確認 → Merge の順がオススメです。

ブランチ運用の超基本

まずは main(または master)を守り、機能ごとに feature/○○ ブランチを切って作業 → 完了後に main にマージ、が基本形です。

  1. プロジェクト右クリック → Team > Switch To > New Branch…
  2. ブラン名:feature/todo-rename など、目的が分かる名前に。
  3. 作業→コミット→Push(Team > Remote > Push)。
  4. mainへ取り込むときは、Team > Merge… を使用。競合が出たら比較ツールで解消。

小さな粒度でコミットし、マージ前にローカルで Pull(最新化) してから統合すると、コンフリクトが減ります。

よくあるエラーと対処

  • non-fast-forward(Push拒否):リモートに自分の知らない更新がある。Pullで取り込み→競合解消→再Push。
  • ユーザー情報未設定:コミット時に「user.name/email 未設定」。Preferences > Team > Git > Configuration で設定。
  • LF/CRLFの警告: Windowsは core.autocrlf=true、macOS/Linuxは input が無難。Eclipseなら Preferences > Team > Git > Configuration で設定可能。 既存プロジェクトで変更が大量発生するなら、まず合意を取ってから。
  • 巨大ファイルを誤コミット:動画・ZIP等はLFSを検討。履歴から消すには filter-repo など高度な作業が必要。
  • リモートURL間違いTeam > Remote > Push でURIを見直す。Remote > Configure Pushから編集可。
  • detached HEAD:特定コミットを直接チェックアウトした状態。Switch To > main などブランチへ戻る。
  • Eclipse固有の差分ノイズ.project/.classpath/.settings をコミットしない、またはチームで固定の設定を使う。

Eclipse便利設定(Git連携を快適に)

  • Team Decorations(ファイル状態のアイコン表示):Preferences > Team > Git > Label Decorations を有効に。
  • Compare with HEAD:ファイル右クリック → Compare With > HEAD Revision で差分確認。
  • Blame(注釈)Team > Show Revision Information で行ごとのコミッター/日時を表示。
  • Save Actions:保存時に整形・import最適化(Java > Editor > Save Actions)。Gitの差分が綺麗に。
  • 文字コード/改行General > Workspace で UTF-8、改行コードはOSに合わせるか統一ルールを決める。

セットアップ完了チェックリスト

  • Share Projectで.gitが作成された
  • .gitignoreを配置し、IDE/ビルド生成物は除外できた
  • 初回コミットを実施(README/.gitignoreなど)
  • リモート(origin)を設定し、Push成功
  • mainとは別にfeatureブランチで開発してマージできた

この次に知りたい情報

FAQ

HTTPSとSSH、どっちを選ぶべき?

最初は設定が簡単なHTTPSでOK。頻用するならSSH鍵を作り、パスワードレス運用に移行すると快適です。

.gitignoreに何を入れればいい?

Eclipseのメタ情報(.project/.classpath/.settings)とビルド生成物(target/build/bin/out)を除外。Maven/Gradleラッパーはコミット対象です。

チームで改行コードがバラバラに…

Windowsはcore.autocrlf=true、macOS/Linuxはinputが一般的。プロジェクト開始時に合意を取り、Eclipseの文字コード/改行設定も合わせます。

Pushが拒否される(non-fast-forward)

Pullして競合を解消→再Push。Fetchで差分を確認してからMergeすると安全です。

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

Eclipseで最初のJavaプロジェクトを作る(パッケージ/クラス設計の基本)

初回プロジェクトの作成から、正しいパッケージ設計・クラス分割・動作確認までをステップ形式で解説。記事のとおりに進めれば、Eclipseで「動くJavaアプリ」を作りながら、現場でも通用する設計の土台が身につきます。

本記事のゴールと前提

  • Eclipseで新規Javaプロジェクトを正しく作れる
  • 適切なパッケージ構成クラス分割で小さなアプリを組み立てられる
  • Run As > Java Application で実行して結果を確認できる

JDKやEclipseの導入がまだの方は、先に 導入記事(JDK設定まで) をご覧ください。

新規プロジェクト作成(Eclipse)

  1. File > New > Java Project を選択。
  2. Project namefirst-java-project(空白や日本語は避ける)
  3. JREUse an execution environment JRE: JavaSE-21(またはインストール済みJDK)
  4. Project layout:既定のままでOK(ソースは src
  5. Module(module-info.java)について:最初は作らないほうが簡単。もし自動作成された場合は一旦削除して構いません。
  6. Finish(初回だけ「Open Associated Perspective?」は Yes でOK)。

続けて、src を右クリック → New > Package でパッケージを作ります(次章)。

パッケージ設計の基礎(命名規則と層)

パッケージは全部小文字で、逆ドメイン形式が一般的です。個人開発や学習では com.example から始めると無難。

com.example.todo
├─ domain      (アプリの中心的なデータ構造:Taskなど)
├─ repository  (データの保存・取得:DBやメモリ)
├─ service     (業務ロジック:検証・集約・操作)
└─ app         (UI層/エントリポイント:mainメソッド)
    
  • domain:ビジネスで扱う名詞(Task, User, Order など)
  • repository:データのCRUDを隠蔽。後でDBに差し替えても他層に影響が少ない
  • service:ユースケース(「タスク追加」「完了にする」等)の手順を1か所に集約
  • app:入出力部分。今回はコンソール。将来Web/UIに変わっても他層は再利用できる

この4層に分けるだけで、コードの見通しと拡張性が大幅に上がります。

サンプルで学ぶ:コンソールToDoアプリ

最小限のToDo管理を作ります。タスクの追加/一覧/完了を、レイヤごとに役割分担して実装します。

1) domain:エンティティ(Task)

package com.example.todo.domain;

import java.time.LocalDateTime;
import java.util.Objects;

public class Task {
  private final long id;
  private String title;
  private boolean done;
  private final LocalDateTime createdAt;

  public Task(long id, String title) {
    this.id = id;
    this.title = title;
    this.done = false;
    this.createdAt = LocalDateTime.now();
  }

  public long getId() { return id; }
  public String getTitle() { return title; }
  public boolean isDone() { return done; }
  public LocalDateTime getCreatedAt() { return createdAt; }

  public void rename(String newTitle) {
    if (newTitle == null || newTitle.isBlank()) {
      throw new IllegalArgumentException("タイトルは1文字以上で入力してください。");
    }
    this.title = newTitle;
  }

  public void markDone() { this.done = true; }

  @Override
  public String toString() {
    return (done ? "[x] " : "[ ] ") + id + ": " + title + " (" + createdAt + ")";
  }

  @Override
  public boolean equals(Object o) {
    if (this == o) return true;
    if (!(o instanceof Task)) return false;
    Task task = (Task) o;
    return id == task.id;
  }

  @Override
  public int hashCode() {
    return Objects.hash(id);
  }
}

2) repository:データ取得

package com.example.todo.repository;

import com.example.todo.domain.Task;
import java.util.List;
import java.util.Optional;

public interface TaskRepository {
  Task save(Task task);
  Optional<Task> findById(long id);
  List<Task> findAll();
}
package com.example.todo.repository;

import com.example.todo.domain.Task;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;

public class InMemoryTaskRepository implements TaskRepository {
  private final Map<Long, Task> store = new ConcurrentHashMap<>();

  @Override
  public Task save(Task task) {
    store.put(task.getId(), task);
    return task;
  }

  @Override
  public Optional<Task> findById(long id) {
    return Optional.ofNullable(store.get(id));
  }

  @Override
  public List<Task> findAll() {
    List<Task> list = new ArrayList<>(store.values());
    list.sort(Comparator.comparing(Task::getCreatedAt));
    return list;
  }
}

3) service:業務ロジック

package com.example.todo.service;

import com.example.todo.domain.Task;
import com.example.todo.repository.TaskRepository;

import java.util.List;
import java.util.concurrent.atomic.AtomicLong;

public class TaskService {
  private final TaskRepository repository;
  private final AtomicLong sequence = new AtomicLong(1L);

  public TaskService(TaskRepository repository) {
    this.repository = repository;
  }

  public Task add(String title) {
    if (title == null || title.isBlank()) {
      throw new IllegalArgumentException("タイトルを入力してください。");
    }
    long id = sequence.getAndIncrement();
    Task task = new Task(id, title.trim());
    return repository.save(task);
  }

  public List<Task> list() {
    return repository.findAll();
  }

  public Task complete(long id) {
    Task task = repository.findById(id)
        .orElseThrow(() -> new IllegalArgumentException("指定IDのタスクが見つかりません: " + id));
    task.markDone();
    repository.save(task);
    return task;
  }

  public Task rename(long id, String newTitle) {
    Task task = repository.findById(id)
        .orElseThrow(() -> new IllegalArgumentException("指定IDのタスクが見つかりません: " + id));
    task.rename(newTitle);
    repository.save(task);
    return task;
  }
}

4) app:エントリポイント(Main)

package com.example.todo.app;

import com.example.todo.repository.InMemoryTaskRepository;
import com.example.todo.repository.TaskRepository;
import com.example.todo.service.TaskService;

import java.util.Scanner;

public class Main {
  private static void printHelp() {
    System.out.println("=== ToDo Commands ===");
    System.out.println(" add <title>     : タスク追加");
    System.out.println(" list             : 一覧表示");
    System.out.println(" done <id>        : 完了にする");
    System.out.println(" rename <id> <t>  : タイトル変更");
    System.out.println(" help             : コマンド一覧");
    System.out.println(" exit             : 終了");
    System.out.println("=====================");
  }

  public static void main(String[] args) {
    TaskRepository repo = new InMemoryTaskRepository();
    TaskService service = new TaskService(repo);

    try (Scanner sc = new Scanner(System.in)) {
      printHelp();
      while (true) {
        System.out.print("> ");
        String cmd = sc.next();
        switch (cmd) {
          case "add":
            String title = sc.nextLine().trim();
            System.out.println("追加: " + service.add(title));
            break;
          case "list":
            service.list().forEach(System.out::println);
            break;
          case "done":
            long id = sc.nextLong();
            System.out.println("完了: " + service.complete(id));
            break;
          case "rename":
            long rid = sc.nextLong();
            String nt = sc.nextLine().trim();
            System.out.println("変更: " + service.rename(rid, nt));
            break;
          case "help":
            printHelp();
            break;
          case "exit":
            System.out.println("Bye.");
            return;
          default:
            System.out.println("不明なコマンド。help を参照してください。");
        }
      }
    }
  }
}

5) 実行と確認

  1. Package ExplorerMain を右クリック → Run As > Java Application
  2. コンソールに > が出たら成功。以下の例を試す:
add 牛乳を買う
add 本を10ページ読む
list
done 1
rename 2 本を15ページ読む
list
exit

メモリ内リポジトリなので、Eclipseを終了するとデータは消えます。後日、ファイル保存やDBに差し替えてみましょう(repository層だけ差し替えればOK)。

設計の基本原則(最初に押さえる3点)

  1. 関心の分離(SoC):入出力(app)と業務ロジック(service)とデータアクセス(repository)を分ける。
  2. 不変条件の保持:domainのコンストラクタ/メソッドで不正な状態を拒否(例:タイトルの空文字禁止)。
  3. 依存方向は内側へ:app → service → repository → domain の一方向。下位層は上位層を参照しない。

この3つを守るだけで、クラスが巨大化しにくく、機能追加や差し替えが楽になります。

よくあるエラーと対処

  • Could not find or load main classMain のパッケージ宣言(package com.example.todo.app;)とフォルダ構成が一致しているか確認。
  • 違うJREで実行されるProject > Properties > Java Build Path → JRE System Library をJDK21に。Project FacetsCompiler のバージョンも見直し。
  • module-info.javaが邪魔:最初は削除してOK。モジュールは慣れてから。
  • 文字化けPreferences > General > Workspace > Text file encoding を UTF-8 に。コンソールも UTF-8 (必要なら VM引数に -Dfile.encoding=UTF-8)。
  • ビルドされないProject > Build Automatically を有効化。ダメなら Project > Clean…

Eclipse便利設定(最初に済ませると幸せ)

  • Save Actions:保存時に自動整形・不要import削除(Preferences > Java > Editor > Save Actions)。
  • FormatterPreferences > Java > Code Style > Formatter でプロファイル作成(チーム運用の第一歩)。
  • Organize Imports:ショートカット割当(例:Windows: Ctrl+Shift+O, Mac: ⌘⇧O)。
  • Quick FixCtrl+1 / ⌘1 で警告から即修正。

この次に知りたい情報

導入〜完成チェックリスト

  • Java Project を first-java-project で作成した
  • com.example.todo 配下に domain/repository/service/app を作成した
  • 各クラスを入力し、エラーがない(電球マークはQuick Fixで解消)
  • MainRun As で実行してコマンドが動作した
  • Save Actions / Formatter を設定してコードが自動整形される

FAQ

パッケージ名は日本語でもいい?

推奨しません。英小文字+ドット区切り(例:com.example.todo)に統一しましょう。

クラスは1ファイル1クラス?

基本は1ファイル1公開クラス(public)です。小規模の補助クラスはパッケージプライベートで同パッケージに置いてOK。

テストはどう書く?

次段のMaven/Gradle導入後に JUnit を使うのが定番です。まずは service のメソッド単位から始めましょう。

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

【保存版】Eclipseのインストール手順(JDK設定まで)Mac/Windows対応

EclipseのインストールからJDK設定、JAVA_HOME / PATHの正しい通し方まで。Mac/Windowsごとに手順を分け、つまずきポイントとチェックリストも付けました。

この記事のゴールと前提

  
  • Mac/WindowsでJDKを正しく導入し、JAVA_HOME/Pathを設定できる
  • Eclipse(Pleiades All in One)を迷わず入れられる
  • 導入直後にHello, World!を実行できる

配布元:JDKはOracle公式、Eclipseは日本語化済みのPleiades(willbrains.jp)。WindowsのJDKは Oracle Downloads から。

Mac編(JDK → 環境変数 → Eclipse)

1. JDKのインストール

  1. OracleのJDKダウンロードにアクセスし、macOSを選択。
  2. CPUに合わせてx64またはaarch64(Apple Silicon: M1/M2/M3)を選び、.dmgをダウンロード。
  3. ダウンロードした.dmgを開き、ウィザードに従ってインストール。
補足:迷ったらLTS版(例:JDK 21)を選んでおくと安定します。

2. 環境変数の設定(JAVA_HOME/PATH)

Macは標準の/usr/libexec/java_homeを使うと安全です(複数JDKの切替に強い)。

# zsh(標準)を想定
echo 'export JAVA_HOME=$(/usr/libexec/java_home -v 21)' >> ~/.zshrc
echo 'export PATH="$JAVA_HOME/bin:$PATH"' >> ~/.zshrc
source ~/.zshrc

# 確認
/usr/libexec/java_home -V
echo $JAVA_HOME
java -version
javac -version

3. Eclipse(Pleiades)導入

  1. Pleiades公式にアクセスし、Mac版をダウンロード。
  2. ダウンロードしたファイルをダブルクリックして展開し、アプリをApplicationsへドラッグ&ドロップ
  3. 初回は警告が出る場合あり。右クリック → 開くで回避。

4. 動作確認(Eclipse側)

  1. Eclipse起動 → Preferences > Java > Installed JREsでJDKを追加し、デフォルトにチェック。
  2. Java > Compilerでコンプライアンスを21に。
  3. File > New > Java Project → クラスを作成し、次のコードを実行。
public class Hello {
  public static void main(String[] args) {
    System.out.println("Hello, World!");
  }
}

Windows編(JDK → 環境変数 → Eclipse)

1. JDKのインストール

  1. Oracle Downloadsへ。
  2. Windows x64用のインストーラ(.msi / .exe)をダウンロード。
  3. 管理者権限で実行し、指示に従ってインストール。

2. 環境変数の設定(JAVA_HOME/PATH)

GUIでの設定(推奨)

  1. スタートメニューで「環境変数」と検索 → システム環境変数の編集環境変数(N)…
  2. システム環境変数新規(N)…
    変数名:JAVA_HOME
    変数値:C:\Program Files\Java\jdk-21(例。binは付けない
  3. Pathを選択 → 編集新規%JAVA_HOME%\binを追加。
  4. OKで閉じて新しいコマンドプロンプトを開く。

コマンドで一括設定(管理者)

:: JDKの場所に合わせて変更してください
setx /M JAVA_HOME "C:\Program Files\Java\jdk-21"
setx /M PATH "%PATH%;%JAVA_HOME%\bin"

確認コマンド

echo %JAVA_HOME%
java -version
javac -version

3. Eclipse(Pleiades)導入

  1. Pleiades公式Windows版をダウンロード。
  2. zipを解凍し、C:\pleiades\など日本語や空白のないパスへ配置。
  3. eclipse.exeを起動。ワークスペースはC:\workspace等の半角英数字に。

4. 動作確認(Eclipse側)

  1. Window > Preferences > Java > Installed JREsでJDKを追加し、デフォルトに。
  2. Java > Compilerでコンプライアンスを21に。
  3. Hello, World! を作成して実行(Mac編と同じ)。

よくあるトラブルと対処

  • java が見つからない:WindowsはPathに%JAVA_HOME%\binが入っているか、Macは$JAVA_HOME/binがPATHの先頭か確認。ターミナルを新しく開く。
  • Eclipseが古いJREで動くInstalled JREsのチェック先とJava Compilerを見直し。プロジェクトの「JRE System Library」も確認。
  • Apple Siliconで遅い/起動しない:aarch64版のJDK/Eclipseを使用。Rosetta経由を避ける。

この次に知りたい情報

FAQ

JAVA_HOMEはどこを指せばいい?

JDKのルートフォルダを指定します(Windows例:C:\Program Files\Java\jdk-21、Macは/usr/libexec/java_homeの出力)。binは付けません。

JDKとJREの違いは?

JREは実行環境、JDKはコンパイル含む開発環境。開発にはJDKが必要です。

Oracle以外のJDKでもよい?

はい(例:Temurin)。ただし本記事はOracle JDKを前提に記述しています。

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