0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Java JAX-RS Webサービスで Hello World する

Last updated at Posted at 2023-03-09

Java JAX-RS Webサービスで Hello World する

こんにちは、@studio_meowtoon です。今回は、WSL の Ubuntu 22.04 で Java JAX-RS Web アプリケーションを作成して Hello World を出力する方法を紹介します。
java_on_jetty.png

目的

Windows 11 の Linux でクラウド開発します。

こちらから記事の一覧がご覧いただけます。

実現すること

ローカル環境の Ubuntu で、Java JAX-RS の WAR ファイル形式のアプリをビルド、起動します。

WAR ファイル形式のアプリを起動

要素 概要
terminal ターミナル
Ubuntu OS
JVM Java 実行環境
jetty Web サーバー
app.war Java アプリケーション

技術トピック

JAX-RS とは?

こちらを展開してご覧いただけます。

JAX-RS

JAX-RS は、Java API for RESTful Web Services の略称で、Java プラットフォーム上で RESTful Web サービスを開発するための API です。JAX-RS は、HTTP リクエストを受け取り、レスポンスを生成するための標準的な方法を提供します。

特徴
Java EE の一部であり、Java プラットフォーム上で RESTful Web サービスを開発するための API です。
HTTP リクエストを受け取り、レスポンスを生成するための標準的な方法を提供します。
Java メソッドやクラスに RESTful リソースをマッピングするためのアノテーションを提供します。
HTTP リクエストの解析や生成、HTTP レスポンスの生成など、RESTful Web サービスのための機能を提供するためのクラスやインターフェースを含んでいます。
RESTful Web サービスの開発に必要な多くの機能を提供するため、Java ベースのウェブサービス開発に広く採用されています。
Java EE アプリケーションサーバーの標準機能としてサポートされているため、Java EE アプリケーションの一部として使用されることもあります。
HTTP メソッド、HTTP ヘッダー、クエリパラメータ、パスパラメータなど、RESTful Web サービスの開発に必要な機能を提供します。
JSON や XML などのさまざまなデータフォーマットに対応しています。
拡張性が高く、カスタムの機能を追加することができます。
軽量で、シンプルな API を提供するため、RESTful Web サービスの開発に向いています。

Java EE は、2018年に Jakarta EE に名前が変更されました。これは、Oracle が Java EE の商標権を Eclipse Foundation に譲渡したことが理由です。Java EE からの変更点としては、主に商標やライセンスの変更があります。

開発環境

  • Windows 11 Home 22H2 を使用しています。

WSL の Ubuntu を操作していきますので macOS の方も参考にして頂けます。

WSL (Microsoft Store アプリ版) ※ こちらの関連記事からインストール方法をご確認いただけます

> wsl --version
WSL バージョン: 1.0.3.0
カーネル バージョン: 5.15.79.1
WSLg バージョン: 1.0.47

Ubuntu ※ こちらの関連記事からインストール方法をご確認いただけます

$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 22.04.1 LTS
Release:        22.04

Java JDK ※ こちらの関連記事からインストール方法をご確認いただけます

$ java -version
openjdk version "11.0.18" 2023-01-17
OpenJDK Runtime Environment (build 11.0.18+10-post-Ubuntu-0ubuntu122.04)
OpenJDK 64-Bit Server VM (build 11.0.18+10-post-Ubuntu-0ubuntu122.04, mixed mode, sharing)

Maven ※ こちらの関連記事からインストール方法をご確認いただけます

$ mvn -version
Apache Maven 3.6.3
Maven home: /usr/share/maven
Java version: 11.0.18, vendor: Ubuntu, runtime: /usr/lib/jvm/java-11-openjdk-amd64

この記事では基本的に Ubuntu のターミナルで操作を行います。Vim を使用してコピペする方法を初めて学ぶ人のために、以下の記事で手順を紹介しています。ぜひ挑戦してみてください。

作成する Web アプリケーションの仕様

No エンドポイント HTTPメソッド MIME タイプ
1 /api/data GET application/json

/api/data というエンドポイントに対して HTTP GET リクエストを送信すると、JSON データがレスポンスされるシンプルな Web サービスを実装します。
{"message":"Hello World!"}

Hello World を表示する手順

プロジェクトの作成

プロジェクトフォルダを作成します。
※ ~/tmp/hello-jaxrs をプロジェクトフォルダとします。

$ mkdir -p ~/tmp/hello-jaxrs
$ cd ~/tmp/hello-jaxrs

