材料を更新
エディターで直した内容を、.javaファイルへ保存する。
いつも編集しているのは Hello.java。
けれど、実行されるまでには「変換する」「探す」「並べる」という準備があります。
一つのファイルを追いかけながら、Java開発の仕組みを学びましょう。
まずは、この3つだけ。先へ進むごとに、ファイルの行き先を少しずつ増やしていきます。
Hello.javaを作った。実行されるのも、このファイル?
EclipseでHelloProjectを作り、sampleというパッケージにHelloクラスを置いたとします。今、あなたが編集しているのは、人が読んで書くためのソースコードです。
HelloProject/
└─ src/
└─ sample/
└─ Hello.javapackage sample;
public class Hello {
public static void main(String[] args) {
System.out.println("Hello World");
}
}この文字の並びを、Javaの実行機構が扱う形式に変換します。その作業がコンパイルです。型や文法などを確認し、ここでは Hello.class というファイルを作ります。元の.javaは消えません。
HelloProject/
├─ src/
│ └─ sample/
│ └─ Hello.java
└─ bin/
└─ sample/
└─ Hello.classプログラムを直すときは src/sample/Hello.java を変更します。
コンパイル結果が置かれます。通常、.classを直接編集しません。sampleというパッケージの並びも引き継がれます。
Eclipseの出力先の一例です。設定次第でclassesなど別の場所になります。srcも開発用の慣例的な名前です。Eclipseのビューによっては出力フォルダーが隠されているので、Navigatorやファイル管理ソフトで実際のフォルダーを見ると確認しやすくなります。
覚えること:.javaは材料、.classはコンパイルでできる生成物。
確認資料:Eclipse Java Builder / 出力フォルダーの設定
Run As → Java Application。その後、何が起きている?
EclipseでHello.javaを右クリックし、Run As → Java Applicationを選ぶと、必要なコンパイルを済ませた上でJavaの実行環境を起動します。そこでclassを読み込んで動かす仕組みをJVM(Java仮想マシン)と呼びます。
main は、このJava Applicationの処理を始める入口です。JVMがsample.Helloのmainを起動し、その中のprintlnが文字を出します。実行ボタンを押す人、準備するEclipse、実際にclassを動かすJVMは、それぞれ役が違います。
Javaの開発キットであるJDKを使えば、端末からもコンパイルと実行ができます。JDKにはコンパイル用のjavac、起動用のjava、標準ライブラリ、JVMの実装などが含まれます。
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。
Calculator.add(1, 2)を使いたい。でもCalculatorは自分で書いていない。
別の人が作った便利な処理を、自分のプログラムから呼ぶことがあります。このような再利用する部品をライブラリと呼びます。配布するclassが増えたら、ファイルを一つずつ渡すより、まとめた方が扱いやすくなります。
// sample.Calculatorが使える状態なら
System.out.println(Calculator.add(1, 2));
// 出力:3ここでは、同じsampleパッケージにある、publicなCalculatorクラスのstaticメソッドを使う想定です。
calculator.jar ├─ sample/ │ ├─ Calculator.class │ └─ MathUtil.class └─ META-INF/ └─ MANIFEST.MF
コンパイル済みのclassや、処理に使う設定・画像などのリソースをまとめたファイルがJARです。内部にはフォルダーの並びも保存されます。ZIPを基にした形式で、通常は展開せずに利用できます。
JARをどこかに保存しただけで、Javaは見つけてくれる?
パソコン中を勝手に探すわけではありません。必要なclassを「この場所から探して」と教えます。この探す場所の一覧がclasspath(クラスパス)です。classのあるフォルダーやJARファイルなどを指定します。
sample.Hello が bin/sample/Hello.class にあるなら、フォルダー側のclasspathはbinです。ライブラリ側はcalculator.jarを指定すれば、その内部のsample以下も探せます。import は名前を短く書くためのもので、JARを取得したり探索場所を追加したりする命令ではありません。
すべてのJARが単体で起動できるわけではありません。ライブラリのJARと、起動するクラスなどが設定された実行可能JARは使い方が違います。ここでは部品として使うJARを扱います。
覚えること:JARは部品をまとめたファイル。classpathは部品を探す場所。
Add JARsを押すと、何が変わる?
JARが見つからない状態では、EclipseはCalculatorを知らないのでエラーを出します。プロジェクトのProperties → Java Build Path → LibrariesでJARを追加すると、その中のclassも探す対象になります。
| 操作 | 選ぶ場所 | 何をする? |
|---|---|---|
| Add JARs | Eclipseのプロジェクトなど、ワークスペース内 | 選択したJARをビルドパスへ登録する |
| Add External JARs | ワークスペース外のファイルシステム | 外部の場所にあるJARを参照する |
パソコン全体にライブラリを「インストール」する操作ではありません。通常のJava Applicationでは、プロジェクトの情報を基に実行時のclasspathも組み立てられます。ただし実行構成で変更できるため、コンパイルできることと、実行時にも見つかることは別に確認します。
Eclipseがソースフォルダー、出力先、ライブラリなどを管理するためのプロジェクト設定です。JavaやJVMが直接読む「共通の設定ファイル」ではありません。今はXMLの中身を覚える必要はありません。
教材やチームから受け取ったcalculator.jarを、プロジェクトのlibなどに置いて追加します。追加前後でCalculatorへのエラー表示が変わるか見てください。この教材には実際のcalculator.jarは同梱していません。名前と中身は説明用の例です。
ここまでで、普通のJavaの仕組みが揃いました。
自分のclassと必要なJARを見つけられるようにして、JVMでmainを起動します。
ブラウザーから呼ばれるServletには、なぜmainがない?
これまでのJava Applicationでは、mainが処理の入口でした。Webアプリでは、起動して待っているTomcatが、ブラウザーからのリクエストに応じて自分の処理を呼びます。その呼び出されるJavaの部品がServletです。
HTTPはブラウザーとサーバーが要求・応答をやり取りするための決まりです。Tomcatは、どのURLをどのServletに担当させるかを知り、Servletの作成・呼び出しなどを管理します。この役割からServletコンテナ/Webコンテナと呼ばれます。
Tomcat自身もJavaのプログラムです。TomcatがServletを管理し、実際のclassの実行はJVMが担います。自分のServletにmainを書かなくてもよいのは、Tomcatという呼び出し役がいるからです。
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から始まる処理と、リクエストを受けて呼ばれる処理は、入口が違う。
HelloServlet.classは、どのフォルダーに置けばよい?
適当な場所に置けば見つかるわけではありません。Webアプリには、Servlet仕様で定められた配置のルールがあります。まずは「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/ | このアプリに同梱するライブラリJAR | JARの中のclassも、アプリから使えるように読み込む |
WEB-INF/web.xml | Servletの登録や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です。Tomcatが提供するServlet APIなどは通常、アプリへ重複して同梱しません。classをJARにまとめてlib側に置く構成もありますが、最初は「自分のclassはclasses、同梱ライブラリはlib」という例で理解しましょう。
srcには.javaがある。でもTomcatが探すのはWEB-INF/classes。どうつながる?
ここで、一つのWebアプリの材料がある側と完成形の側を並べます。WebContent は、この例でWeb用資材を集める開発用フォルダーの名前です。その中身が、完成形のルートへ入ります。
MyWebProject/ ├─ src/ │ └─ com/example/HelloServlet.java ├─ lib/ │ └─ library.jar └─ WebContent/ ├─ index.jsp └─ WEB-INF/
MyWebApp/
├─ index.jsp
└─ WEB-INF/
├─ classes/
│ └─ com/example/HelloServlet.class
└─ lib/
└─ library.jar左のlibは説明用に選んだ保管場所で、自動的に配置されるという意味ではありません。どの資材をどこへ入れるか、対応付けが必要です。
src/com/example/HelloServlet.javaWEB-INF/classes/com/example/HelloServlet.classlib/library.jarWEB-INF/lib/library.jarWebContent/index.jspindex.jspアプリの /index.jsp.javaをそのまま運ぶのではありません。まずコンパイル先にclassを作り、そのclassをWEB-INF/classes以下へ反映します。
src/…/HelloServlet.java→ コンパイル →出力先/…/HelloServlet.class→ 配置 →WEB-INF/classes/…/HelloServlet.classsrcは開発者の材料置き場です。コンパイル先のclassを、Webアプリのルールに合わせて配置します。作業用の出力先を経由するため、srcからWEB-INF/classesへ一度に変換するとは限りません。
図に増えたもの:classの変換先 + JARの配置先 + Web資材の配置先。
普通のJava Projectと、フォルダーの見え方が違うのはなぜ?
WebアプリではJavaソースだけでなく、JSPや画像もまとめて扱います。そして、完成形ではそれぞれ行き先が違います。その関係をEclipseで管理するためのプロジェクトがDynamic Web Projectです。
HelloProject/ ├─ src/ ← Javaソース └─ bin/ ← class出力
自分のmainを起動するためのソース、ライブラリ、出力先を管理します。
MyWebProject/ ├─ src/ ← Javaソース ├─ build/classes/ ← class出力の例 └─ WebContent/ ← Web資材 ├─ index.jsp └─ WEB-INF/
さらに、Webアプリとして配置するための対応関係やサーバーとの関係も管理します。
Dynamic Web Projectは、Javaソース・Web資材・配置先との対応を持つ開発用のまとまりです。フォルダーを分ける理由は、classへ変換する材料と、そのままWeb資材として配置する材料を区別するためです。
src、WebContent、build/classesは一例です。Eclipseの版、作成方法、設定で変わります。Web資材フォルダーやコンパイル出力先は変更可能です。一方、完成したWebアプリのWEB-INF/classesやWEB-INF/libには、前章の配置ルールがあります。
たとえばWebContentを別名にしても、対応を正しく設定すれば同じ完成形を作れます。Eclipseで見えるプロジェクト全体を、そのままTomcatへコピーするわけではありません。
確認資料:Eclipse Dynamic Web projects(構造の説明を参照。画面の既定値は版・設定で異なります)
Run on Serverを押すと動く。Eclipseは、どうやってTomcatを操作している?
Tomcatは独立したWebコンテナです。Javaの実行環境とTomcat本体を用意すれば、Eclipseを起動せずにWebアプリを動かせます。ここでは、準備してから起動する流れを見ます。
MyWebApp/ ├─ index.jsp └─ WEB-INF/ ├─ classes/ │ └─ com/example/HelloServlet.class └─ lib/library.jar
まずEclipseのJava機能がソースをコンパイルします。次に、その出力とWeb資材を、Tomcatが読める構成へ配置します。Eclipseでこの配置やサーバー起動を支援する仕組みの一つが、WTP(Web Tools Platform)です。
プロジェクトのPropertiesで見かけるDeployment Assemblyは、どのフォルダーやライブラリを、完成形のどこへ配置するかを管理する設定です。
| 開発側の材料 | 配置先(アプリ内) | 実際に入るもの |
|---|---|---|
src のJavaソース | /WEB-INF/classes | .javaそのものではなく、対応するコンパイル出力のclass |
WebContent | / | フォルダーの中身。index.jspはルートのindex.jspへ |
| 同梱するライブラリJAR | /WEB-INF/lib | JARファイルをそのまま |
説明用の対応例です。表示されるエントリーや初期設定は構成で異なります。Java Build PathにJARを加えることと、Webアプリへ同梱することは同じではありません。
Eclipseは準備と操作を支援する側、Tomcatは要求を受けてServletなどを呼び出す側です。実際のclassはJVM上で動きます。Server ToolsはWTPの一部であり、図の箱を別々のサーバーとして動かすわけではありません。
Tomcat連携をまとめてそう呼ぶ場合もあります。この教材では、標準的なEclipseのWeb開発環境にあるWTPのServer Tools + Tomcat用Server Adapterを指して説明します。既存環境には別のTomcat向けプラグインもあるため、一語だけで同じ仕組みと決めつけず、使っている機能を確認します。
Tomcat本体をPCへ用意した後、その場所をEclipseへ登録します。これはTomcatをEclipseの中へインストールする操作ではありません。すでにあるインストール先を参照する設定です。
メニューと登録先フィールドは公式ヘルプで確認。選択できるTomcatの版・画面の項目は、導入済みのアダプターやEclipseの版で異なります。公式ヘルプ内の古いTomcat一覧を、現在の対応一覧として使わないでください。
C:\apache-tomcat-xx\ ├─ bin/ ├─ conf/ ├─ lib/ ├─ logs/ ├─ webapps/ └─ …
xxは版を省略した説明用の表記です。自分が用意した実際のパスを指定します。logsなど一部のフォルダーは利用状況で作られます。
インストール先や種類・版など、Eclipseへ登録した利用する実体の情報です。
その種類のサーバーをEclipseから操作する橋渡しの機能です。サーバーごとの起動・停止・配置方法の違いを扱います。
Runtimeは本体の場所などの定義です。Serversビューのサーバーは、そのRuntimeを使い、起動方法や配置するプロジェクトなどを管理する設定です。登録ウィザードでローカルサーバーも一緒に作る構成がありますが、Runtimeを登録しただけでアプリが配置・起動されるわけではありません。
プロジェクトで対象Runtimeを使う設定は、Servlet APIなど、そのサーバーが提供するAPIをEclipseが参照することにも関係します。APIをコンパイル時に参照できることと、アプリへJARを同梱することは区別します。
確認資料:Adding the Apache Tomcat runtimes / Server runtime environments preferences
| 名前 | この場面での意味 |
|---|---|
| Dynamic Web Project | JavaとWeb資材、配置の関係を持つプロジェクト |
| Server Runtime | 利用するTomcat本体やJava実行環境などの定義。コードを書くときに参照するAPIにも関係する |
| Server Adapter | Tomcatなど、サーバーごとの起動・停止・配置方法をEclipseへつなぐ機能 |
| Project Facets | そのプロジェクトで使うJavaやWebの機能・版を表す設定 |
| Deployment Assembly | 開発側の資材と、Webアプリ内の配置先との対応 |
| Publish | 変更したclassやWeb資材を、サーバーが使う配置へ反映する処理 |
| Run on Server | 対象サーバーへの配置・起動などをまとめて支援する操作 |
登録したサーバーと、それに追加したWebプロジェクトを一覧で扱います。対象のサーバーを選び、ツールバーや右クリックメニューから操作します。
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
ファイルを直してから画面に結果が出るまでを、4段階に分けます。自動処理で続けて起きる場合でも、それぞれ更新する対象が違います。
エディターで直した内容を、.javaファイルへ保存する。
EclipseのJava機能が、保存したソースから.classを作る。
出力classやWeb資材を、Tomcatが読む構成へ反映する。
Tomcatがアプリを読み込み、HTTP要求に対応する処理を呼ぶ。
src/com/example/
HelloServlet.javabuild/classes/com/example/
HelloServlet.classWEB-INF/classes/com/example/
HelloServlet.class自動コンパイルや自動Publishが有効なら、設定されたタイミングで後続の処理が進みます。手動なら、それぞれ必要な操作を行います。Publishはコンパイルそのものではなく、インターネットへの一般公開という意味でもありません。
変更を配置した後、Tomcat側でアプリの再読み込みや再起動が必要な場合もあります。Publish完了と、実行中の処理が新しいclassへ切り替わったことは区別します。
確認資料:Publishing your application
Eclipse / WTPでは、本体とは別に管理するTomcat用の作業ディレクトリへ配置することがあります。本体のwebappsにないことだけで、Publishされていないとは判断できません。
配置先を確かめるときは、Serversビューの対象サーバーを開き、Server Locationsなどの設定を確認します。項目名・利用できる設定は版や構成で異なります。大切なのは、実際に起動したTomcatが参照する配置先を見ることです。
確認資料:WTP Tomcat FAQ(旧版を対象とする資料。インストール先と作業場所を分ける仕組みを参照)
覚えた仕組みを使うと、確認する場所も分かります。これは原因をすべて網羅する診断表ではなく、「どの段階まで進んだか」を考えるための順番です。
index.jsp WEB-INF/ ├─ classes/com/example/HelloServlet.class └─ lib/library.jar
| 名前 | この問いに答える |
|---|---|
| Server Runtime | どのTomcatを使う? |
| Server Adapter | EclipseからTomcatをどう操作する? |
| Deployment Assembly | 何を、どこへ置く? |
| Publish | その配置を、実際に反映する。 |
4段階で説明しよう:保存 → EclipseのJava機能でコンパイル → WTPでPublish → Tomcatで実行。
覚えること:Java Build Pathは「探す場所」、Deployment Assemblyは「配置する先」。
完成したフォルダー一式を、配りやすくするには?
Tomcatには、展開されたWebアプリのフォルダーを配置する方法もあります。しかし配布時にファイルを一つずつ渡すと、抜けや置き間違いが起きます。そこで、Webアプリの配置構造を保ったまま、一つにまとめたファイルを使います。これがWAR(Web Application Archive)です。
MyWebApp/
├─ index.jsp
└─ WEB-INF/
├─ classes/
│ └─ com/example/HelloServlet.class
└─ lib/
└─ library.jarMyWebApp.war
├─ index.jsp
└─ WEB-INF/
├─ classes/
│ └─ com/example/HelloServlet.class
└─ lib/
└─ library.jarWARの内部のルートはindex.jspやWEB-INFです。通常、外側のMyWebAppフォルダーまで一段余計に包む構成にはしません。また、JARのファイル名を.warへ変えればよいわけではありません。中身がWebアプリのルールに合っている必要があります。
| 形式 | 何をまとめる? | この教材での例 |
|---|---|---|
| JAR | Javaのclassやリソースなど | calculator.jar:他のプログラムが使う部品 |
| WAR | Webアプリのclass、同梱JAR、Web資材、設定を、決まった配置構造でまとめる | MyWebApp.war:Tomcatへ渡すWebアプリ一式 |
配布物を作っただけではサーバーは起動しません。配置・読み込み・起動の段階が必要です。TomcatがWARを展開するかどうか等は設定によります。開発時はWTPが展開構造を反映し、毎回WARを作らずに試す構成もあります。
図に増えたもの:そろえたWebアプリの構造 → WAR → Tomcat。
ここまでに必要だった作業を振り返ります。Javaソースを書いた後にも、完成したWebアプリへたどり着くまでには、多くの準備があります。
ソースをコンパイルし、作られたclassを正しい場所へ並べる。
アプリに同梱するライブラリを集め、WEB-INF/libへ入れる。
Web資材を集め、アプリのルート以下へ配置する。
配置構造を確認し、一つのファイルにまとめる。
変更するたびに、コピーと変換を全部やり直す?
このように、材料から利用・配布できる成果物を作る一連の作業をビルドと呼びます。コンパイルはその一部です。テストで動きを確かめる作業なども組み合わせられます。
そして、この手順を定義して自動で実行する道具が、MavenやGradleなどのビルドツールです。「classにする・必要なJARを用意する・配置構造を組み立てる・テストする・JARやWARを作る」を、人間の繰り返し作業から引き受けます。
どの機能を使うか、どのJARが必要か、何をテストするかは設定します。Web用の機能を使えばWARを作れますが、その生成とTomcatへの配置・起動は別の処理です。
覚えること:ビルドは完成形を作る工程。Maven/Gradleは、その工程を自動化する道具。
今度はsrc/main/java? WebContentはどこへ行った?
作業を自動化しやすくするために、ビルドツールには「材料をここへ置こう」という標準的な約束があります。MavenやGradleのJava/Web向け機能では、次のような構成がよく使われます。
MyWebProject/
└─ src/
└─ main/
├─ java/
│ └─ com/example/HelloServlet.java
├─ resources/
│ └─ app.properties
└─ webapp/
├─ index.jsp
├─ css/style.css
└─ WEB-INF/| 開発用の場所 | 材料の種類 | 標準構成のWAR内の行き先 |
|---|---|---|
src/main/java | Javaソース | コンパイルされたclassが WEB-INF/classes 以下へ |
src/main/resources | Javaの処理が読む設定など | 中身が WEB-INF/classes 以下へ。通常はclassへ変換しない |
src/main/webapp | JSP、HTML、CSSなどのWeb資材 | 中身がWARのルートへ。webappという外側の階層は付けない |
| 定義した依存ライブラリ | アプリが使うJAR | 同梱対象が WEB-INF/lib へ。サーバー提供APIなどは除く |
一覧は「最終的にどこへ入る?」、下の詳細は「途中でどこを通る?」を示します。完成WAR内部の配置は共通です。
src/main/java/com/example/HelloServlet.javaWEB-INF/classes/com/example/HelloServlet.class依存関係の定義で指定したlibrary.jarWEB-INF/lib/library.jarsrc/main/webapp/index.jspindex.jspsrc/main/resources/app.propertiesWEB-INF/classes/app.propertiesMavenでは通常target/classes、GradleのJava機能では通常build/classes/java/mainにclassを作ります。WAR内ではWEB-INF/classes以下に入ります。
target/MyWebApp.warWARファイルそのものの置き場所の例です。WAR内部のWEB-INFなどとは別です。出力先・WAR名は設定で変更できます。MavenとGradleでは、途中の作業場所は違う。でも、完成したWebアプリが従う配置ルールは同じ。
target/ ├─ classes/ │ └─ com/example/HelloServlet.class └─ MyWebApp.war
build/ ├─ classes/java/main/ │ └─ com/example/HelloServlet.class └─ libs/ └─ MyWebApp.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
これで、プロジェクトによってフォルダーが違って見える理由を説明できます。開発中の材料の置き方と、完成形の配置ルールは、別の約束だからです。
src/ └─ com/example/HelloServlet.java WebContent/ ├─ index.jsp └─ WEB-INF/
JavaソースとWeb資材を、プロジェクトの設定で対応付ける。
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は材料の場所。完成形では、その中身がアプリのルートへ入る。
どちらも、ここまで見てきた作業を自動化する道具です。最初は、手順と依存関係を書くファイルが違うと捉えれば十分です。
| 観点 | Maven | Gradle |
|---|---|---|
| 主な設定ファイル | pom.xml | build.gradle または build.gradle.kts |
| 何を書く? | アプリの情報、使うライブラリ、ビルドの設定など | 使う機能、ライブラリ、ビルドの設定など |
| 自動化すること | ソースをコンパイルする、依存JARを用意する、テストする、JAR/WARを作るなど | |
| Web用の機能 | WARを作る設定とMaven WAR Plugin | Gradle War Plugin |
<packaging>war</packaging>成果物をWARにするという指定です。必要な依存関係などは、別に記述します。
plugins {
id 'war'
}WARを作る機能を使うという指定です。必要な依存関係などは、別に記述します。
依存関係とは「このアプリが使うライブラリなど」のことです。ファイルに名前や版を書いておくと、ツールが指定先から用意してくれます。そのうちコンパイルだけに使うもの、実行時に同梱するものは設定で区別します。
JARの用意は工程の一つです。最終的にclassやWeb資材と合わせ、必要な配置構造を作り、成果物へまとめます。
Mavenはあらかじめ決められた工程の流れを中心にし、Gradleは個々の作業を組み合わせます。どちらが上という話ではありません。この段階では「何を入力して、どんなclassやWARが出るか」を追えることを優先しましょう。
まず、自分はいまどのケース?
Eclipseは作業するIDE、Maven / Gradleはビルドや依存関係を管理する道具です。EclipseとMavenをつなぐ機能がm2e、Gradleをつなぐ機能がBuildshipです。
EclipseからMaven ProjectまたはGradle Projectを新規作成すると、ビルド定義が用意され、そのまま編集できます。
Maven / Gradleで管理するProjectを、Eclipseで編集しているという関係です。現在でもコマンドラインなどでProjectを作れます。その場合は、次の②でEclipseへ取り込みます。
GitやZIPで、次のようなProjectを受け取ったとします。作り直さず、既存のビルド定義を取り込みます。
SampleApp/ ├─ pom.xml └─ src/
SampleApp/ ├─ build.gradle ├─ settings.gradle └─ src/
| 手元にあるもの | 現在の代表的な開き方 |
|---|---|
| pom.xmlを持つProject | EclipseのImportでMaven Projectとして取り込む |
| build.gradleなどを持つProject | Import → Gradle → Existing Gradle Project |
m2e / Buildshipがソースの場所や依存関係を読み取り、Eclipseで扱えるように構成します。Newは「まだないProjectを作る」、Importは「すでにあるProjectをEclipseで開く」操作です。Importは単なるファイルのコピーではありません。
現在のImportでは、自分で事前生成する必要はありません。Eclipse側で必要な情報が作成・更新されます。この違いは後で「以前の方式」と並べて確認します。
HelloProject/ ├─ .project ├─ .classpath ├─ src/ └─ lib/ └─ calculator.jar
これまではJava Build Pathでcalculator.jarを登録していました。Eclipse自身のJava Builderがコンパイルを行っています。
Maven / Gradleを導入しても、Eclipseで編集を続けられます。変わるのは、ビルドや依存関係をどこを基準に管理するかです。
m2eには通常のJava ProjectへMavenサポートを加える機能があります。Buildshipには既存ProjectをGradleと連携させるAdd Gradle Natureがあります。連携を有効にするだけで、手動登録した全JARやソース構成が完全なビルド定義へ自動変換されるわけではありません。
導入前は、Java Build Pathでlib/foo.jarを登録していました。Gradle管理へ移した後は、build.gradle側へfoo.jarの依存関係を書くのが基本です。
dependencies {
implementation files('lib/foo.jar')
}
foo.jarはプロジェクト内のlib/に用意した例です。Java Build Pathへだけ追加すると、Eclipseではエラーが消えても、Gradle側に指定がなければGradleのコンパイルで見つかりません。Maven管理ならpom.xmlへ依存関係を定義します。変更後にEclipseへ反映する操作は、後の「同期」で確認します。
| ケース | 現在の考え方 |
|---|---|
| ① 新しく作る | EclipseからMaven / Gradle Projectを新規作成 |
| ② 既存Projectを開く | pom.xml / build.gradleを持つProjectを対応する形式でImport |
| ③ 後から導入する | ビルド定義を用意し、m2e / BuildshipでEclipseと連携 |
新しく用意したProjectも、受け取った既存Projectも、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内に共存しています。
| ファイル | 誰のため? | 役割 |
|---|---|---|
| .project | Eclipse | Projectそのものの情報 |
| .classpath | Eclipse | Java Build Pathの情報 |
| .settings/ | Eclipseやプラグイン | Project固有の設定 |
| pom.xml | Maven | 依存関係・ビルド設定 |
| build.gradle / settings.gradle | Gradle | ビルド設定・参加Projectなどの構成 |
Gradleにはbuild.gradle.kts / settings.gradle.ktsもあります。ファイルの有無だけで決めず、そのProjectの手順と管理方法を確認します。
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側です。「誰が読む設定?」「ビルドを管理しているのは誰?」で、変更の基準を判断できます。
ソース位置・依存関係などの構造化情報を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を導入するのか?」
IDEをEclipse以外へ変えたら、Maven / Gradleも変える必要がある?
第14章ではMaven / Gradleという道具を、第15章ではEclipseで使う場面を見ました。最後に、「どのIDEを使うか」と「何でビルドを管理するか」は別々に選べると整理しましょう。
コードを書く・調べる・実行操作をする作業環境を選びます。
ビルドや依存関係の管理方法を選びます。
同じpom.xmlを持つProjectも、同じGradle Projectも、EclipseやIntelliJ IDEAで開けます。IDEを変えても、Maven / Gradleによるビルド管理を続けられます。
Eclipse + Maven
Eclipse + Gradle
IntelliJ IDEA + Maven
IntelliJ IDEA + Gradle
同じとは限りません。IDE自身がコンパイルする経路も、ビルドツールへ処理を渡す経路もあります。編集中のコンパイルと、テストやWAR作成までの工程は別です。必要になったら、押した操作が何を実行したかログで確認します。
どちらもJavaを書けます。違いは主に、最初から用意されている開発支援機能です。2026-09の公式パッケージ情報では、次のように説明されています。
Javaの編集・実行に使う機能を中心とした構成です。Maven/Gradleとの連携も含まれます。
最初に作った、mainから動かすJava Projectを思い出してください。
Javaに加え、JSPなどのWeb資材やWeb/Enterprise向けの開発支援がそろった構成です。
Dynamic Web Project、WTP、Tomcatとの連携を使う場面につながります。Tomcat本体の用意と設定は別に必要です。
Java SEは、普通のJavaプログラムを作り動かす基盤です。ServletなどのWeb/Enterprise向け仕様は、歴史的にはJava EE、現在はJakarta EEという体系に含まれます。Java SEを土台に利用するもので、別のJava言語ではありません。TomcatはそのうちServletなどを扱う実装で、Jakarta EEの全機能を備えた製品という意味ではありません。
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アプリのファイルの旅を並べます。矢印が「変換」なのか「配置」なのか「実行」なのかに注目してください。
EclipseのJava機能がコンパイルを、WTPが開発中の配置とサーバー連携を支援します。Maven/Gradleはコンパイルやライブラリの用意、構造の組み立て、テスト、WAR作成などを自動化します。どの経路でも、完成形のルールを守ることが大切です。
.javaは人が書く材料で、.classはコンパイル結果です。材料を直してコンパイルし直します。binは出力先の一例で、固定の名前ではありません。
そのJARの中もclassを探す対象にする、ということです。コンパイル時に見つかることと実行時に見つかることを確認します。Webアプリでは同梱先の設定も必要になります。
コンパイルされたHelloServlet.classを、パッケージの並びを保ってWEB-INF/classes/com/example以下へ配置します。.javaをsrcのまま渡すわけではありません。
JavaソースとWeb資材を別々に管理し、それぞれをTomcatが理解する完成形へ対応付けるためです。WTPは、その配置やサーバー連携を支援します。
開発中の約束が違うフォルダー名ですが、どちらもWeb資材の置き場の例です。標準的な対応では、その中身が完成したWebアプリのルートへ入ります。
WARはWebアプリの配置構造をまとめた成果物です。Maven/Gradleは、ソースをclassにし、JARや資材を集め、テストやWAR作成までの工程を自動化する道具です。
保存は.javaなどの材料、コンパイルは.class、PublishはTomcatが利用する配置を更新します。その後、Tomcatがアプリを読み込み、リクエストに応じて処理します。Server Runtimeは使うTomcatの登録情報、Server AdapterはEclipseから操作するための橋渡しです。
基本的にはbuild.gradleなどの依存関係を変更し、BuildshipでEclipseへ同期します。.classpathはEclipseが使う実際の設定ですが、IDE側だけの変更ではGradleへ伝わりません。まず「誰が読む設定か」「誰がビルドを管理するか」を考えます。
確認日:2026年9月30日。配置のルールはServlet仕様で確認し、開発フォルダーの例は各ツールの文書を参照しました。latest/currentのページは更新されます。Eclipseのヘルプには旧版の画面例が残るため、構造と役割の根拠として利用し、現在の既定フォルダー名とは断定していません。
フォルダー図は責務と対応を学ぶための例です。内側のパッケージ階層は一部、com/exampleのように短く表記しています。ファイルを選ぶ操作は概念の表示であり、実際のコンパイル・配置は実行しません。