ENGINEERING NOTEBOOK / 01JAVA FILES → RUNNING APPLICATION
EclipseでHelloWorldを動かした、その次へ。

自分が書いたファイルは、
どこで、動くものになる?

いつも編集しているのは Hello.java。
けれど、実行されるまでには「変換する」「探す」「並べる」という準備があります。
一つのファイルを追いかけながら、Java開発の仕組みを学びましょう。

人が書くHello.java
コンパイル →
実行用に変換されたものHello.class
読み込む →
Javaを実行するJVM

まずは、この3つだけ。先へ進むごとに、ファイルの行き先を少しずつ増やしていきます。

この教材のゴール「動いた」で終わらず、自分の.javaが何に変わり、どこへ置かれ、誰に読み込まれるかを説明できる。
01

srcに書いたのは「材料」。動くのはclass。

Hello.javaを作った。実行されるのも、このファイル?

EclipseでHelloProjectを作り、sampleというパッケージにHelloクラスを置いたとします。今、あなたが編集しているのは、人が読んで書くためのソースコードです。

プロジェクトの中 / 編集するファイル
HelloProject/
└─ src/
   └─ sample/
      └─ Hello.java
src/sample/Hello.java
package sample;

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

この文字の並びを、Javaの実行機構が扱う形式に変換します。その作業がコンパイルです。型や文法などを確認し、ここでは Hello.class というファイルを作ります。元の.javaは消えません。

Hello.java人が書くソースコード
コンパイル →
Hello.classバイトコードという実行用の形式
通常のEclipseのJava開発では、この変換を経て実行します。.classは、拡張子だけを変えたテキストではありません。

見えていないだけで、出力フォルダーにできている

コンパイル後 / 材料と生成物は別にある
HelloProject/
├─ src/
│  └─ sample/
│     └─ Hello.java
└─ bin/
   └─ sample/
      └─ Hello.class

src:自分で編集する側

プログラムを直すときは src/sample/Hello.java を変更します。

bin:作り直してもらう側

コンパイル結果が置かれます。通常、.classを直接編集しません。sampleというパッケージの並びも引き継がれます。

binは、Javaで決まった名前ではない

Eclipseの出力先の一例です。設定次第でclassesなど別の場所になります。srcも開発用の慣例的な名前です。Eclipseのビューによっては出力フォルダーが隠されているので、Navigatorやファイル管理ソフトで実際のフォルダーを見ると確認しやすくなります。

覚えること:.javaは材料、.classはコンパイルでできる生成物。

確認資料:Eclipse Java Builder / 出力フォルダーの設定

02

実行ボタンは、classからmainを起動する。

Run As → Java Application。その後、何が起きている?

EclipseでHello.javaを右クリックし、Run As → Java Applicationを選ぶと、必要なコンパイルを済ませた上でJavaの実行環境を起動します。そこでclassを読み込んで動かす仕組みをJVM(Java仮想マシン)と呼びます。

Hello.java
変換 →
Hello.class
読み込み →
JVMmainを呼ぶ → 処理する
出力 →
Hello World
保存時の自動コンパイルがすでに済んでいれば、実行のたびにすべて作り直す必要はありません。起動前のコンパイル動作は設定にもよります。

main は、このJava Applicationの処理を始める入口です。JVMがsample.Helloのmainを起動し、その中のprintlnが文字を出します。実行ボタンを押す人、準備するEclipse、実際にclassを動かすJVMは、それぞれ役が違います。

もう一歩:Eclipseがないと動かせない?

Javaの開発キットであるJDKを使えば、端末からもコンパイルと実行ができます。JDKにはコンパイル用のjavac、起動用のjava、標準ライブラリ、JVMの実装などが含まれます。

HelloProjectフォルダーで実行する例
javac -d bin src/sample/Hello.java
java -cp bin sample.Hello

-d bin は出力先の指定です。-cp bin はclassを探す場所の指定で、次の章で説明します。JDKとPATHが設定されていることが前提です。通常のEclipse JavaプロジェクトではEclipse自身のコンパイラーを使うため、裏で必ずjavacコマンドが実行されるという意味ではありません。

ここまでの旅:srcの.java → binの.class → JVM → main。

03

他の人が作ったclassも使いたい。

Calculator.add(1, 2)を使いたい。でもCalculatorは自分で書いていない。

別の人が作った便利な処理を、自分のプログラムから呼ぶことがあります。このような再利用する部品をライブラリと呼びます。配布するclassが増えたら、ファイルを一つずつ渡すより、まとめた方が扱いやすくなります。

自分のHelloクラスのmainから呼ぶ例
// sample.Calculatorが使える状態なら
System.out.println(Calculator.add(1, 2));
// 出力:3

ここでは、同じsampleパッケージにある、publicなCalculatorクラスのstaticメソッドを使う想定です。

calculator.jar / 配られたファイルの中身の例
calculator.jar
├─ sample/
│  ├─ Calculator.class
│  └─ MathUtil.class
└─ META-INF/
   └─ MANIFEST.MF

コンパイル済みのclassや、処理に使う設定・画像などのリソースをまとめたファイルがJARです。内部にはフォルダーの並びも保存されます。ZIPを基にした形式で、通常は展開せずに利用できます。

JARをどこかに保存しただけで、Javaは見つけてくれる?

パソコン中を勝手に探すわけではありません。必要なclassを「この場所から探して」と教えます。この探す場所の一覧がclasspath(クラスパス)です。classのあるフォルダーやJARファイルなどを指定します。

bin/sample/Hello.class自分の処理
calculator.jarsample/Calculator.classなど
↓ classpathで見つけられるようにする ↓
JVMが必要なclassを読み込み、処理を実行する
コンパイラーにも、Calculatorのメソッドなどを確認するための探索場所が必要です。コンパイル時のclasspathと実行時のclasspathは、用途が別です。
探す場所は「パッケージの手前」

sample.Hello が bin/sample/Hello.class にあるなら、フォルダー側のclasspathはbinです。ライブラリ側はcalculator.jarを指定すれば、その内部のsample以下も探せます。import は名前を短く書くためのもので、JARを取得したり探索場所を追加したりする命令ではありません。

JARなら、ダブルクリックで実行できる?

すべてのJARが単体で起動できるわけではありません。ライブラリのJARと、起動するクラスなどが設定された実行可能JARは使い方が違います。ここでは部品として使うJARを扱います。

覚えること:JARは部品をまとめたファイル。classpathは部品を探す場所。

確認資料:JAR File Specification / javaのclass path

04

EclipseでJARを追加する、ということ。

Add JARsを押すと、何が変わる?

JARが見つからない状態では、EclipseはCalculatorを知らないのでエラーを出します。プロジェクトのProperties → Java Build Path → LibrariesでJARを追加すると、その中のclassも探す対象になります。

