hatenob

プログラムって分からないことだらけ

Wildfly Swarmを触りながらOSSを感じる

Wildflyを使ってMicroservicesなインフラを作ろう的なプロジェクトだと思われるSwarmというのがリリースされた模様。またAlpha1なので実用には及ばないとのことだけれど。

WildFly Swarm Initial Release · WildFly

この領域はSpring Bootが先行しているのだと思ってるけど、それに対抗しようということなのかな?
Wildflyのサイトに出ているくらいなので、個人が趣味でやってみたということでもないのかな?

とりあえず動かしてみようということでやってみた。

サンプル

公式のGithubにもサンプルがあがってるけど、この方のを参考にさせていただいた。
単純なJax-RSのプログラム。

wildfly-samples/swarm at master · arun-gupta/wildfly-samples · GitHub

実行、しかし、、

コードは載せるまでもないので割愛する。
初回のビルドは大量にライブラリを落としてくるので時間がかかるけれど、滞りなくビルドできた。
さて実行。

swarm>java -jar target\swarm-1-swarm.jar
エラー: メイン・クラスorg.wildfly.swarm.bootstrap.Mainが見つからなかったかロードできませんでした

おや?
ちなみに見ての通り、環境はWindows
なんだろうなぁと思って、ビルドしたものをLinuxで実行してみたけどダメだった。
今度はLinuxでビルドからやり直したらいけた。

Google先生に聞いたら同じことで困っている人がいた。

java - Cannot find org.wildfly.swarm.bootstrap.Main when launching fatjar built by wildfly-swarm-plugin:1.0.0.Alpha1 - Stack Overflow


でも見た時にはまだ誰も回答をしていなかった。

jarの中身をみてみたら、確かにクラスファイルは入っているけれどパスがおかしい。

...
 2209 Wed May 27 23:50:24 GMT+09:00 2015 org\jboss\modules\xml\XmlPullParserException.class
  243 Wed May 27 23:50:24 GMT+09:00 2015 org\jboss\modules\_private\ModulesPrivateAccess.class
 2505 Wed May 27 23:50:24 GMT+09:00 2015 org\wildfly\swarm\bootstrap\Main.class
...

Windowsだろうと何だろうと、jarファイルの中のパスセパレータは「/」になるはず。
試しに1回jarをunpackして、再度packしてみた。

...
   243 Wed May 27 22:54:10 GMT+09:00 2015 org/jboss/modules/_private/ModulesPrivateAccess.class
     0 Wed May 27 22:56:50 GMT+09:00 2015 org/wildfly/
     0 Wed May 27 22:56:50 GMT+09:00 2015 org/wildfly/swarm/
     0 Wed May 27 22:56:50 GMT+09:00 2015 org/wildfly/swarm/bootstrap/
  2505 Wed May 27 22:54:10 GMT+09:00 2015 org/wildfly/swarm/bootstrap/Main.class
...

うん、やっぱりおかしい。
(時刻はこの記事のためにjarを作り直したりしているので時系列からみるとちょっとおかしいけど本質じゃないので無視してください)

OSSだから直しちゃえ!

Swarmはjarの単独実行をできるようにするため、wildfly-swarm-pluginというMavenプラグインWildflyの色んなクラスをかき集めてjarにpackしている。挙動から見るに、この時にパスセパレータの扱いをミスってる模様であり、このMaven Pluginが容疑者に。
早速ソースを見て、あわよくば修正してプルリクエストだ!と意気込んでところ、念のために確認したコミットログに修正履歴を見つけた。

Fix for path handling in Windows · wildfly-swarm/wildfly-swarm@761cdf1 · GitHub

あえなく、コントリビューターになる野望はついえました。

ならばせめて、、

Stack Overflowで困っていたあの方にこの事実を教えてあげよう!と思い、さっきの質問ページを開いたら、すでに回答が書き込まれていた。
こうして世界的コミュニティサイトで回答者となる野望もついえました。

というわけで、

ひとまず最新のソースをGithubから落としてビルドしてみたら動いた。正確には、ちょっとだけましになった、というところ。
また別のエラーで落ちた。

Exception in thread "main" java.lang.NoClassDefFoundError: org/jboss/modules/ModuleLoader
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClass(Unknown Source)
        at java.security.SecureClassLoader.defineClass(Unknown Source)
        at java.net.URLClassLoader.defineClass(Unknown Source)
        at java.net.URLClassLoader.access$100(Unknown Source)
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at org.wildfly.swarm.bootstrap.Main.main(Main.java:33)
Caused by: java.lang.ClassNotFoundException: org.jboss.modules.ModuleLoader
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        ... 13 more

Hello Worldまでの道のりはもう少しありそうだ。