2.12. Camel Maven プラグイン
Camel Maven プラグインは以下のゴールをサポートします。
- camel:run - Camel アプリケーションを実行します。
- camel:validate - ソースコードを検証し、無効な Camel エンドポイント URI を検査します。
- camel:route-coverage - ユニットテストの実行後、Camel ルートのカバレッジを報告します。
2.12.1. camel:run
Camel Maven プラグインのゴール camel:run
は、Maven からフォークされた JVM で Camel Spring 設定を実行するために使用されます。初めて使用する場合、アプリケーションサンプルとして Spring サンプルを使用するとよいでしょう。
cd examples/camel-example-spring mvn camel:run
これにより、main(...) メソッドを書かなくても、ルーティングルールを起動してテストすることが非常に容易になります。また、複数の jar を作成して、さまざまなルーティングルールのセットをホストし、それらを簡単に個別にテストすることもできます。Camel Maven プラグインは maven プロジェクトのソースコードをコンパイルし、META-INF/spring/*.xml
のクラスパスの XML 設定ファイルを使用して Spring ApplicationContext を起動します。Camel のルートをもう少し速く起動する場合は、代わりに camel:embedded
を試してみてください。
2.12.1.1. オプション
Camel Maven プラグインの run ゴールは、以下のオプションをサポートします。これらのオプションは、コマンドラインから設定するか (-D
構文を使用)、<configuration>
タグの pom.xml
ファイルで定義します。
パラメーター | デフォルト値 | 説明 |
duration | -1 | アプリケーションが終了する前に実行される期間 (秒単位) を設定します。0 以下の値を指定すると、永久に実行されます。 |
durationIdle | -1 | アプリケーションが終了する前にアイドル状態でいられる期間 (秒単位) を設定します。0 以下の値を指定すると、永久に実行されます。 |
durationMaxMessages | -1 | アプリケーションが終了する前にアプリケーションが処理するメッセージ最大数の期間を設定します。 |
logClasspath | false | 起動時にクラスパスをログに記録するかどうか。 |
2.12.1.2. OSGi Blueprint の実行
camel:run
プラグインは、Blueprint アプリケーションの実行もサポートします。デフォルトでは、OSGI-INF/blueprint/*.xml
の OSGi Blueprint ファイルがスキャンされます。以下のように useBlueprint を true に設定して、camel:run プラグインが Blueprint を使用するように設定する必要があります。
<plugin> <groupId>org.jboss.redhat-fuse</groupId> <artifactId>camel-maven-plugin</artifactId> <configuration> <useBlueprint>true</useBlueprint> </configuration> </plugin>
これにより、Camel 関連だけでなく、他の Blueprint サービスも起動することができます。camel:run
ゴールは、camel-blueeprint がクラスパス上にあるか、またはプロジェクト内に blueeprint XML ファイルがある場合は、自動検出することができるので、useBlueprint
オプションを設定する必要がありません。
2.12.1.3. 制限された Blueprint コンテナーの使用
Blueprint のコンテナーとして Felix Connector プロジェクトを使用しています。Felix は完全な Blueprint コンテナーではありません。完全な Blueprint コンテナーで実行する場合は、Apache Karaf または Apache ServiceMix を使用できます。applicationContextUri
設定を使用して、明示的な Blueprint XML ファイルを指定できます。例を以下に示します。
<plugin> <groupId>org.jboss.redhat-fuse</groupId> <artifactId>camel-maven-plugin</artifactId> <configuration> <useBlueprint>true</useBlueprint> <applicationContextUri>myBlueprint.xml</applicationContextUri> <!-- ConfigAdmin options which have been added since Camel 2.12.0 --> <configAdminPid>test</configAdminPid> <configAdminFileName>/user/test/etc/test.cfg</configAdminFileName> </configuration> </plugin>
applicationContextUri
はクラスパスからファイルをロードするので、上の例では myBlueprint.xml
ファイルはクラスパスのルートになければなりません。configAdminPid
は pid 名で、persistence プロパティーファイルを読み込む際に、設定管理サービスの pid 名として使用されます。configAdminFileName
は、設定管理サービスのプロパティーファイルを読み込むために使用されるファイル名です。
2.12.1.4. CDI の実行
camel:run
プラグインは、CDI アプリケーションの実行もサポートします。これにより、Camel 関連だけでなく、すべての CDI 対応サービスを起動できます。下記の例のように、CDI コンテナー (Weld や OpenWebBeans など) を camel-maven-plugin の依存関係に追加する必要があります。Camel のソースからは、以下のように CDI のサンプルを実行できます。
cd examples/camel-example-cdi mvn compile camel:run
2.12.1.5. クラスパスのロギング
camel:run
の実行時に、クラスパスをログに記録するかどうかを設定できます。以下のコマンドを使用して、この設定を有効できます。
<plugin> <groupId>org.jboss.redhat-fuse</groupId> <artifactId>camel-maven-plugin</artifactId> <configuration> <logClasspath>true</logClasspath> </configuration> </plugin>
2.12.1.6. XML ファイルのライブリロードの使用
XML ファイルの変更をスキャンし、それらの XML ファイルに含まれる Camel ルートのリロードをトリガーするように、プラグインを設定できます。
<plugin> <groupId>org.jboss.redhat-fuse</groupId> <artifactId>camel-maven-plugin</artifactId> <configuration> <fileWatcherDirectory>src/main/resources/META-INF/spring</fileWatcherDirectory> </configuration> </plugin>
設定後、プラグインはこのディレクトリーの監視を開始します。エディターからソースコードを編集して保存すると、変更後の内容が実行中の Camel アプリケーションに適用されます。<routes>
や <route>
などの Camel ルートへの変更のみがサポートされることに注意してください。Spring や OSGi Blueprint の <bean>
要素を変更することはできません。
2.12.2. camel:validate
以下の Camel 機能のソースコード検証の場合
- エンドポイント URI
- Simple 式または述語
- ルート ID の重複
次に、コマンドラインまたは、IDEA や Eclipse などの Java エディターから、camel:validate
ゴールを実行できます。
mvn camel:validate
また、プラグインを有効にしてビルドの一部として自動的に実行し、エラーを検出することも可能です。
<plugin> <groupId>org.jboss.redhat-fuse</groupId> <artifactId>camel-maven-plugin</artifactId> <executions> <execution> <phase>process-classes</phase> <goals> <goal>validate</goal> </goals> </execution> </executions> </plugin>
フェーズは、プラグインがいつ実行されるかを決定します。上記の例では、メインのソースコードのコンパイル後に実行される process-classes
がフェーズになります。この maven プラグインは、テストソースコードを検証するように設定することもできます。以下に示すように、フェーズを process-test-classes
に合わせて変更してください。
<plugin> <groupId>org.jboss.redhat-fuse</groupId> <artifactId>camel-maven-plugin</artifactId> <executions> <execution> <configuration> <includeTest>true</includeTest> </configuration> <phase>process-test-classes</phase> <goals> <goal>validate</goal> </goals> </execution> </executions> </plugin>
2.12.2.1. 任意の Maven プロジェクトでのゴール実行
プラグインを pom.xml
ファイルに追加せずに Maven プロジェクトで validate ゴールを実行することもできます。この場合、完全修飾名を使用してプラグインを指定する必要があります。たとえば、Apache Camel から camel-example-cdi
でゴールを実行するには、次のように実行します。
$cd camel-example-cdi $mvn org.apache.camel:camel-maven-plugin:2.20.0:validate
このコマンドを実行すると以下が出力されます。
[INFO] ------------------------------------------------------------------------ [INFO] Building Camel :: Example :: CDI 2.20.0 [INFO] ------------------------------------------------------------------------ [INFO] [INFO] --- camel-maven-plugin:2.20.0:validate (default-cli) @ camel-example-cdi --- [INFO] Endpoint validation success: (4 = passed, 0 = invalid, 0 = incapable, 0 = unknown components) [INFO] Simple validation success: (0 = passed, 0 = invalid) [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------
validate は成功し、4 つのエンドポイントが検証されます。ここで、ソースコードの Camel エンドポイント URI の 1 つに、以下のようなタイプミスがあったとします。
@Uri("timer:foo?period=5000")
period
オプションを以下のように変更し、タイプミスが含まれるようにします。
@Uri("timer:foo?perid=5000")
validate ゴールを再度実行すると、以下が報告されます。
[INFO] ------------------------------------------------------------------------ [INFO] Building Camel :: Example :: CDI 2.20.0 [INFO] ------------------------------------------------------------------------ [INFO] [INFO] --- camel-maven-plugin:2.20.0:validate (default-cli) @ camel-example-cdi --- [WARNING] Endpoint validation error at: org.apache.camel.example.cdi.MyRoutes(MyRoutes.java:32) timer:foo?perid=5000 perid Unknown option. Did you mean: [period] [WARNING] Endpoint validation error: (3 = passed, 1 = invalid, 0 = incapable, 0 = unknown components) [INFO] Simple validation success: (0 = passed, 0 = invalid) [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------
2.12.2.2. オプション
Camel Maven プラグインの validate ゴールは、以下のオプションをサポートします。これらのオプションは、コマンドラインから設定するか (-D
構文を使用)、<configuration>
タグの pom.xml
ファイルで定義します。
パラメーター | デフォルト値 | 説明 |
downloadVersion | true | インターネットからの Camel カタログバージョンのダウンロードを許可するかどうか。プロジェクトが使用する Camel バージョンと、このプラグインがデフォルトで使用する Camel バージョンが異なる場合にダウンロードが必要です。 |
failOnError | false | 無効な Camel エンドポイントが見つかった場合に失敗するかどうか。デフォルトでは、WARN レベルでエラーがプラグインログに記録されます。 |
logUnparseable | false | 解析不可のため検証できないエンドポイント URI をログに記録するかどうか。 |
includeJava | true | 無効な Camel エンドポイントの検証対象となる Java ファイルを含めるかどうか。 |
includeXml | true | 無効な Camel エンドポイントの検証対象となる XML ファイルを含めるかどうか。 |
includeTest | false | テストソースコードを含めるかどうか。 |
includes | Java および xml ファイルの名前を絞り込み、指定されたパターンのリスト (ワイルドカードおよび正規表現) と一致するファイルのみが含まれるようにします。複数の値はコンマで区切ることができます。 | |
excludes | Java および xml ファイルの名前を絞り込み、指定されたパターンのリスト (ワイルドカードおよび正規表現) と一致するファイルが除外されるようにします。複数の値はコンマで区切ることができます。 | |
ignoreUnknownComponent | true | 不明なコンポーネントを無視するかどうか。 |
ignoreIncapable | true | 解析不可なエンドポイント URI や、Simple 式を無視するかどうか。 |
ignoreLenientProperties | true | lenient プロパティーを使用するコンポーネントを無視するかどうか。true の場合、URI の検証はより厳密になりますが、lenient プロパティーを使用するため、URI にあってもコンポーネントの一部でないプロパティーでは検証に失敗することがあります。たとえば、HTTP コンポーネントを使用して、エンドポイント URI でクエリーパラメーターを提供する場合がこれに該当します。 |
ignoreDeprecated | true | Camel 2.23 の場合: エンドポイント URI で使用される非推奨のオプションを無視するかどうか。 |
duplicateRouteId | true | Camel 2.20 の場合: ルート ID の重複を検証するかどうか。ルート ID は一意である必要があります。重複がある場合、Camel は起動に失敗します。 |
directOrSedaPairCheck | true | Camel 2.23 の場合: direct/seda エンドポイントが未定義コンシューマーに送信しているかを検証するかどうか。 |
showAll | false | エンドポイントと Simple 式 (無効と有効の両方) をすべて表示するかどうか。 |
たとえば、コマンドラインから ignoreDeprecated オプションを無効するには、以下を実行します。
$mvn camel:validate -Dcamel.ignoreDeprecated=false
オプション名として、-D
コマンド引数の前に camel.
(例: camel.ignoreDeprecated
) を付ける必要があります。
2.12.2.3. include テストを使用したエンドポイントの検証
Maven プロジェクトの場合、プラグインを実行してユニットテストのソースコードで使用されるエンドポイントを検証することもできます。以下のように -D
スタイルを使用してオプションを渡すことができます。
$cd myproject $mvn org.apache.camel:camel-maven-plugin:2.20.0:validate -DincludeTest=true
2.12.3. camel:route-coverage
ユニットテストから Camel ルートのカバレッジのレポートを生成するために使用します。これを使用することによって、Camel ルートのどの部分が使用されたかを把握することができます。
2.12.3.1. route-coverage の有効化
以下のいずれかの方法で、ユニットテスト実行時に route-coverage を有効化できます。
- グローバル JVM システムプロパティーを設定してすべてのテストクラスで有効。
-
camel-test-spring
モジュールを使用する場合、テストクラスごとの@EnableRouteCoverage
アノテーションの使用 -
camel-test
モジュールを使用する場合、テストクラスごとのisDumpRouteCoverage
メソッドの上書き
2.12.3.2. JVM システムプロパティーを使用した route-coverage の有効化
JVM システムプロパティー CamelTestRouteCoverage
をオンにして、すべてのテストケースの route-coverage を有効にできます。これは、maven-surefire-plugin
設定のいずれかで実行できます。
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <configuration> <systemPropertyVariables> <CamelTestRouteCoverage>true</CamelTestRouteCoverage> </systemPropertyVariables> </configuration> </plugin>
テストの実行中にコマンドラインから設定する場合は次のとおりです。
mvn clean test -DCamelTestRouteCoverage=true
2.12.3.3. @EnableRouteCoverage アノテーションでの route-coverage の有効化
camel-test-spring
を使用してテストする場合は、@EnableRouteCoverage
アノテーションをテストクラスに追加することで、ユニットテストクラスで route-coverage を有効にすることができます。
@RunWith(CamelSpringBootRunner.class) @SpringBootTest(classes = SampleCamelApplication.class) @EnableRouteCoverage public class FooApplicationTest {
2.12.3.4. isDumpRouteCoverage メソッドでの route-coverage の有効化
camel-test
を使っていて、ユニットテストが CamelTestSupport
を拡張している場合は、以下に示すように route-coverage を有効にすることができます。
@Override public boolean isDumpRouteCoverage() { return true; }
RouteCoverage メソッドで対象指定できるルートには、固有の ID が割り当てられている必要があります。つまり、匿名ルートは使用できません。Java DSL で routeId
を使用して行います。
from("jms:queue:cheese").routeId("cheesy") .to("log:foo") ...
また、XML DSL で id 属性を介してルート ID を付与します。
<route id="cheesy"> <from uri="jms:queue:cheese"/> <to uri="log:foo"/> ... </route>
2.12.3.5. route-coverage レポートの生成
route-coverage レポートを生成するには、以下のようにユニットテストを実行します。
mvn test
そして、Maven ゴールを実行して、以下のように route-coverage レポートを生成できます。
mvn camel:route-coverage
生成されるレポートでは、ソースコードの行番号でどのルートのルートのカバレッジがないかを確認できます。
[INFO] --- camel-maven-plugin:2.21.0:route-coverage (default-cli) @ camel-example-spring-boot-xml --- [INFO] Discovered 1 routes [INFO] Route coverage summary: File: src/main/resources/my-camel.xml RouteId: hello Line # Count Route ------ ----- ----- 28 1 from 29 1 transform 32 1 filter 34 0 to 36 1 to Coverage: 4 out of 5 (80.0%)
この例では、to
のある最後から 2 番目の行のカウント列が 0
であるため、カバレッジがないことが分かります。また、これはソースコードファイル (XML ファイル my-camel.xml
) の 34 行目であることも分かります。
2.12.3.6. オプション
Camel Maven プラグインの coverage ゴールは、以下のオプションをサポートします。これらのオプションは、コマンドラインから設定するか (-D
構文を使用)、<configuration>
タグの pom.xml
ファイルで定義します。
パラメーター | デフォルト値 | 説明 |
failOnError | false | いずれかのルートのカバレッジが 100% でない場合に失敗するかどうか。 |
includeTest | false | テストソースコードを含めるかどうか。 |
includes | Java および xml ファイルの名前を絞り込み、指定されたパターンのリスト (ワイルドカードおよび正規表現) と一致するファイルのみが含まれるようにします。複数の値はコンマで区切ることができます。 | |
excludes | Java および xml ファイルの名前を絞り込み、指定されたパターンのリスト (ワイルドカードおよび正規表現) と一致するファイルが除外されるようにします。複数の値はコンマで区切ることができます。 | |
anonymousRoutes | false | 匿名ルート (ルート ID が割り当てられていないルート) を許可するかどうか。ルート ID を使用することで、正確にルートカバレッジのデータをルートのソースコードとマッチングさせることができます。匿名ルートは、テストされたルートがソースコードのどのルートに対応しているかを正確に知ることが難しくなるため、ルートカバレッジの結果の精度が低くなります。 |