calculator.jar手元にある部品
参照を追加 →
EclipseのJava Build Path「このJARの中も探して」
利用可能に →
Calculator.add(1, 2)
操作選ぶ場所何をする?
Add JARsEclipseのプロジェクトなど、ワークスペース内選択したJARをビルドパスへ登録する
Add External JARsワークスペース外のファイルシステム外部の場所にあるJARを参照する

パソコン全体にライブラリを「インストール」する操作ではありません。通常のJava Applicationでは、プロジェクトの情報を基に実行時のclasspathも組み立てられます。ただし実行構成で変更できるため、コンパイルできることと、実行時にも見つかることは別に確認します。

.classpathというファイルを見かけたら

Eclipseがソースフォルダー、出力先、ライブラリなどを管理するためのプロジェクト設定です。JavaやJVMが直接読む「共通の設定ファイル」ではありません。今はXMLの中身を覚える必要はありません。

手を動かして確かめるなら

教材やチームから受け取ったcalculator.jarを、プロジェクトのlibなどに置いて追加します。追加前後でCalculatorへのエラー表示が変わるか見てください。この教材には実際のcalculator.jarは同梱していません。名前と中身は説明用の例です。

ここまでで、普通のJavaの仕組みが揃いました。
自分のclassと必要なJARを見つけられるようにして、JVMでmainを起動します。

確認資料:Eclipse Java Build Path / Libraries

05

Webでは、自分のmainを直接起動しない。

ブラウザーから呼ばれるServletには、なぜmainがない?

これまでのJava Applicationでは、mainが処理の入口でした。Webアプリでは、起動して待っているTomcatが、ブラウザーからのリクエストに応じて自分の処理を呼びます。その呼び出されるJavaの部品がServletです。

普通のJava Application
javaコマンドなどで起動
↓ JVM上で
main()
↓
自分の処理 → 端末などに出力
Web Application
Browser
↓ HTTPリクエスト
Tomcat起動して要求を待つ
↓ 対応する処理を呼ぶ
Servlet → 自分の処理

HTTPはブラウザーとサーバーが要求・応答をやり取りするための決まりです。Tomcatは、どのURLをどのServletに担当させるかを知り、Servletの作成・呼び出しなどを管理します。この役割からServletコンテナ/Webコンテナと呼ばれます。

JVM / Javaのclassを実行する
Tomcatが動く
HelloServletの処理も、そのJVM上で動く

Tomcat自身もJavaのプログラムです。TomcatがServletを管理し、実際のclassの実行はJVMが担います。自分のServletにmainを書かなくてもよいのは、Tomcatという呼び出し役がいるからです。

コードで見る:URLとServletの結び付き
HelloServlet.java / Jakarta Servlet APIを使う例
package com.example;

import java.io.IOException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request,
                         HttpServletResponse response)
            throws IOException {
        response.setContentType("text/plain; charset=UTF-8");
        response.getWriter().println("Hello from Web!");
    }
}

@WebServlet("/hello") は、このアプリ内の/helloを担当するという登録情報です。GETリクエストを受けたTomcatの仕組みから、最終的にdoGetが呼ばれます。mainはありません。コンパイルには対応するServlet API、実行には互換性のあるTomcatと配置設定が必要です。

覚えること:mainから始まる処理と、リクエストを受けて呼ばれる処理は、入口が違う。

06

Tomcatにも、ファイルを探す場所がある。

HelloServlet.classは、どのフォルダーに置けばよい?

適当な場所に置けば見つかるわけではありません。Webアプリには、Servlet仕様で定められた配置のルールがあります。まずは「Tomcatへ配置する一つのWebアプリ」の完成形を見てください。開発中のプロジェクトとは区別します。

完成形 / Tomcatが読むWebアプリのルートから見た構造
MyWebApp/
├─ index.html                          ← 画面の資材
├─ index.jsp
├─ css/style.css
├─ js/app.js
├─ images/logo.png
└─ WEB-INF/                            ← アプリ内部の領域
   ├─ classes/
   │  └─ com/example/HelloServlet.class
   ├─ lib/
   │  ├─ library-a.jar
   │  └─ library-b.jar
   └─ web.xml                          ← 必要な構成で使う設定
場所・ファイル入るもの誰が使う?
ルート側のHTML / CSS / JS / 画像ブラウザーへ返す画面の資材Tomcatから配信され、ブラウザーが表示・処理する
JSPサーバー側で応答を作るためのページTomcat側でServletに変換・コンパイルされて処理される。JSPソースをそのままブラウザーが実行するわけではない
WEB-INF/class・JAR・設定などの内部用ファイル基本的にブラウザーからURLで直接取得する場所ではない
WEB-INF/classes/この例では、自分で作ったServletや補助クラスのclass。関連リソースも置けるTomcatのアプリ用クラス読み込み機構が探す
WEB-INF/lib/このアプリに同梱するライブラリJARJARの中のclassも、アプリから使えるように読み込む
WEB-INF/web.xmlServletの登録やURLの対応などの設定Tomcatが読む。アノテーションで登録する場合などは省略できる
フォルダー名には意味がある

WEB-INF/classesとWEB-INF/libは、アプリのclassとJARを探すための決まった場所です。通常のJavaでclasspathを指定した話とつながります。

パッケージの並びを保つ

com.example.HelloServlet なら、classesの下は com/example/HelloServlet.class です。classes直下へ名前だけ同じclassを置けばよいわけではありません。

ServletへのURLは、classの物理パスではなく登録した対応関係で決まります。たとえばアプリのURLの先頭が /MyWebApp、Servletの登録が /hello なら、アクセス先は /MyWebApp/hello です。

補足:すべてのJARをWEB-INF/libへ入れる?

この場所に入れるのは、アプリが持参する必要のあるJARです。Tomcatが提供するServlet APIなどは通常、アプリへ重複して同梱しません。classをJARにまとめてlib側に置く構成もありますが、最初は「自分のclassはclasses、同梱ライブラリはlib」という例で理解しましょう。

確認資料:Jakarta Servlet 6.1 §10.5・§10.13 / Tomcatの配置構造

07

開発中の場所と、実行時の場所をつなぐ。

srcには.javaがある。でもTomcatが探すのはWEB-INF/classes。どうつながる?

ここで、一つのWebアプリの材料がある側と完成形の側を並べます。WebContent は、この例でWeb用資材を集める開発用フォルダーの名前です。その中身が、完成形のルートへ入ります。

開発中 / MyWebProject
MyWebProject/
├─ src/
│  └─ com/example/HelloServlet.java
├─ lib/
│  └─ library.jar
└─ WebContent/
   ├─ index.jsp
   └─ WEB-INF/
完成形 / Tomcatへ配置するアプリ
MyWebApp/
├─ index.jsp
└─ WEB-INF/
   ├─ classes/
   │  └─ com/example/HelloServlet.class
   └─ lib/
      └─ library.jar

左のlibは説明用に選んだ保管場所で、自動的に配置されるという意味ではありません。どの資材をどこへ入れるか、対応付けが必要です。

FILE TRACKER / ファイルを選んで追いかける

