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](https://qiita-image-store.s3.amazonaws.com/0/179607/c22c0524-d9aa-b756-7701-affc75d13a5a.png)

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

![image.png](https://qiita-image-store.s3.amazonaws.com/0/179607/36076fe9-8342-f693-c006-7aac803334a2.png)

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

　![image.png](https://qiita-image-store.s3.amazonaws.com/0/179607/7c420fd6-9072-defb-d3a8-81a0e7121730.png)

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

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

![image.png](https://qiita-image-store.s3.amazonaws.com/0/179607/95be9d3e-da6f-585a-93be-274539b10754.png)



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

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

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

![image.png](https://qiita-image-store.s3.amazonaws.com/0/179607/fbeb0a85-dbf9-a093-603b-01a1daed4302.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/179607/7580d519-af46-a3a9-17b1-6e14ae07be38.png)

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

![image.png](https://qiita-image-store.s3.amazonaws.com/0/179607/a31ac09f-d879-77ea-4d46-7f9e839430f5.png)

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

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

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

- グループId：org.apache.camel.archetypes
- アーティファクトId：camel-archetype-java
- バージョン：2.23.0


![image.png](https://qiita-image-store.s3.amazonaws.com/0/179607/2675066d-ac03-e442-e276-566928f0dc25.png)

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

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

```console
>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プログラムを実行することを意味しています。

```text: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](https://qiita-image-store.s3.amazonaws.com/0/179607/99477b3f-3590-7522-40db-f4165f7b6fb5.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/179607/e4f42635-8f6d-6753-854b-3cfd7c1753ee.png)

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

![image.png](https://qiita-image-store.s3.amazonaws.com/0/179607/39d30c22-5368-8ac4-f6f0-b9f04ef46f20.png)


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


```console
[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」で実行していたということです。

```xml: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のルートを追加しています。

```java: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でルートを定義しています。


```java: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
<?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行がログに出力されます。

```console
[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コマンドで以下のように実行します。

```console
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

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

```console
mvn install
mvn exec:java
```

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


# 参考

- [Camel Maven Archetypes（公式サイト）](http://camel.apache.org/camel-maven-archetypes.html)
- [How to use Maven with Apache Camel ](https://cleverbuilder.com/articles/camel-maven/)