🐪
Apache Camelのコードから実行可能JARを作成する
実行可能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);
}
}
Discussion