このファイルは、最終的にどこへ行く?

配置の概念図
開発中 / 入力何をする?完成形 / 配置先
src/com/example/HelloServlet.java
コンパイルして配置→
WEB-INF/classes/com/example/HelloServlet.class
lib/library.jar
JARのまま配置→
WEB-INF/lib/library.jar
WebContent/index.jsp
ルートへ配置→
index.jspアプリの /index.jsp

Javaソースは、classへ変わってから配置される。

.javaをそのまま運ぶのではありません。まずコンパイル先にclassを作り、そのclassをWEB-INF/classes以下へ反映します。

src/…/HelloServlet.java→ コンパイル →出力先/…/HelloServlet.class→ 配置 →WEB-INF/classes/…/HelloServlet.class
srcは、Tomcatが直接実行する場所ではない。

srcは開発者の材料置き場です。コンパイル先のclassを、Webアプリのルールに合わせて配置します。作業用の出力先を経由するため、srcからWEB-INF/classesへ一度に変換するとは限りません。

図に増えたもの:classの変換先 + JARの配置先 + Web資材の配置先。

08

Web用のプロジェクトは、材料と配置先を管理する。

普通のJava Projectと、フォルダーの見え方が違うのはなぜ?

WebアプリではJavaソースだけでなく、JSPや画像もまとめて扱います。そして、完成形ではそれぞれ行き先が違います。その関係をEclipseで管理するためのプロジェクトがDynamic Web Projectです。

普通のJava Projectの一例
HelloProject/
├─ src/             ← Javaソース
└─ bin/             ← class出力

自分のmainを起動するためのソース、ライブラリ、出力先を管理します。

Dynamic Web Projectの一例
MyWebProject/
├─ src/             ← Javaソース
├─ build/classes/   ← class出力の例
└─ WebContent/      ← Web資材
   ├─ index.jsp
   └─ WEB-INF/

さらに、Webアプリとして配置するための対応関係やサーバーとの関係も管理します。

Dynamic Web Projectは、Javaソース・Web資材・配置先との対応を持つ開発用のまとまりです。フォルダーを分ける理由は、classへ変換する材料と、そのままWeb資材として配置する材料を区別するためです。

この開発用フォルダー名は、Java言語の決まりではない

src、WebContent、build/classesは一例です。Eclipseの版、作成方法、設定で変わります。Web資材フォルダーやコンパイル出力先は変更可能です。一方、完成したWebアプリのWEB-INF/classesやWEB-INF/libには、前章の配置ルールがあります。

たとえばWebContentを別名にしても、対応を正しく設定すれば同じ完成形を作れます。Eclipseで見えるプロジェクト全体を、そのままTomcatへコピーするわけではありません。

確認資料:Eclipse Dynamic Web projects(構造の説明を参照。画面の既定値は版・設定で異なります)

09

誰がclassを作り、配置してくれる?

Run on Serverを押すと動く。Eclipseは、どうやってTomcatを操作している?

まず、Eclipseを使わずに動かすなら

Tomcatは独立したWebコンテナです。Javaの実行環境とTomcat本体を用意すれば、Eclipseを起動せずにWebアプリを動かせます。ここでは、準備してから起動する流れを見ます。

自分で準備する場合 / 配置済みのアプリをTomcatが読む
MyWebApp/
├─ index.jsp
└─ WEB-INF/
   ├─ classes/
   │  └─ com/example/HelloServlet.class
   └─ lib/library.jar
Webアプリを用意する
↓ Tomcatが読み込める場所へ配置
Tomcatを起動する
↓ ブラウザーからアクセスする
Browser ⇄ TomcatHTTPリクエスト → / ← HTTPレスポンス
配置先はサーバー設定によります。単体利用では、Tomcatのwebapps以下へ配置する方法などがあります。

Run on Serverは、この準備と操作をまとめて支援する

まずEclipseのJava機能がソースをコンパイルします。次に、その出力とWeb資材を、Tomcatが読める構成へ配置します。Eclipseでこの配置やサーバー起動を支援する仕組みの一つが、WTP(Web Tools Platform)です。

開発中のJavaソースsrc/com/example/HelloServlet.java
開発中のWeb資材WebContent/index.jsp
↓ 変換・配置の役割を分ける ↓
EclipseのJava機能コンパイル → HelloServlet.class
WTPの配置・サーバー連携出力classと資材を対応する場所へ反映
↓ 配置されたWebアプリ ↓
WEB-INF/classes/com/example/HelloServlet.class
index.jsp + WEB-INF/lib内のJAR
WTP自体をJavaコンパイラーと思わないこと。通常のJavaコンパイルはEclipseのJava機能、Webアプリの組み立て・公開・サーバー連携はWTP側が支援します。

Deployment Assemblyは「材料 → 行き先」の対応表

プロジェクトのPropertiesで見かけるDeployment Assemblyは、どのフォルダーやライブラリを、完成形のどこへ配置するかを管理する設定です。

開発側の材料配置先(アプリ内)実際に入るもの
src のJavaソース/WEB-INF/classes.javaそのものではなく、対応するコンパイル出力のclass
WebContent/フォルダーの中身。index.jspはルートのindex.jspへ
同梱するライブラリJAR/WEB-INF/libJARファイルをそのまま

説明用の対応例です。表示されるエントリーや初期設定は構成で異なります。Java Build PathにJARを加えることと、Webアプリへ同梱することは同じではありません。

操作を伝える経路 / 箱は役割の区別です
開発者 → Run on Server
↓ Eclipseの操作を通して
Eclipse
WTP / Server ToolsWeb開発とサーバー連携を支援する機能
↓ Tomcat向けの方法で操作
Tomcat用 Server Adapter起動・停止・PublishなどをTomcatへつなぐ
↓ 配置・起動などを支援
TomcatJVM上で動き、WebアプリへのHTTPリクエストを受け付ける
↑ HTTPリクエスト / ↓ HTTPレスポンス
Browser
Eclipse ≠ Tomcat。Run on ServerというボタンそのものがTomcatではない。

Eclipseは準備と操作を支援する側、Tomcatは要求を受けてServletなどを呼び出す側です。実際のclassはJVM上で動きます。Server ToolsはWTPの一部であり、図の箱を別々のサーバーとして動かすわけではありません。

「Tomcatプラグイン」と呼ばれていたら

Tomcat連携をまとめてそう呼ぶ場合もあります。この教材では、標準的なEclipseのWeb開発環境にあるWTPのServer Tools + Tomcat用Server Adapterを指して説明します。既存環境には別のTomcat向けプラグインもあるため、一語だけで同じ仕組みと決めつけず、使っている機能を確認します。

Tomcatを登録する=「PC上のどのTomcatを使うか」を教える

