Posted at

Apache Camelの新規プロジェクトをEclipse+Mavenで作成する


はじめに

Apache CamelはMavenを使用して構築されており、自分でプロジェクトを作成するのもMavenを使用するのが最も簡単な方法です。

本記事では以下について説明します。


  • CamelのMavenアーキタイプの種類

  • EclipseにCamelのMavenアーキタイプを登録する

  • Eclipseでアーキタイプを使用してCamelプロジェクトを作成する

  • 作成したCamelプロジェクトを実行する


CamelのMavenアーキタイプの種類

Mavenのアーキタイプとは、新しいプロジェクトを素早く作成するのに役立つテンプレートです。Mavenでアーキタイプを使った新しいプロジェクトを作成することができます。

Camelで利用できるMavenアーキタイプは10種類以上あり、そのうちアプリケーションを構築する際によく利用されるのは以下の種類になります。

アーキタイプ
説明

camel-archetype-spring
Spring XML DSLを使用してルートを作成するCamelプロジェクトを作成します。

camel-archetype-cdi
CDIを使用したCamelプロジェクトを作成します。

camel-archetype-java
Java DSLを使用してルートを作成するCamelプロジェクトを作成します。

camel-archetype-java8
Java DSLを使用してルートを作成するCamelプロジェクトを作成します。ルートがラムダ式を用いているなど、Java8のスタイルになっています。

camel-archetype-activemq
ActiveMQを構成して対話する新しいCamelプロジェクトを作成します

camel-archetype-spring-boot
Spring Bootを使用してルートを作成するCamelプロジェクトを作成します。

camel-archetype-web
Spring XML DSLを使用してルートを作成する、WebアプリケーションのCamelプロジェクトを作成します。

他にも独自のコンポーネントを作成したり、OSGi Blueprint用のプロジェクトを作成するアーキタイプがあります。

Camelで使用できるすべてのアーキタイプは以下の公式サイトを参照してください。

https://mvnrepository.com/artifact/org.apache.camel.archetypes


EclipseにCamelのMavenアーキタイプを登録する

EclipseでMavenを使用してCamelプロジェクトを作成する方法を説明します。Java開発者向けのEclipseにはデフォルトでMavenがインストールされており、EclipseをインストールすればすぐにMavenを使用することができます。

まず、EclipseでCamelのMavenアーキテクトを使用できるように設定します。

Eclipseのメニューから、「ウィンドウ」-「設定」を選択します。

次に、設定ダイアログの左側のメニューから「Maven」-「アーキタイプ」を選択します。

image.png

上の画面の状態で、「リモート・カタログの追加」をクリックします。

image.png

カタログ・ファイルには以下のURLを入力します。

 image.png

 https://repository.apache.org/content/groups/public/

「説明」は任意の文字列をカタログ・ファイルの名前として指定するので、ここでは「Apache Camel」と入力しておきます。これで設定は完了ですので、後は「OK」ボタンを押して、最後に「適用」ボタンを押します。

image.png


Eclipseでアーキタイプを使用してCamelプロジェクトを作成する

Eclipseでアーキタイプを使用してCamelプロジェクトを作成します。

今回、アーキタイプはJava DSL、バージョンは2.23.0を使用したプロジェクトを作成してみます。

まず、Eclipseのメニューから「ファイル」-「新規」-「その他」を選択し、表示されたダイアログで、以下の「Mavenプロジェクト」を選択します。

image.png

image.png

「新規Mavenプロジェクト」というダイアログが表示されますので、何も変更せずに「次へ」ボタンを押します。

image.png

「アーキタイプの選択」になりますので、「カタログ」に先ほど設定したCamelのアーキタイプである「Apache Camel」を選択します。

今回はバージョンを指定しますので、「アーキタイプの最新バージョンのみを表示」にチェックを入れます。

そうすると、全てのバージョンが表示されますので、次のアーキタイプを選択し、「次へ」ボタンを押します。


  • グループId:org.apache.camel.archetypes

  • アーティファクトId:camel-archetype-java

  • バージョン:2.23.0

image.png

これでプロジェクトの作成は完了で、Eclipseのワークスペース以下に「camel-archetype-java」というディレクトリでプロジェクトが作成されます。

コマンドプロンプトでtreeコマンドを実行すると以下のディレクトリ・ファイルが自動で作成されたことが分かります。