リソースクラスの作成

リソースクラスを作成します。

$ mkdir -p src/main/java/com/example/jaxrs
$ vim src/main/java/com/example/jaxrs/HelloResource.java

ファイルの内容

HelloResource.java
package com.example.jaxrs;

import java.util.Map;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

@Path("api")
public class HelloResource {

    @GET
    @Path("data")
    @Produces(MediaType.APPLICATION_JSON)
    public Map<String, String> getData() {
        Map<String, String> map = Map.of("message", "Hello World!");
        return map;
    }
}
説明を開きます。

このコードは、JAX-RS を使用して RESTful Web サービスのエンドポイントを作成しています。

内容
com.example.jaxrs というパッケージに HelloResource クラスを定義しています。
@Path("api") アノテーションを使用して、api というパスに関連付けられたリソースを作成しています。
@GET アノテーションを使用して、HTTP GET リクエストに応答するメソッドを作成しています。
@Produces(MediaType.APPLICATION_JSON) アノテーションを使用して、このメソッドが JSON 形式で応答することを指定しています。
@Path("data") アノテーションを使用して、data というパスに関連付けられたメソッドを作成しています。
public Map getData() メソッドは、Map 形式で message キーと Hello World! の値を持つオブジェクトを返します。

つまり、このコードは http://localhost:8080/api/data にアクセスすると、JSON 形式で {"message":"Hello World!"} というレスポンスを返す Web サービスのエンドポイントを作成しています。

web.xml の作成

web.xml ファイルを作成します。

$ mkdir -p src/main/webapp/WEB-INF
$ vim src/main/webapp/WEB-INF/web.xml

ファイルの内容

web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
    version="4.0">

    <servlet>
        <servlet-name>jaxrs-servlet</servlet-name>
        <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
        <init-param>
            <param-name>jersey.config.server.provider.packages</param-name>
            <param-value>com.example.jaxrs</param-value>
        </init-param>
    </servlet>

    <servlet-mapping>
        <servlet-name>jaxrs-servlet</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>
</web-app>
説明を開きます。

この XML ファイルは、Java EE Web アプリケーションで Jersey を使用するための設定ファイルです。Web アプリケーションのサーブレットコンテナーによって読み込まれます。

内容
設定ファイルには、Jersey サーブレットの設定が含まれており、jersey.config.server.provider.packages パラメータを使用して、 Jersey がスキャンするパッケージを指定しています。
com.example.jaxrs パッケージが指定されており、Jersey はこのパッケージ内の RESTful Web サービスを検出し、適切に処理するようになります。

pom.xml の作成

pom.xml ファイルを作成します。

$ vim pom.xml

ファイルの内容

pom.xml
<?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>hello-jaxrs</artifactId>
    <packaging>war</packaging>
    <version>1.0</version>
    <name>hello-jaxrs</name>

    <properties>
        <javax.servlet.version>4.0.1</javax.servlet.version>
        <java.version>11</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
        <!-- Jackson -->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.14.2</version>
        </dependency>
        
        <!-- JAX-RS -->
        <dependency>
            <groupId>javax.ws.rs</groupId>
            <artifactId>javax.ws.rs-api</artifactId>
            <version>2.1.1</version>
        </dependency>

        <!-- Jersey -->
        <dependency>
            <groupId>org.glassfish.jersey.containers</groupId>
            <artifactId>jersey-container-servlet</artifactId>
            <version>2.39</version>
        </dependency>
        <dependency>
            <groupId>org.glassfish.jersey.inject</groupId>
            <artifactId>jersey-hk2</artifactId>
            <version>2.39</version>
        </dependency>
        <dependency>
            <groupId>org.glassfish.jersey.media</groupId>
            <artifactId>jersey-media-json-binding</artifactId>
            <version>2.39</version>
        </dependency>

        <!-- Servlet -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>${javax.servlet.version}</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>

    <build>
        <finalName>app</finalName>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>${java.version}</source>
                    <target>${java.version}</target>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <version>3.2.3</version>
              </plugin>
            <plugin>
                <groupId>org.eclipse.jetty</groupId>
                <artifactId>jetty-maven-plugin</artifactId>
                <version>10.0.13</version>
                <configuration>
                    <scanIntervalSeconds>10</scanIntervalSeconds>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>
説明を開きます。