Tomcat本体をPCへ用意した後、その場所をEclipseへ登録します。これはTomcatをEclipseの中へインストールする操作ではありません。すでにあるインストール先を参照する設定です。

  1. Windows版の英語UIでは、Window → Preferences → Server → Runtime Environmentsを開く。
  2. Add → Apacheから、用意したTomcatの版に対応する項目を選び、Nextへ進む。
  3. Tomcat installation directoryに、Tomcatを展開したフォルダーを指定する。画面で求められるJava実行環境も確認して、Finishで登録する。

メニューと登録先フィールドは公式ヘルプで確認。選択できるTomcatの版・画面の項目は、導入済みのアダプターやEclipseの版で異なります。公式ヘルプ内の古いTomcat一覧を、現在の対応一覧として使わないでください。

同じPC上 / 実際のインストール先と、それを指す設定
実体 / Apache Tomcat
C:\apache-tomcat-xx\
├─ bin/
├─ conf/
├─ lib/
├─ logs/
├─ webapps/
└─ …
EclipseのServer Runtime登録名:利用するTomcat
場所:C:\apache-tomcat-xx
← この場所のTomcatを使う

xxは版を省略した説明用の表記です。自分が用意した実際のパスを指定します。logsなど一部のフォルダーは利用状況で作られます。

SERVER RUNTIME

どのTomcatを使う?

インストール先や種類・版など、Eclipseへ登録した利用する実体の情報です。

SERVER ADAPTER

どう操作する?

その種類のサーバーをEclipseから操作する橋渡しの機能です。サーバーごとの起動・停止・配置方法の違いを扱います。

もう一歩:Runtimeの登録と、Serversビューのサーバーは同じ?

Runtimeは本体の場所などの定義です。Serversビューのサーバーは、そのRuntimeを使い、起動方法や配置するプロジェクトなどを管理する設定です。登録ウィザードでローカルサーバーも一緒に作る構成がありますが、Runtimeを登録しただけでアプリが配置・起動されるわけではありません。

プロジェクトで対象Runtimeを使う設定は、Servlet APIなど、そのサーバーが提供するAPIをEclipseが参照することにも関係します。APIをコンパイル時に参照できることと、アプリへJARを同梱することは区別します。

確認資料:Adding the Apache Tomcat runtimes / Server runtime environments preferences

画面の名前が、何のためにあるか

名前この場面での意味
Dynamic Web ProjectJavaとWeb資材、配置の関係を持つプロジェクト
Server Runtime利用するTomcat本体やJava実行環境などの定義。コードを書くときに参照するAPIにも関係する
Server AdapterTomcatなど、サーバーごとの起動・停止・配置方法をEclipseへつなぐ機能
Project Facetsそのプロジェクトで使うJavaやWebの機能・版を表す設定
Deployment Assembly開発側の資材と、Webアプリ内の配置先との対応
Publish変更したclassやWeb資材を、サーバーが使う配置へ反映する処理
Run on Server対象サーバーへの配置・起動などをまとめて支援する操作

Serversビューは、サーバーの操作と状態を見る場所

登録したサーバーと、それに追加したWebプロジェクトを一覧で扱います。対象のサーバーを選び、ツールバーや右クリックメニューから操作します。

Serversビューの表示を簡略化した例 / 実際の表示名や状態は環境による
Servers
└─ Tomcat v10.x Server at localhost  [Started]
   └─ MyWebProject
操作何が起きる?
Start選んだサーバー設定でTomcatを起動する。
StopそのTomcatを停止する。
RestartそのTomcatを停止して、起動し直す。
Add and Removeこのサーバーで動かすWebプロジェクトを追加・解除する。プロジェクト自体を削除する操作ではない。
Publish追加したプロジェクトの最新のclassやWeb資材などを、Tomcatが利用する配置へ反映する。

Startedは「サーバーが起動している」という状態です。編集したすべての変更が反映されたという意味ではありません。サーバーの起動状態と、アプリの同期・Publishの状態を分けて見ます。

確認資料:Servers view

保存 → コンパイル → Publish → Tomcatで実行

ファイルを直してから画面に結果が出るまでを、4段階に分けます。自動処理で続けて起きる場合でも、それぞれ更新する対象が違います。

01 / 保存

材料を更新

エディターで直した内容を、.javaファイルへ保存する。

02 / コンパイル

classを更新

EclipseのJava機能が、保存したソースから.classを作る。

03 / Publish

配置へ反映

出力classやWeb資材を、Tomcatが読む構成へ反映する。

04 / 実行

要求に応える

Tomcatがアプリを読み込み、HTTP要求に対応する処理を呼ぶ。

Javaの変更 / コンパイル出力を経由してPublishする
保存したソースsrc/com/example/
HelloServlet.java
コンパイル →
作業中の出力build/classes/com/example/
HelloServlet.class
Publish →
Tomcatが読むアプリWEB-INF/classes/com/example/
HelloServlet.class
build/classesはこのプロジェクトの出力先の例です。パッケージ階層を保ち、.javaではなくコンパイル結果を反映します。
JSPの変更 / Web資材は、その中身を配置する
WebContent/index.jsp保存したWeb資材
Publish →
Webアプリのルート / index.jsp配置後、Tomcat側でServletへの変換・コンパイルと処理が行われる
保存しただけで、必ずブラウザーへ反映されるわけではない

自動コンパイルや自動Publishが有効なら、設定されたタイミングで後続の処理が進みます。手動なら、それぞれ必要な操作を行います。Publishはコンパイルそのものではなく、インターネットへの一般公開という意味でもありません。

変更を配置した後、Tomcat側でアプリの再読み込みや再起動が必要な場合もあります。Publish完了と、実行中の処理が新しいclassへ切り替わったことは区別します。

確認資料:Publishing your application

Tomcat本体のwebappsに、アプリが見当たらない?

Eclipse / WTPでは、本体とは別に管理するTomcat用の作業ディレクトリへ配置することがあります。本体のwebappsにないことだけで、Publishされていないとは判断できません。

本体と作業ディレクトリを分ける構成の例
Tomcat本体C:\apache-tomcat-xx
↑ Runtimeでこの本体を指定して利用
Eclipse / WTPTomcat用Server Adapterを通じて起動・配置を支援
↓ Publish
Eclipseが管理するTomcat用の作業ディレクトリサーバー設定と、配置したWebアプリ
↓ 起動したTomcatがこの設定・配置先を使う
Tomcatがアプリを読み込んで実行する
物理パスはEclipseやサーバー設定で異なります。Tomcatが別の場所へインストールし直される、という図ではありません。

配置先を確かめるときは、Serversビューの対象サーバーを開き、Server Locationsなどの設定を確認します。項目名・利用できる設定は版や構成で異なります。大切なのは、実際に起動したTomcatが参照する配置先を見ることです。

確認資料:WTP Tomcat FAQ(旧版を対象とする資料。インストール先と作業場所を分ける仕組みを参照)

変更が見えないときは、ファイルの旅を順にたどる

