1.3. Red Hat build of Apache Camel for Quarkus を使用した最初のプロジェクトのビルド
1.3.1. 概要 リンクのコピーリンクがクリップボードにコピーされました!
code.quarkus.redhat.com を使用して、Quarkus Maven プロジェクトを生成できます。このプロジェクトは、アプリケーションで使用するエクステンションを自動的に追加および設定します。
このセクションでは、Red Hat build of Apache Camel for Quarkus を使用して Quarkus Maven プロジェクトを作成するプロセスを説明します。このプロセスには以下が含まれます。
- code.quarkus.redhat.com を使用したスケルトンアプリケーションの作成
- 簡単な Camel ルートの追加
- アプリケーションコードの探索
- 開発モードでのアプリケーションのコンパイル
- アプリケーションのテスト
1.3.2. code.quarkus.redhat.com を使用したスケルトンアプリケーションの生成 リンクのコピーリンクがクリップボードにコピーされました!
code.quarkus.redhat.com で、プロジェクトのブートストラップと生成を行うことができます。
Red Hat build of Apache Camel for Quarkus エクステンションは、'Integration' という見出しの下にあります。
追加のエクステンションが必要な場合は、'search' フィールドを使用して見つけてください。
使用するコンポーネントエクステンションを選択し、'Generate your application' をクリックして基本的なスケルトンプロジェクトをダウンロードします。
プロジェクトを GitHub に直接プッシュすることもできます。
code.quarkus.redhat.com を使用して Quarkus Maven プロジェクトを生成する方法の詳細は、Red Hat build of Quarkus のスタートガイド の code.quarkus.redhat.com を使用した Quarkus Maven プロジェクトの作成 を参照してください。
手順
code.quarkus.redhat.com Web サイトで、次のエクステンションを選択します。
-
camel-quarkus-rest -
camel-quarkus-jackson camel-quarkus-direct注記code.quarkus.redhat.com のアプリケーションをコンパイルしないでください (手順の最終ステップ)。代わりに、以下の 「開発モード」 セクションで説明されているコンパイルコマンドを使用してください。
-
直前の手順で生成されたプロジェクトファイルの展開先ディレクトリーに移動します。
$ cd <directory_name>
1.3.3. アプリケーションコードの探索 リンクのコピーリンクがクリップボードにコピーされました!
このアプリケーションには、<dependencyManagement> でインポートされた com.redhat.quarkus.platform:quarkus-camel-bom 内で管理されるコンパイル依存関係が 2 つあります。
pom.xml
<quarkus.platform.artifact-id>quarkus-bom</quarkus.platform.artifact-id>
<quarkus.platform.group-id>com.redhat.quarkus.platform</quarkus.platform.group-id>
<quarkus.platform.version>
<!-- The latest 3.8.x version from https://maven.repository.redhat.com/ga/com/redhat/quarkus/platform/quarkus-bom -->
</quarkus.platform.version>
...
<dependency>
<groupId>${quarkus.platform.group-id}</groupId>
<artifactId>${quarkus.platform.artifact-id}</artifactId>
<version>${quarkus.platform.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>${quarkus.platform.group-id}</groupId>
<artifactId>quarkus-camel-bom</artifactId>
<version>${quarkus.platform.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
BOM 依存関係管理の詳細は、Red Hat build of Apache Camel for Quarkus を使用したアプリケーションの開発 を参照してください。
アプリケーションは、src/main/resources/application.properties 内で定義されたプロパティーで設定できます。たとえば、camel.context.name を設定できます。
1.3.4. 簡単な Camel ルートの追加 リンクのコピーリンクがクリップボードにコピーされました!
この例では、camel-quarkus-examples リポジトリーの簡単な例を使用します。これは、2 つの単純なクラス Fruit.java、Legume.java、およびルート定義 Routes.java で構成されています。
手順
-
src/main/java/org/acme/サブフォルダーにFruit.javaという名前のファイルを作成します。 以下のコードスニペットのようにクラスを追加します。
Fruit.java
package org.acme.rest.json; import java.util.Objects; import io.quarkus.runtime.annotations.RegisterForReflection; /** * A REST entity representing a fruit. */ @RegisterForReflection // Lets Quarkus register this class for reflection during the native build public class Fruit { private String name; private String description; public Fruit() { } public Fruit(String name, String description) { this.name = name; this.description = description; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } @Override public boolean equals(Object obj) { if (!(obj instanceof Fruit)) { return false; } Fruit other = (Fruit) obj; return Objects.equals(other.name, this.name); } @Override public int hashCode() { return Objects.hash(this.name); } }-
src/main/java/org/acme/サブフォルダーにLegume.javaという名前のファイルを作成します。 以下のコードスニペットのようにクラスを追加します。
Legume.java
package org.acme.rest.json; import java.util.Objects; import io.quarkus.runtime.annotations.RegisterForReflection; /** * A REST entity representing a legume. */ @RegisterForReflection // Lets Quarkus register this class for reflection during the native build public class Legume { private String name; private String description; public Legume() { } public Legume(String name, String description) { this.name = name; this.description = description; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } @Override public boolean equals(Object obj) { if (!(obj instanceof Legume)) { return false; } Legume other = (Legume) obj; return Objects.equals(other.name, this.name); } @Override public int hashCode() { return Objects.hash(this.name); } }-
src/main/java/org/acme/サブフォルダーにRoutes.javaという名前のファイルを作成します。 以下のコードスニペットのように Camel Rest ルートを追加します。
Routes.java
package org.acme.rest.json; import java.util.Collections; import java.util.LinkedHashSet; import java.util.Set; import org.apache.camel.builder.RouteBuilder; import org.apache.camel.model.rest.RestBindingMode; /** * Camel route definitions. */ public class Routes extends RouteBuilder { private final Set<Fruit> fruits = Collections.synchronizedSet(new LinkedHashSet<>()); private final Set<Legume> legumes = Collections.synchronizedSet(new LinkedHashSet<>()); public Routes() { /* Let's add some initial fruits */ this.fruits.add(new Fruit("Apple", "Winter fruit")); this.fruits.add(new Fruit("Pineapple", "Tropical fruit")); /* Let's add some initial legumes */ this.legumes.add(new Legume("Carrot", "Root vegetable, usually orange")); this.legumes.add(new Legume("Zucchini", "Summer squash")); } @Override public void configure() throws Exception { restConfiguration().bindingMode(RestBindingMode.json); rest("/fruits") .get() .to("direct:getFruits") .post() .type(Fruit.class) .to("direct:addFruit"); rest("/legumes") .get() .to("direct:getLegumes"); from("direct:getFruits") .setBody().constant(fruits); from("direct:addFruit") .process().body(Fruit.class, fruits::add) .setBody().constant(fruits); from("direct:getLegumes") .setBody().constant(legumes); } }この例の詳細は、camel-quarkus-examples リポジトリー を参照してください。
1.3.5. 開発モード リンクのコピーリンクがクリップボードにコピーされました!
$ mvn clean compile quarkus:dev
このコマンドでは、プロジェクトのコンパイル、アプリケーションの起動、Quarkus ツールでのワークスペースの変更監視などを行います。プロジェクトに加えた変更は、実行中のアプリケーションに自動的に反映されます。
ブラウザーでアプリケーションを確認できます。(たとえば、rest-json サンプルアプリケーションの場合は、http://localhost:8080/fruits にアクセスします。)
アプリケーションコードを変更する場合 (例: 'Apple' を 'Orange' に変更)、アプリケーションは自動的に更新されます。適用された変更を確認するには、ブラウザーを更新してください。
開発モードの詳細は、Quarkus のドキュメントの 開発モード のセクションを参照してください。
1.3.6. テスト リンクのコピーリンクがクリップボードにコピーされました!
1.3.6.1. JVM モード リンクのコピーリンクがクリップボードにコピーされました!
JVM モードで作成した Camel Rest ルートをテストするには、以下のようにテストクラスを追加します。
手順
-
src/test/java/org/acme/サブフォルダーにRoutesTest.javaという名前のファイルを作成します。 以下のコードスニペットのように
RoutesTestクラスを追加します。RoutesTest.java
package org.acme.rest.json; import io.quarkus.test.junit.QuarkusTest; import org.junit.jupiter.api.Test; import static io.restassured.RestAssured.given; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.Matchers.containsInAnyOrder; /** * JVM mode tests. */ @QuarkusTest public class RestJsonTest { @Test public void fruits() { /* Assert the initial fruits are there */ given() .when().get("/fruits") .then() .statusCode(200) .body( "$.size()", is(2), "name", containsInAnyOrder("Apple", "Pineapple"), "description", containsInAnyOrder("Winter fruit", "Tropical fruit")); /* Add a new fruit */ given() .body("{\"name\": \"Pear\", \"description\": \"Winter fruit\"}") .header("Content-Type", "application/json") .when() .post("/fruits") .then() .statusCode(200) .body( "$.size()", is(3), "name", containsInAnyOrder("Apple", "Pineapple", "Pear"), "description", containsInAnyOrder("Winter fruit", "Tropical fruit", "Winter fruit")); } @Test public void legumes() { given() .when().get("/legumes") .then() .statusCode(200) .body("$.size()", is(2), "name", containsInAnyOrder("Carrot", "Zucchini"), "description", containsInAnyOrder("Root vegetable, usually orange", "Summer squash")); } }
JVM モードテストは、Maven の test フェーズで maven-surefire-plugin によって実行されます。
$ mvn clean test
1.3.6.2. ネイティブモード リンクのコピーリンクがクリップボードにコピーされました!
ネイティブモードで作成した Camel Rest ルートをテストするには、以下のようにテストクラスを追加します。
手順
-
src/test/java/org/acme/サブフォルダーにNativeRoutesIT.javaという名前のファイルを作成します。 以下のコードスニペットのように
NativeRoutesITクラスを追加します。NativeRoutesIT.java
package org.acme; import io.quarkus.test.junit.NativeImageTest; @NativeImageTest public class NativeRoutesIT extends RoutesTest { // Execute the same tests but in native mode. }ネイティブモードテストは、
verifyフェーズでmaven-failsafe-pluginを使用して検証されます。nativeプロパティーを渡して、テストを実行するプロファイルをアクティベートします。$ mvn clean verify -Pnative
詳細と、CamelTestSupport スタイルのテストの使用方法は、Camel Quarkus 拡張機能のテスト を参照してください。
1.3.7. アプリケーションのパッケージ化と実行 リンクのコピーリンクがクリップボードにコピーされました!
1.3.7.1. JVM モード リンクのコピーリンクがクリップボードにコピーされました!
手順
mvn packageを実行して、ストック JVM で実行するための thinjarを準備します。$ mvn clean package $ ls -lh target/quarkus-app ... -rw-r--r--. 1 user user 238K Oct 11 18:55 quarkus-run.jar ...注記シン形式の
jarにはアプリケーションコードのみが含まれます。実行するには、target/quarkus-app/libの依存関係も必要です。次のように jar を実行します。
$ java -jar target/quarkus-app/quarkus-run.jar ... [io.quarkus] (main) Quarkus started in 1.163s. Listening on: http://[::]:8080
起動時間は約 1 秒です。
1.3.7.2. ネイティブモード リンクのコピーリンクがクリップボードにコピーされました!
手順
ネイティブ実行可能ファイルを準備するには、次のようにします。
コマンド
mvn clean package -Pnativeを実行します。$ mvn clean package -Pnative $ ls -lh target ... -rwxr-xr-x. 1 user user 46M Oct 11 18:57 code-with-quarkus-1.0.0-SNAPSHOT-runner ...注記runnerには.jar拡張子がなく、x(実行可能) パーミッションが設定されています。これは次のように直接実行できます。$ ./target/*-runner ... [io.quarkus] (main) Quarkus started in 0.013s. Listening on: http://[::]:8080 ...アプリケーションは 13 ミリ秒で開始しました。
ps -o rss,command -p $(pgrep code-with)コマンドでメモリー使用量を表示します。$ ps -o rss,command -p $(pgrep code-with) RSS COMMAND 65852 ./target/code-with-quarkus-1.0.0-SNAPSHOT-runnerアプリケーションは 65 MB のメモリーを使用します。
ネイティブ実行可能ファイルの準備に関する追加情報は、Quarkus アプリケーションのネイティブ実行可能ファイルへのコンパイル ガイドの ネイティブ実行可能ファイルの作成 を参照してください。
Quarkus Native executable guide には、コンテナーイメージを作成する手順 などの詳細情報が記載されています。