Maven プロジェクトのプロジェクトオブジェクトモデル (POM) です。プロジェクトの情報、依存関係、ビルド設定などが含まれています。

各項目は以下のとおりです。

項目 内容
groupId プロジェクトのグループIDを定義します。
artifactId プロジェクトのアーティファクトIDを定義します。
packaging プロジェクトのパッケージングタイプを定義します。(例えば、jar、war、pom など)
version プロジェクトのバージョンを定義します。
name プロジェクトの表示名を定義します。
properties プロジェクトで使用されるプロパティー値を定義します。
javax.servlet.version サーブレット API のバージョンを定義します。
java.version Java のバージョンを定義します。
dependencies 依存関係のリストを定義します。ここでは、Web アプリケーションで使用される Servlet や JAX-RS のライブラリに依存しています。
build プロジェクトのビルド設定を定義します。ここでは、Maven コンパイラプラグインを使用して Java バージョン11 でコンパイルするように指定し、Jetty Web サーバを Maven プラグインとして使用できるようにします。また、最終的に生成される WAR ファイルの名前を ${name} に設定しています。
依存関係 内容
Jackson Java オブジェクトと JSON データの相互変換を行うためのライブラリです。
JAX-RS Java で RESTful Web サービスを構築するための API 仕様です。
Jersey JAX-RS API を実装したライブラリで、サーブレットとして実行できる RESTful Web サービスを構築するためのものです。
Servlet Java Servlet API の実装ライブラリ。Maven の scope を provided に設定することで、アプリケーションが実行されるサーブレットコンテナから提供される Servlet API の実装を使用するように設定します。

ディレクトリ・ファイル構成

プロジェクトのファイル構成を表示してみます。

$ tree
.
├── pom.xml
└── src
    └── main
        ├── java
        │   └── com
        │       └── example
        │           └── jaxrs
        │               └── HelloResource.java
        └── webapp
            └── WEB-INF
                └── web.xml
説明を開きます。
No ファイル 内容
1 pom.xml Maven プロジェクトの設定ファイルであり、プロジェクトの依存関係やビルド設定を定義します。
2 HelloResource.java JAX-RS API を使用して HTTP GET リクエストを受信し、それに対するレスポンスを返します。特定の URL パスにマッピングされたメソッドを提供し、クライアントとの間でデータの受け渡しを行うために使用されます。
3 web.xml アプリケーションの URL パターン、サーブレットのクラス名、JAX-RS アプリケーションクラスの名前など、サービスを定義するための設定が含まれます。

JAX-RS アプリを構成するために作成したファイルは、今回の例では3つだけです。これらのファイルを組み合わせることで、JAX-RS アプリケーションを構築することができます。

JAX-RS アプリをビルド、実行

Java アプリをビルドします。(※ 参考)
※ target/app.war が作成されます。

$ mvn clean package

アプリを起動します。 (※ ctrl + C で停止します)

$ mvn jetty:run

mvn jetty:run コマンドは、Maven のプラグインにより Jetty Web サーバーを一時的に立ち上げ、その中で WAR ファイル形式の Web アプリケーションが実行されます。

別ターミナルから curl コマンドで確認します。

$ curl -v http://localhost:8080/api/data -w '\n'

出力

*   Trying 127.0.0.1:8080...
* Connected to localhost (127.0.0.1) port 8080 (#0)
> GET /api/data HTTP/1.1
> Host: localhost:8080
> User-Agent: curl/7.81.0
> Accept: */*
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< Date: Thu, 09 Mar 2023 05:42:30 GMT
< Content-Type: application/json
< Content-Length: 26
< Server: Jetty(10.0.13)
<
* Connection #0 to host localhost left intact
{"message":"Hello World!"}

ここまでの手順で、ターミナルに {"message":"Hello World!"} と表示され、JSON データを取得することが出来ました。

まとめ

Ubuntu に構築したシンプルな Java 開発環境で、JAX-RS の Web サービスを実行することができました。

実際の業務での JAX-RS の使用ケースでは、構成ファイルなどが追加されるため、ここで示したようなシンプルな構成とは異なる場合があります。しかしながら、最小構成の例を学ぶことで、JAX-RS がどのような構成が必要なのかを理解することができます。

どうでしたか? WSL Ubuntu で、JAX-RS Web アプリケーションを手軽に実行することができます。ぜひお試しください。今後も Java の開発環境などを紹介していきますので、ぜひお楽しみにしてください。

推奨コンテンツ

関連記事

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?