覚えた仕組みを使うと、確認する場所も分かります。これは原因をすべて網羅する診断表ではなく、「どの段階まで進んだか」を考えるための順番です。

  1. HelloServlet.javaは保存した?変更がエディターの中だけに残っていないか。
  2. .classは更新された?コンパイルエラーがなく、出力先に新しいclassができたか。
  3. Publishされた?対象サーバーの配置へ反映されたか。必要な再読み込みも確認する。
  4. Tomcatは起動している?Serversビューで、目的のサーバーの状態を見る。
  5. 正しいWebアプリを追加している?Add and Removeで対応付けたプロジェクトを確かめる。
  6. 正しいURLへアクセスしている?接続先・ポート・アプリのパス・ServletのURL対応を確かめる。

Run on Serverの内側を、一枚につなぐ

材料・準備する機能・配置されたアプリ・実行するサーバーを分けて読む
開発側 / 保存した材料src/com/example/HelloServlet.java
WebContent/index.jsp + 同梱するlibrary.jar
↓ Run on Serverなどの操作で準備を進める
Eclipse
Java機能:.java → .classコンパイル出力を作る
↓ 出力classとWeb資材を扱う
WTP / Webプロジェクト管理・Deployment Assembly
Server Tools + Tomcat用Server AdapterPublishで配置を反映 / Tomcatの起動・停止などを支援
↓ Publish:対応表に従って反映
Tomcatが利用するWebアプリ
index.jsp
WEB-INF/
├─ classes/com/example/HelloServlet.class
└─ lib/library.jar
↓ 起動・再読み込みしたTomcatが利用
JVM上のTomcatURLに対応するServletを呼び出す
↑ HTTPリクエスト / ↓ HTTPレスポンス
Browser
名前この問いに答える
Server RuntimeどのTomcatを使う?
Server AdapterEclipseからTomcatをどう操作する?
Deployment Assembly何を、どこへ置く?
Publishその配置を、実際に反映する。

4段階で説明しよう:保存 → EclipseのJava機能でコンパイル → WTPでPublish → Tomcatで実行。

覚えること:Java Build Pathは「探す場所」、Deployment Assemblyは「配置する先」。

確認資料:WTP Deployment Assemblyの概要 / Testing and publishing

10

Webアプリを、一つのファイルに包む。

完成したフォルダー一式を、配りやすくするには?

Tomcatには、展開されたWebアプリのフォルダーを配置する方法もあります。しかし配布時にファイルを一つずつ渡すと、抜けや置き間違いが起きます。そこで、Webアプリの配置構造を保ったまま、一つにまとめたファイルを使います。これがWAR(Web Application Archive)です。

フォルダーで持つ
MyWebApp/
├─ index.jsp
└─ WEB-INF/
   ├─ classes/
   │  └─ com/example/HelloServlet.class
   └─ lib/
      └─ library.jar
同じ構造を一つにまとめる
MyWebApp.war
├─ index.jsp
└─ WEB-INF/
   ├─ classes/
   │  └─ com/example/HelloServlet.class
   └─ lib/
      └─ library.jar
フォルダーの中身をまとめる → WAR / WARを展開する → 同じ配置構造

WARの内部のルートはindex.jspやWEB-INFです。通常、外側のMyWebAppフォルダーまで一段余計に包む構成にはしません。また、JARのファイル名を.warへ変えればよいわけではありません。中身がWebアプリのルールに合っている必要があります。

形式何をまとめる?この教材での例
JARJavaのclassやリソースなどcalculator.jar:他のプログラムが使う部品
WARWebアプリのclass、同梱JAR、Web資材、設定を、決まった配置構造でまとめるMyWebApp.war:Tomcatへ渡すWebアプリ一式
class
依存JAR
JSP / CSSなど
↓ 配置構造を保ってまとめる ↓
MyWebApp.war
↓ Tomcatへデプロイ(使える場所に配置) ↓
Tomcatがアプリを読み込み、リクエストを処理する
WARを作ることと、Tomcatで動かすことは別

配布物を作っただけではサーバーは起動しません。配置・読み込み・起動の段階が必要です。TomcatがWARを展開するかどうか等は設定によります。開発時はWTPが展開構造を反映し、毎回WARを作らずに試す構成もあります。

図に増えたもの:そろえたWebアプリの構造 → WAR → Tomcat。

確認資料:Servlet 6.1 §10.6 / Jakarta EE Tutorial / Packaging

11

これを毎回、人間が全部やるの?

ここまでに必要だった作業を振り返ります。Javaソースを書いた後にも、完成したWebアプリへたどり着くまでには、多くの準備があります。

01 / 変換する

.java → .class

ソースをコンパイルし、作られたclassを正しい場所へ並べる。

02 / 部品を集める

必要なJARを用意

アプリに同梱するライブラリを集め、WEB-INF/libへ入れる。

03 / 資材をそろえる

JSP / HTML / CSS

Web資材を集め、アプリのルート以下へ配置する。

04 / まとめる

完成形をWARへ

配置構造を確認し、一つのファイルにまとめる。

変更するたびに、コピーと変換を全部やり直す?

このように、材料から利用・配布できる成果物を作る一連の作業をビルドと呼びます。コンパイルはその一部です。テストで動きを確かめる作業なども組み合わせられます。

そして、この手順を定義して自動で実行する道具が、MavenやGradleなどのビルドツールです。「classにする・必要なJARを用意する・配置構造を組み立てる・テストする・JARやWARを作る」を、人間の繰り返し作業から引き受けます。

材料ソース・Web資材・依存関係の指定
→
Maven / Gradle決めておいた工程を自動化
→
成果物JAR / WARなど
「全部を勝手にやる」わけではない

どの機能を使うか、どのJARが必要か、何をテストするかは設定します。Web用の機能を使えばWARを作れますが、その生成とTomcatへの配置・起動は別の処理です。

覚えること:ビルドは完成形を作る工程。Maven/Gradleは、その工程を自動化する道具。

12

材料の置き方が変わっても、行き先は同じ。

今度はsrc/main/java? WebContentはどこへ行った?

作業を自動化しやすくするために、ビルドツールには「材料をここへ置こう」という標準的な約束があります。MavenやGradleのJava/Web向け機能では、次のような構成がよく使われます。

開発中 / 標準的なJava Webプロジェクトの材料
MyWebProject/
└─ src/
   └─ main/
      ├─ java/
      │  └─ com/example/HelloServlet.java
      ├─ resources/
      │  └─ app.properties
      └─ webapp/
         ├─ index.jsp
         ├─ css/style.css
         └─ WEB-INF/
開発用の場所材料の種類標準構成のWAR内の行き先
src/main/javaJavaソースコンパイルされたclassが WEB-INF/classes 以下へ
src/main/resourcesJavaの処理が読む設定など中身が WEB-INF/classes 以下へ。通常はclassへ変換しない
src/main/webappJSP、HTML、CSSなどのWeb資材中身がWARのルートへ。webappという外側の階層は付けない
定義した依存ライブラリアプリが使うJAR同梱対象が WEB-INF/lib へ。サーバー提供APIなどは除く
FILE TRACKER / 後半で図を広げる