>tree /F C:\pleiades\workspace\camel-archetype-java

フォルダー パスの一覧
ボリューム シリアル番号は B3BC-AD20 です
C:\PLEIADES\WORKSPACE\CAMEL-ARCHETYPE-JAVA
│ .classpath
│ .project
│ pom.xml
│ ReadMe.txt

├─.settings
│ org.eclipse.core.resources.prefs
│ org.eclipse.jdt.core.prefs
│ org.eclipse.m2e.core.prefs

├─src
│ ├─data
│ │ message1.xml
│ │ message2.xml
│ │
│ ├─main
│ │ ├─java
│ │ │ └─com
│ │ │ └─example
│ │ │ └─camel_archetype_java
│ │ │ MainApp.java
│ │ │ MyRouteBuilder.java
│ │ │
│ │ └─resources
│ │ log4j2.properties
│ │
│ └─test
│ ├─java
│ │ └─com
│ │ └─example
│ │ └─camel_archetype_java
│ └─resources
└─target
├─classes
│ │ log4j2.properties
│ │
│ ├─com
│ │ └─example
│ │ └─camel_archetype_java
│ │ MainApp.class
│ │ MyRouteBuilder.class
│ │
│ └─META-INF
│ │ MANIFEST.MF
│ │
│ └─maven
│ └─com.example
│ └─camel-archetype-java
│ pom.properties
│ pom.xml

└─test-classes
└─com
└─example
└─camel_archetype_java

作成されたプロジェクトは、Eclipse用の.project、Mavenのpom.xml以外にサンプルアプリケーションのソース(src/main以下)、テスト用のソース(src/test以下)が自動で作成されています。

プロジェクト直下のReadMe.txtの内容は以下のようになっており、「mvn exec:java」でプロジェクトを実行できることが分かります。

「mvn exec:java」はexec-maven-pluginのゴールで、MavenからJavaプログラムを実行することを意味しています。


ReadMe.txt

Camel Java Router Project

=========================

To build this project use

mvn install

To run this project from within Maven use

mvn exec:java

For more help see the Apache Camel documentation

http://camel.apache.org/



作成したCamelプロジェクトを実行する

作成したプロジェクトを実行するために、「exec:java」のゴールを指定して実行します。

まずは、pom.xmlを選択しコンテクストメニューから「デバッグ」-「5Mavenビルド」を選択します。

image.png

image.png

以下のダイアログが表示されますので、ゴールに「exec:java」と入力し「デバッグ」ボタンを押すと、デバッグモードでアプリケーションが実行されます。

image.png

実行するとEclipseのコンソールに以下のように実行ログが流れます。

[INFO] Scanning for projects...

[INFO]
[INFO] ------------------< com.example:camel-archetype-java >------------------
[INFO] Building A Camel Route 1.0.0
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- exec-maven-plugin:1.6.0:java (default-cli) @ camel-archetype-java ---
[_archetype_java.MainApp.main()] DefaultCamelContext INFO Apache Camel 2.23.0 (CamelContext: camel-1) is starting
[_archetype_java.MainApp.main()] ManagedManagementStrategy INFO JMX is enabled
[_archetype_java.MainApp.main()] DefaultTypeConverter INFO Type converters loaded (core: 195, classpath: 0)
[_archetype_java.MainApp.main()] DefaultCamelContext INFO StreamCaching is not in use. If using streams then its recommended to enable stream caching. See more details at http://camel.apache.org/stream-caching.html
[_archetype_java.MainApp.main()] FileEndpoint INFO Endpoint is configured with noop=true so forcing endpoint to be idempotent as well
[_archetype_java.MainApp.main()] FileEndpoint INFO Using default memory based idempotent repository with cache max size: 1000
[_archetype_java.MainApp.main()] DefaultCamelContext INFO Route: route1 started and consuming from: file://src/data?noop=true
[_archetype_java.MainApp.main()] DefaultCamelContext INFO Total 1 routes, of which 1 are started
[_archetype_java.MainApp.main()] DefaultCamelContext INFO Apache Camel 2.23.0 (CamelContext: camel-1) started in 0.657 seconds
[1) thread #2 - file://src/data] XPathBuilder INFO Created default XPathFactory com.sun.org.apache.xpath.internal.jaxp.XPathFactoryImpl@151e4eab
[1) thread #2 - file://src/data] route1 INFO UK message
[1) thread #2 - file://src/data] route1 INFO Other message


