はじめに
この記事でわかる・できること
- JavaプログラムからWARファイルを作成する方法
- Tomcatの導入方法
- TomcatへWARファイルをデプロイする方法
前提
- Javaプログラムが作成済みであること
この記事の対象者
- 初めてTomcatにアプリをデプロイするよ~という方
- WARファイルの作成が上手くいかないよ~という方
などなど
動作環境・使用するツールや言語
- OS バージョン
- ゲストOS:Ubuntu 24.04.2 LTS
※WSL2上で動かしています - ホストOS:Windows11 Home 24H2
- ゲストOS:Ubuntu 24.04.2 LTS
- ツール バージョン
- Visual Studio Code Version 1.99.0 (user setup)
- Apache Maven 3.8.7
- Java version: 21.0.6
- vendor: Ubuntu
- runtime: /usr/lib/jvm/java-21-openjdk-amd64
- Apache Tomcat/9.0.104
- OS Name: Linux
- OS Version: 5.15.167.4-microsoft-standard-WSL2
- Architecture: amd64
- JVM Version: 21.0.6+7-Ubuntu-124.04.1
- JVM Vendor: Ubuntu
- 言語 バージョン
- Java openjdk 21.0.6 2025-01-21
やってみたこと
手元にJavaプログラムがある状態から、WARファイルを作成してApache Tomcat(以下、Tomcatと呼びます)をインストールし、デプロイしてみました。
4時間くらいCopilot君やChatGPT君と相談してようやくできたので、備忘も兼ねてざっくり手順を共有します。
手順1 JavaプログラムからWARファイルを作成
まず前提として以下の4つを示します。
- カレントディレクトリ
- カレントディレクトリからのディレクトリ構造(ツリー形式)
- Javaソースファイルの内容
- pom.xmlファイルの内容
###コマンド
pwd
###実行結果
/home/shigemasa89/nogizaka46-playlist-maker/demo
###コマンド
tree
###実行結果
.
├── pom.xml
└── src
├── main
│ ├── java
│ │ └── com
│ │ └── example
│ │ └── ScrapeSongTitlesServlet.java
│ └── resources
└── test
└── java
9 directories, 2 files
package com.example;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class ScrapeSongTitlesServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
resp.setContentType("text/html; charset=UTF-8");
StringBuilder html = new StringBuilder("<html><body><h1>乃木坂46の楽曲一覧</h1><ul>");
try {
String url = "https://n46db.com/songs/all-songs-list.php";
Document doc = Jsoup.connect(url).get();
Element songTable = doc.selectFirst("table:nth-of-type(3)");
Elements songRows = songTable.select("tbody tr");
for (Element row : songRows) {
Element songTitleCell = row.selectFirst("td:nth-of-type(2)");
if (songTitleCell != null) {
html.append("<li>").append(songTitleCell.text()).append("</li>");
}
}
} catch (Exception e) {
e.printStackTrace();
html.append("<li>データ取得に失敗しました。</li>");
}
html.append("</ul></body></html>");
resp.getWriter().write(html.toString());
}
}
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>demo</artifactId>
<version>1.0</version>
<packaging>war</packaging><!-- warファイルとしてパッケージング -->
<properties>
<maven.compiler.source>21</maven.compiler.source><!-- 使用中のJavaバージョンを指定 -->
<maven.compiler.target>21</maven.compiler.target><!-- 使用中のJavaバージョンを指定 -->
</properties>
<!-- https://mvnrepository.com/artifact/org.jsoup/jsoup -->
<dependencies>
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.19.1</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.3.1</version> <!-- 最新バージョンに更新 -->
</plugin>
</plugins>
</build>
</project>
カレントディレクトリにpom.xmlファイルが配置されていることを確認し、以下のコマンドでWARファイルを作成します。
※WARファイルにするという情報はpom.xmlファイルに記述してあります。
mvn package
このコマンドによって、カレントディレクトリからのディレクトリ構造(ツリー形式)は以下のようになりました。
欲しかったWARファイル「target/demo-1.0.war」が作成されていますね。
###コマンド
tree
###実行結果
.
├── pom.xml
├── src
│ ├── main
│ │ ├── java
│ │ │ └── com
│ │ │ └── example
│ │ │ └── ScrapeSongTitlesServlet.java
│ │ └── resources
│ └── test
│ └── java
└── target
├── classes
│ └── com
│ └── example
│ └── ScrapeSongTitlesServlet.class
├── demo-1.0
│ ├── META-INF
│ └── WEB-INF
│ ├── classes
│ │ └── com
│ │ └── example
│ │ └── ScrapeSongTitlesServlet.class
│ └── lib
│ └── jsoup-1.19.1.jar
├── demo-1.0.war
├── generated-sources
│ └── annotations
├── maven-archiver
│ └── pom.properties
└── maven-status
└── maven-compiler-plugin
├── compile
│ └── default-compile
│ ├── createdFiles.lst
│ └── inputFiles.lst
└── testCompile
└── default-testCompile
└── inputFiles.lst
29 directories, 10 files
手順2 Tomcatをインストールして起動確認
1. Tomcatのtarを持ってくる
以下のページで、安定していそうなものとしてTomcat 9.0.104(9.0.xの中の最新版)を選択しました。
https://tomcat.apache.org/whichversion.html
tar.gzのリンクを右クリックしてリンクのアドレスをコピーします。
カレントディレクトリ上で、コピーしたアドレスを使って以下のコマンドを実行し、tomcatのtar.gzをダウンロードします。
wget https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.104/bin/apache-tomcat-9.0.104.tar.gz
2. tar.gzファイルを解凍
続いて以下のコマンドを実行してtar.gzファイルを解凍します。
tar -xzvf apache-tomcat-9.0.104.tar.gz
3. 起動確認
Tomcatのbinディレクトリの中から以下の「startup.sh」を見つけます。
以下の、カレントディレクトリからの「startup.sh」の相対パスを貼り付けたコマンドでTomcat君を起動できます。
apache-tomcat-9.0.104/bin/startup.sh
以下にアクセスしてみましょう。
http://localhost:8080/
こんな感じでTomcatのページが表示されれば正常に起動されています!
パーティーをしましょう!
手順3 WARファイルをTomcatにデプロイ
さあ、いよいよ手順1で作ったWARファイルをTomcatにデプロイしましょう。
アプリの動作を見るのが楽しみですね。
以下のコマンドで、手順1で作ったWARファイルをTomcatのwebappsディレクトリにコピーします。
cp target/demo-1.0.war apache-tomcat-9.0.104/webapps
すると以下のようにwebapps配下に「demo-1.0」ディレクトリが自動作成されます。
この中のWEB-INFディレクトリに以下のような内容で「web.xml」ファイルを作成します。
<web-app>
<servlet>
<servlet-name>ScrapeSongTitlesServlet</servlet-name>
<servlet-class>com.example.ScrapeSongTitlesServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ScrapeSongTitlesServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
そして、以下のURL(localhost:8080/{WARファイルデプロイで自動作成されたディレクトリ名}/)にアクセスします。
http://localhost:8080/demo-1.0/
アプリが正常にデプロイされていれば、以下のようにJavaプログラムが起動されていると思います!
お疲れ様でした!
おわりに・まとめ
今回は自分でWebアプリを作ってみたいなと思い、手始めにTomcatをインストールして簡単なアプリをデプロイしてみました。
今後も、気が向いたらまた投稿するかもしれないので、そのときはよろしくお願いします。
楽しみながら開発を続けていけたらなと思っています!
この度は最後までお読みいただき、ありがとうございました!