材料の場所・途中の出力先・WARの中身

標準設定の概念図

一覧は「最終的にどこへ入る?」、下の詳細は「途中でどこを通る?」を示します。完成WAR内部の配置は共通です。

開発中 / 入力何をする?完成したWARの内部
src/main/java/com/example/HelloServlet.java
コンパイルして収録→
WEB-INF/classes/com/example/HelloServlet.class
依存関係の定義で指定したlibrary.jar
同梱対象を収録→
WEB-INF/lib/library.jar
src/main/webapp/index.jsp
ルートへ収録→
index.jsp
src/main/resources/app.properties
リソースとして収録→
WEB-INF/classes/app.properties

途中の出力先と、WAR内部は別の場所。

Mavenでは通常target/classes、GradleのJava機能では通常build/classes/java/mainにclassを作ります。WAR内ではWEB-INF/classes以下に入ります。

完成したWARファイル / Maventarget/MyWebApp.warWARファイルそのものの置き場所の例です。WAR内部のWEB-INFなどとは別です。出力先・WAR名は設定で変更できます。

MavenとGradleでは、途中の作業場所は違う。でも、完成したWebアプリが従う配置ルールは同じ。

Mavenの出力例 / 開発フォルダー側
target/
├─ classes/
│  └─ com/example/HelloServlet.class
└─ MyWebApp.war
Gradleの出力例 / 開発フォルダー側
build/
├─ classes/java/main/
│  └─ com/example/HelloServlet.class
└─ libs/
   └─ MyWebApp.war
targetやbuildを、WARの中へそのまま入れるわけではない。

これらは作業中の出力先です。できたWARを開くと見えるのは、先ほどのWEB-INF/classes、WEB-INF/lib、index.jspなどです。出力先とWAR名は設定可能です。src/main以下の標準構成も変更できます。

確認資料:Maven Standard Directory Layout / Maven WAR Plugin / Gradle Java Plugin / Gradle War Plugin

13

違う材料棚から、同じWebアプリの形へ。

これで、プロジェクトによってフォルダーが違って見える理由を説明できます。開発中の材料の置き方と、完成形の配置ルールは、別の約束だからです。

Eclipse Dynamic Web Projectの一例
src/
└─ com/example/HelloServlet.java
WebContent/
├─ index.jsp
└─ WEB-INF/

JavaソースとWeb資材を、プロジェクトの設定で対応付ける。

Maven / Gradle Web Projectの標準例
src/main/
├─ java/com/example/HelloServlet.java
├─ resources/
└─ webapp/
   ├─ index.jsp
   └─ WEB-INF/

標準的な配置とビルド定義を使って組み立てる。

↓ 材料は異なる置き方でも、コンパイル・収録すると ↓
目指す完成形 / 両方とも、この構造にそろえる
Webアプリのルート/
├─ index.jsp  (ほかにHTML / CSS / 画像など)
└─ WEB-INF/
   ├─ classes/com/example/HelloServlet.class
   └─ lib/library.jar

「Eclipseかビルドツールか」の二者択一ではありません。Maven/GradleのプロジェクトをEclipseで編集し、Web開発の支援機能を使うこともできます。ここでは分かりやすく、代表的な開発フォルダーの例を比べています。

覚えること:WebContentやsrc/main/webappは材料の場所。完成形では、その中身がアプリのルートへ入る。

14

MavenとGradleは、何が違う?

どちらも、ここまで見てきた作業を自動化する道具です。最初は、手順と依存関係を書くファイルが違うと捉えれば十分です。

観点MavenGradle
主な設定ファイルpom.xmlbuild.gradle または build.gradle.kts
何を書く?アプリの情報、使うライブラリ、ビルドの設定など使う機能、ライブラリ、ビルドの設定など
自動化することソースをコンパイルする、依存JARを用意する、テストする、JAR/WARを作るなど
Web用の機能WARを作る設定とMaven WAR PluginGradle War Plugin
pom.xmlの一部 / 完全な設定ではありません
<packaging>war</packaging>

成果物をWARにするという指定です。必要な依存関係などは、別に記述します。

build.gradleの一部 / 完全な設定ではありません
plugins {
    id 'war'
}

WARを作る機能を使うという指定です。必要な依存関係などは、別に記述します。

依存関係とは「このアプリが使うライブラリなど」のことです。ファイルに名前や版を書いておくと、ツールが指定先から用意してくれます。そのうちコンパイルだけに使うもの、実行時に同梱するものは設定で区別します。

「JARをダウンロードするだけ」の道具ではない

JARの用意は工程の一つです。最終的にclassやWeb資材と合わせ、必要な配置構造を作り、成果物へまとめます。

もう一歩:手順の考え方の違い

Mavenはあらかじめ決められた工程の流れを中心にし、Gradleは個々の作業を組み合わせます。どちらが上という話ではありません。この段階では「何を入力して、どんなclassやWARが出るか」を追えることを優先しましょう。

15

Maven / GradleをEclipseでどう使う?

まず、自分はいまどのケース?

Eclipseは作業するIDE、Maven / Gradleはビルドや依存関係を管理する道具です。EclipseとMavenをつなぐ機能がm2e、Gradleをつなぐ機能がBuildshipです。

① まだProjectがない:新しく作る

EclipseからMaven ProjectまたはGradle Projectを新規作成すると、ビルド定義が用意され、そのまま編集できます。

Eclipseの新規作成New
→
Maven Project
またはGradle Project
→
作成して編集する
m2e / Buildshipを導入した構成での例です。ウィザードの入口や表示言語は環境で異なります。

Maven / Gradleで管理するProjectを、Eclipseで編集しているという関係です。現在でもコマンドラインなどでProjectを作れます。その場合は、次の②でEclipseへ取り込みます。

② Projectはもうある:Eclipseで開く

GitやZIPで、次のようなProjectを受け取ったとします。作り直さず、既存のビルド定義を取り込みます。

Mavenの例
SampleApp/
├─ pom.xml
└─ src/
Gradleの例
SampleApp/
├─ build.gradle
├─ settings.gradle
└─ src/
手元にあるもの現在の代表的な開き方
pom.xmlを持つProjectEclipseのImportでMaven Projectとして取り込む
build.gradleなどを持つProjectImport → Gradle → Existing Gradle Project

m2e / Buildshipがソースの場所や依存関係を読み取り、Eclipseで扱えるように構成します。Newは「まだないProjectを作る」、Importは「すでにあるProjectをEclipseで開く」操作です。Importは単なるファイルのコピーではありません。

では、.project / .classpathはどうなる?

現在のImportでは、自分で事前生成する必要はありません。Eclipse側で必要な情報が作成・更新されます。この違いは後で「以前の方式」と並べて確認します。

③ 普通のEclipse Projectへ、後から導入する

導入前 / Eclipseの設定で管理
HelloProject/
├─ .project
├─ .classpath
├─ src/
└─ lib/
   └─ calculator.jar

