🐪

Apache Camelのコードから実行可能JARを作成する

2020/11/05に公開

実行可能JARを生成する

依存関係を含んだJARを作成するだけでは不十分なことがある

maven-assembly-pluginなどを使用することで依存関係を含んだJARを作成できますが、Camelでは不十分なことがあります。
私の場合、CamelのFileコンポーネントを使用する際に、ファイルを読み込めないなどの不具合が出ました。

公式サイトに載っているプラグインを使用する

Camelの公式サイトに載っているmaven-shade-pluginを使用ことで解決します。
HOW TO CREATE EXECUTABLE JAR FOR CAMEL-MAIN PROJECT

pom.xml<build><plugins> の中に公式サイトからコピペします。
その際、<transformer><mainClass> で定義されている部分を実行したいクラスに置き換えます。

ただし、このままではまだエラーが出るので、<configuration> の中に以下のコードを追加します。

              <filters>
                <filter>
                  <!-- filter out signature files from signed dependencies, else repackaging fails with security ex -->
                  <artifact>*:*</artifact>
                  <excludes>
                    <exclude>module-info.class</exclude>
                    <exclude>META-INF/*.SF</exclude>
                    <exclude>META-INF/*.DSA</exclude>
                    <exclude>META-INF/*.RSA</exclude>
                  </excludes>
                </filter>
              </filters>

実行可能JARの作成と実行

サンプルコード:https://github.com/shti-f/camel-test

$ mvn install
$ java -jar target/camel-test-1.0-SNAPSHOT-executable-jar.jar

実行可能JARを作成することができました。
JARを作成する環境と、JARを実行する環境とでJDKのバージョンが同じであることを確認してください。

(おまけ)Camelのルート実行後に実行を止める

MainApp.java
import org.apache.camel.main.Main;

public class MainApp {
    public static void main(String... args) throws Exception {
        Main main = new Main();
        main.configure().addRoutesBuilder(new MyRouteBuilder());
        main.run(args);
    }
}

Camelを実行する際、main.run() を使用することで、継続して動かすことができます。
対して、一度実行したら止めたい処理の場合は main.start()を使うことができます。

しかし、main.start() を使用すると、加えたrouteを実行せずにそのまま終了してしまいます。
この問題は、対症療法的ではありますが、Thread.sleep()を入れることで解決できます。

結果としてコードは以下のようになります。

MainApp.java
import org.apache.camel.main.Main;

public class MainApp {
    public static void main(String... args) throws Exception {
        Main main = new Main();
        main.configure().addRoutesBuilder(new MyRouteBuilder());
        main.start();
        Thread.sleep(2000);
    }
}

参考

HOW TO CREATE EXECUTABLE JAR FOR CAMEL-MAIN PROJECT

Discussion