作成されたプロジェクトを見る

作成されたプロジェクトが何をしているのか見ていきましょう。

まず、pom.xmlを見てみると「exec-maven-plugin」で、メインクラスが「com.example.camel_archetype_java.MainApp」であることが分かります。

このメインクラスを「exec:java」で実行していたということです。


pom.xml

      <plugin>

<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.6.0</version>
<configuration>
<mainClass>com.example.camel_archetype_java.MainApp</mainClass>
<includePluginDependencies>false</includePluginDependencies>
</configuration>
</plugin>

MainAppクラスを見ると次のようになっています。

org.apache.camel.main.Mainクラスを使用して、MyRouteBuilderのルートを追加しています。


MainApp.java

    public static void main(String... args) throws Exception {

Main main = new Main();
main.addRouteBuilder(new MyRouteBuilder());
main.run(args);
}

このMyRouteBuilderクラスは次のようになっています。

ルートはRouteBuilderクラスを継承し作成し、configureメソッドでJava DSLでルートを定義しています。


MyRouteBuilder.java

public class MyRouteBuilder extends RouteBuilder {

/**
* Let's configure the Camel routing rules using Java code...
*/

public void configure() {

// here is a sample which processes the input files
// (leaving them in place - see the 'noop' flag)
// then performs content based routing on the message using XPath
from("file:src/data?noop=true")
.choice()
.when(xpath("/person/city = 'London'"))
.log("UK message")
.to("file:target/messages/uk")
.otherwise()
.log("Other message")
.to("file:target/messages/others");
}

}


"from("file:src/data?noop=true")"でsrc/dataディレクトリのファイルをポーリングしています。

src/dataディレクトリにファイルがあると、"xpath("/person/city = 'London'")"で、XMLファイル中の/person/city以下の"London"という文字列を含むならログを出力(.log("UK message"))しています。そして".to("file:target/messages/uk")"で、ファイルをtarget/messages/ukディレクトリ以下にコピーしています。

"London"という文字列以外だったら、target/messages/othersディレクトリ以下にコピーするようになっています。

また、src/dataディレクトリには"message1.xml"と"message2.xml"という2つのXMLファイルが存在していました。

"message1.xml"の中身は以下のようになっており、person/city要素の内容が"London"になっています。そのため、先ほどのルートで定義されていたようにtarget/messages/uk以下にファイルがコピーされます。

<?xml version="1.0" encoding="UTF-8"?>

<person user="james">
<firstName>James</firstName>
<lastName>Strachan</lastName>
<city>London</city>
</person>

次に"message2.xml"の中身は以下のようになっており、person/city要素の内容が"Tampa"になっています。そのため、target/messages/others以下にファイルがコピーされます。

また、この2つのファイルを読み込むことで、次の2行がログに出力されます。

[1) thread #2 - file://src/data] route1                         INFO  UK message

[1) thread #2 - file://src/data] route1 INFO Other message


Eclipseを使わないでCamelの新規プロジェクトを作成する

あらためて言うまでもないですが、Eclipseを使わないで、Mavenアーキタイプを使用して新規プロジェクトを作成することもできます。あらためて言うまでもないですが。

Windowsであればコマンドプロンプトを開いて、mvnコマンドで以下のように実行します。

mvn archetype:generate -DarchetypeGroupId=org.apache.camel.archetypes -DarchetypeArtifactId=camel-archetype-java -DarchetypeVersion=2.23.0 -DgroupId=com.example -DartifactId=camel-example-java -Dversion=1.0.0

上のコマンドで指定したオプションは以下のとおりです。


  • グループId:org.apache.camel.archetypes

  • アーティファクトId;camel-archetype-java

  • アーキタイプのバージョン(archetypeVersion):2.23.0

  • アプリケーションのバージョン(version):1.0.0

このプロジェクトを実行する場合は、次のコマンドを実行します。

mvn install

mvn exec:java

これをEclipse用のプロジェクトに変換(mvn eclipse:eclipse)することもできます。Eclipseから直接プロジェクトを作成した方が簡単なので使用することはないと思いますが。


参考