これまではJava Build Pathでcalculator.jarを登録していました。Eclipse自身のJava Builderがコンパイルを行っています。

Maven / Gradleを導入しても、Eclipseで編集を続けられます。変わるのは、ビルドや依存関係をどこを基準に管理するかです。

  1. ビルド定義を用意する。Mavenならpom.xml、Gradleならbuild.gradleなどに、ソースの場所・Java設定・必要なライブラリを定義します。
  2. 今ある構成と合わせる。src/を標準のsrc/main/javaへ移すか、現在の場所をビルド定義に指定します。ライブラリもビルドツール側から利用できるようにし、ビルドできることを確かめます。
  3. Eclipseへ連携する。Maven用設定をm2eで取り込み、Gradle用設定をBuildshipで取り込んで、Maven / Gradle Projectとして扱います。

m2eには通常のJava ProjectへMavenサポートを加える機能があります。Buildshipには既存ProjectをGradleと連携させるAdd Gradle Natureがあります。連携を有効にするだけで、手動登録した全JARやソース構成が完全なビルド定義へ自動変換されるわけではありません。

具体例:Gradle導入後も、foo.jarをEclipseにだけ追加すると?

導入前は、Java Build Pathでlib/foo.jarを登録していました。Gradle管理へ移した後は、build.gradle側へfoo.jarの依存関係を書くのが基本です。

build.gradleの依存関係部分 / Java用プラグインを使う例
dependencies {
    implementation files('lib/foo.jar')
}

foo.jarはプロジェクト内のlib/に用意した例です。Java Build Pathへだけ追加すると、Eclipseではエラーが消えても、Gradle側に指定がなければGradleのコンパイルで見つかりません。Maven管理ならpom.xmlへ依存関係を定義します。変更後にEclipseへ反映する操作は、後の「同期」で確認します。

3ケースと、選ぶ操作をまとめる

ケース現在の考え方
① 新しく作るEclipseからMaven / Gradle Projectを新規作成
② 既存Projectを開くpom.xml / build.gradleを持つProjectを対応する形式でImport
③ 後から導入するビルド定義を用意し、m2e / BuildshipでEclipseと連携

何が変わった? Eclipseとのつなぎ方

新しく用意したProjectも、受け取った既存Projectも、Eclipseとのつなぎ方を比べてみましょう。

以前よく使われた連携方法
Maven / Gradle Project
↓ 開発者がコマンドを実行
mvn eclipse:eclipse
またはgradle eclipse
↓ ビルドツール側のプラグインで
.project / .classpathなどを先に生成
↓ EclipseへImport
現在の代表的な連携方法
Maven / Gradle Project
↓ そのままEclipseへImport
m2e / Buildshipビルド側の構成を取り込む
↓
Eclipse Projectとして構成必要なEclipse側の設定も作成・更新
変わったのはMaven / Gradleの役割ではなく、Eclipseとのつなぎ方です。絶対的な年代区分ではありません。
古い手順書を読むときの補足

mvn eclipse:eclipseではMaven Eclipse Plugin、gradle eclipseではGradle Eclipse PluginがEclipse用設定を生成します。コマンドを起動する場所より、ビルドツール側で先に設定を用意する点が重要です。

Maven Eclipse PluginはRETIRED(保守終了)。確認したGradle 9.8.0文書では設定生成タスクなどが非推奨で、Gradle 10で削除予定です。Buildshipが使う設定調整機能まで非推奨になったわけではありません。

Maven Eclipse Plugin / Gradle Eclipse Plugin(2026年10月1日確認)

だから、設定ファイルが複数見える

Eclipse用の設定と、Maven / Gradle用の定義が同じProject内に共存しています。

ファイル誰のため?役割
.projectEclipseProjectそのものの情報
.classpathEclipseJava Build Pathの情報
.settings/EclipseやプラグインProject固有の設定
pom.xmlMaven依存関係・ビルド設定
build.gradle / settings.gradleGradleビルド設定・参加Projectなどの構成

Gradleにはbuild.gradle.kts / settings.gradle.ktsもあります。ファイルの有無だけで決めず、そのProjectの手順と管理方法を確認します。

変更したら、Eclipseへ同期する

pom.xml / build.gradleを変更
→
Update / Refresh
→
既存のEclipse Projectを更新
最初はNew / Import。その後はSync / Refreshで、IDE側の構成を合わせます。

MavenならMaven → Update Project…、GradleならGradle → Refresh Gradle Projectが代表例です。Java Build Pathなどへ変更が反映されます。IDE側だけの手動追加を、逆向きにビルド定義へ書き戻す操作ではありません。

SyncはIDE側の構成を合わせる。PublishはTomcatが使う配置へ反映する。

結局、ライブラリを追加するときはどこを直す?

管理方法まず変更する場所
Eclipseのプロジェクト設定で管理Java Build Path
Mavenで管理pom.xml
Gradleで管理build.gradleなどのビルド定義

ビルド設定も、管理するツール側で変更します。文字色などIDE固有の設定はEclipse側です。「誰が読む設定?」「ビルドを管理しているのは誰?」で、変更の基準を判断できます。

もう一歩:IDE連携の内部

ソース位置・依存関係などの構造化情報をProject Modelなどと呼ぶことがあります。実際にツール内部で使う情報ですが、1個の物理ファイルではありません。Gradle Tooling APIは、BuildshipとGradleが情報をやり取りする仕組みです。

取得した情報でEclipseのProjectやJava Build Pathが構成され、.project / .classpathなどへ保存されます。依存関係をまとめて扱う参照もあるため、.classpathに全JARが一つずつ並ぶとは限りません。

確認:2026年10月1日 / m2e / 新規作成・Mavenサポート / Buildship / 作成・Import / Buildship / 操作名・既存Projectとの連携

まず考えるのは、「自分はいま、新しく作るのか、既存Projectを開くのか、後からMaven / Gradleを導入するのか?」

16

最後に、IDEとビルドツールの役割を整理する。

IDEをEclipse以外へ変えたら、Maven / Gradleも変える必要がある?

第14章ではMaven / Gradleという道具を、第15章ではEclipseで使う場面を見ました。最後に、「どのIDEを使うか」と「何でビルドを管理するか」は別々に選べると整理しましょう。

軸1 / どのIDEで作業する?

Eclipse / IntelliJ IDEA

コードを書く・調べる・実行操作をする作業環境を選びます。

軸2 / ビルドや依存関係を何で管理する?

IDEのプロジェクト設定 / Maven / Gradle

ビルドや依存関係の管理方法を選びます。

同じpom.xmlを持つProjectも、同じGradle Projectも、EclipseやIntelliJ IDEAで開けます。IDEを変えても、Maven / Gradleによるビルド管理を続けられます。

組み合わせの例

Eclipse + Maven
Eclipse + Gradle

IntelliJ IDEA + Maven
IntelliJ IDEA + Gradle

補足:IDEのBuildを押すと、いつも同じ処理になる?

同じとは限りません。IDE自身がコンパイルする経路も、ビルドツールへ処理を渡す経路もあります。編集中のコンパイルと、テストやWAR作成までの工程は別です。必要になったら、押した操作が何を実行したかログで確認します。

Eclipseのパッケージを選ぶ場面でも、役割で考える

どちらもJavaを書けます。違いは主に、最初から用意されている開発支援機能です。2026-09の公式パッケージ情報では、次のように説明されています。

普通のJavaを中心に始める

Eclipse IDE for Java Developers

Javaの編集・実行に使う機能を中心とした構成です。Maven/Gradleとの連携も含まれます。

最初に作った、mainから動かすJava Projectを思い出してください。

Web開発の支援機能もそろえる

Eclipse IDE for Enterprise Java and Web Developers

Javaに加え、JSPなどのWeb資材やWeb/Enterprise向けの開発支援がそろった構成です。

Dynamic Web Project、WTP、Tomcatとの連携を使う場面につながります。Tomcat本体の用意と設定は別に必要です。

Java SE・Java EE・Jakarta EEは、短く整理する

Java SEは、普通のJavaプログラムを作り動かす基盤です。ServletなどのWeb/Enterprise向け仕様は、歴史的にはJava EE、現在はJakarta EEという体系に含まれます。Java SEを土台に利用するもので、別のJava言語ではありません。TomcatはそのうちServletなどを扱う実装で、Jakarta EEの全機能を備えた製品という意味ではありません。

古い教材でjavax.servletと書かれていたら

Jakarta EE 9で主要APIの名前空間がjavaxからjakartaへ変わりました。古いServletコードでは javax.servlet、新しい体系では jakarta.servlet を見かけます。利用するAPIとTomcatの互換性を合わせてください。Java SE側のjavaxまで、すべて置き換える話ではありません。

確認資料:m2e / Buildship / Java Developers 2026-09 / Enterprise Java and Web Developers 2026-09

結

少しずつ増やした図を、一枚につなぐ。

最初はHello.javaが一つあるだけでした。最後に、普通のJavaとWebアプリのファイルの旅を並べます。矢印が「変換」なのか「配置」なのか「実行」なのかに注目してください。

普通のJava / mainから起動する
src/sample/Hello.java
コンパイル →
bin/sample/Hello.class
読み込み →
JVM → main()必要なJARもclasspathで探す

Webアプリ / 材料をそろえて、Tomcatへ

① 自分が書いたJava

src/com/example/
HelloServlet.javaまたはsrc/main/java以下
↓ コンパイル
作業用の出力先の
HelloServlet.class
↓ 配置・収録
WEB-INF/classes/
com/example/
HelloServlet.class

② アプリが使う部品

library.jar手元に用意 / 依存関係から取得
↓ 同梱するものを選ぶ
JARをまとめたまま扱うclassへ分解しなくてよい
↓ 配置・収録
WEB-INF/lib/
library.jar

③ Webの画面・資材

WebContent/またはsrc/main/webapp
↓ 中身を取り出す
index.jsp / HTML
CSS / JS / 画像など
↓ ルート以下へ配置・収録
index.jsp
css/style.css など
これが、完成したWebアプリの構造
Java用の設定などは、標準構成ではsrc/main/resources → WEB-INF/classesへ。
↓ 配布するなら、この構造を一つにまとめる ↓
MyWebApp.war開発時は、WARにせず展開構造を反映する経路もある
↓ デプロイして、読み込める状態にする ↓
JVMの中
Tomcat
URLに対応するServletを呼び出す → アプリの処理
BrowserHTTPリクエスト → Tomcat
HTTPレスポンス ← Tomcat
JSPは配置後にサーバー側で処理され、ブラウザーには生成した応答が返ります。ブラウザーがServletのclassを実行するわけではありません。
この変換・配置を、誰が手伝う?

EclipseのJava機能がコンパイルを、WTPが開発中の配置とサーバー連携を支援します。Maven/Gradleはコンパイルやライブラリの用意、構造の組み立て、テスト、WAR作成などを自動化します。どの経路でも、完成形のルールを守ることが大切です。

自分の言葉で、説明してみよう

1. なぜsrcの.javaを直す? binの.classではだめ?

.javaは人が書く材料で、.classはコンパイル結果です。材料を直してコンパイルし直します。binは出力先の一例で、固定の名前ではありません。

2. JARを追加するとは、何を教えている?

そのJARの中もclassを探す対象にする、ということです。コンパイル時に見つかることと実行時に見つかることを確認します。Webアプリでは同梱先の設定も必要になります。

3. HelloServlet.javaは、Tomcatへ渡すときにどこへ行く?

コンパイルされたHelloServlet.classを、パッケージの並びを保ってWEB-INF/classes/com/example以下へ配置します。.javaをsrcのまま渡すわけではありません。

4. Dynamic Web ProjectやWTPが必要になる理由は?

JavaソースとWeb資材を別々に管理し、それぞれをTomcatが理解する完成形へ対応付けるためです。WTPは、その配置やサーバー連携を支援します。

5. WebContentとsrc/main/webappは、何が違って何が同じ?

開発中の約束が違うフォルダー名ですが、どちらもWeb資材の置き場の例です。標準的な対応では、その中身が完成したWebアプリのルートへ入ります。

6. WARと、Maven/Gradleの役割は?

WARはWebアプリの配置構造をまとめた成果物です。Maven/Gradleは、ソースをclassにし、JARや資材を集め、テストやWAR作成までの工程を自動化する道具です。

7. 保存・コンパイル・Publishは、それぞれ何を更新する?

保存は.javaなどの材料、コンパイルは.class、PublishはTomcatが利用する配置を更新します。その後、Tomcatがアプリを読み込み、リクエストに応じて処理します。Server Runtimeは使うTomcatの登録情報、Server AdapterはEclipseから操作するための橋渡しです。

8. GradleプロジェクトへJARを追加したい。どこを変える?

基本的にはbuild.gradleなどの依存関係を変更し、BuildshipでEclipseへ同期します。.classpathはEclipseが使う実際の設定ですが、IDE側だけの変更ではGradleへ伝わりません。まず「誰が読む設定か」「誰がビルドを管理するか」を考えます。

「ボタンを押したら動いた」から、
「自分のファイルの行き先が分かる」へ。

↗

公式参考資料

確認日:2026年9月30日。配置のルールはServlet仕様で確認し、開発フォルダーの例は各ツールの文書を参照しました。latest/currentのページは更新されます。Eclipseのヘルプには旧版の画面例が残るため、構造と役割の根拠として利用し、現在の既定フォルダー名とは断定していません。

フォルダー図は責務と対応を学ぶための例です。内側のパッケージ階層は一部、com/exampleのように短く表記しています。ファイルを選ぶ操作は概念の表示であり、実際のコンパイル・配置は実行しません。