ぶらコード:maven:その1
mavenさんのソースコードを、いつだったかローカルに落としてきてる。
きちんとしたコンテンツにまとめる際には、どっから落としてきたのか、とかちゃんと書いておく必要があるよね。
とりあえず落としてしてきてビルドを通そうと思ったけど、結構苦労した。
さらにmvn eclipse:eclipseやってeclipseに取り込んだりしたけど、
さて、どっから読もうか。。。
単純に考えるとmain()メソッドがどこかにあって、そこがエントリポイントなはずなんだけど、モジュールもたくさんあるし、どっからどこが呼ばれるのか、とかはただ眺めてても分からんもんだ。
で、正攻法としていつも使っている使い方を試みて、そいつを実行した時に何が動くのかを見れば良いと考えるわけだ。
とりあえずこの記事を書いているのは、MacなのでMac上で以下のコマンドを打つ。
which mvn
/usr/local/bin/mvn
で、上記のmvnさんについて調べると、どうやらシェルスクリプトのようですね。
$ file /usr/local/bin/mvn
/usr/local/bin/mvn: Bourne-Again shell script text executable
では、早速中身を拝見してみましょう。
$ less /usr/local/bin/mvn
#!/bin/bash
JAVA_HOME="${JAVA_HOME:-$(/usr/libexec/java_home)}" exec "/usr/local/Cellar/maven/3.3.3/libexec/bin/mvn" "$@"
うーーん。なんかたらい回しにされてる??
環境変数のJAVA_HOMEを設定した後に、別のコマンドを実行しているみたいっすね。
では、こやつが何者なのかを調べてみると、結局さらに別のシェルスクリプトを実行していると。
$ file /usr/local/Cellar/maven/3.3.3/libexec/bin/mvn
/usr/local/Cellar/maven/3.3.3/libexec/bin/mvn: POSIX shell script text executable
で、「/usr/local/Cellar/maven/3.3.3/libexec/bin/mvn」の中身を見るとちょっと長いスクリプトになっているから、単純に貼り付けるも見通し悪そう。
ごにょごにょと色々やってるようだけど、JAVA_HOMEとかM2_HOMEとかチェックしたり、設定したりしてますね。cygwinようの分岐とかもあったりする。
で、紆余曲折を経て、結局やりたいのは、以下に転記した最後の数行なんだろう。
exec "$JAVACMD" \
$MAVEN_OPTS \
-classpath "${M2_HOME}"/boot/plexus-classworlds-*.jar \
"-Dclassworlds.conf=${M2_HOME}/bin/m2.conf" \
"-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \
${CLASSWORLDS_LAUNCHER} "$@"
変数を参照してるから分かりにくくなってるけど、「plexus-classworlds-*.jar」とかいうjarファイルを指定して、javaコマンドを実行しているということだな。あとは実行時のオプションだろう。
で、つまりは、このjarが何者なのかということと、渡しているオプションを把握せんと先に進めないということだ。やれやれ。(やれやれと思いながらも、実は楽しい)
で、このjarが何者なのかを調べないといけない。
キーワードは、plexus。
とりあえずググってみたところ、以下のサイトを見つけた。
どうやら、maven用に開発されたIoC(Inversion of Contorl)するライブラリのようだね。
日本語の情報が出てこないから、かなりマイナーっぽいな。
次回は、こいつを調べるところから始めるとしよう。
最初のぶらコード(まずはmavenのソースを読むことにしようかなという、だらだらとした話)
ブログのタイトル的にはダメな感じなんでしょうね。
読者を意識していない、キャッチーでないタイトル・・
ま、それはさて置き、とりあえず最初のぶらコード。
(ぶらコード=コードの世界をぶらぶらすること)
JVMが面白い。Javaという言語というより、その下のJVM(Java Virtual Machine)という環境がおもろい。複数のOSを抽象化しているレイヤーとか面白いし、中間コードとしてのバイトコードが面白い。
JVM上で動作するいわゆるJVM言語はJavaとかScalaに限らず、JRubyとかJythonとか、色んな言語のスタイルで書きつつ、最後はJavaバイトコードに変換してしまえば、もれなくJVMで動かせてしまうというのが面白い。
Ruby環境のc言語実装とか、JavascriptのV8Engine とか色んな仮想マシンがあると思うが、一番利用されていて、実績もあってその結果一番進化しているのがJVMではなかろうか。
VMは大体がGC(Garbage Collection)を搭載してると思うが、JavaのG1GCとかあれ程進化した実装を持っている環境もなかなかないだろう。
そんでもって、JIT(Just In Time Conpiler)もおもろい。実行中のJavaバイトコードを動的にプロファイリングしながら動的に最適化してしまうってところが面白い。その分性能テストとかで挙動が掴みにくくなったりして苦労することもあるが、動的最適化によって、c++よりも早くなることがあったりするところが、また面白い。
このバイトコードのレイヤーがあるから、バイトコードインジェクションとかAOPとか出来ちゃうところが、また面白い。
cとかc++とかも好きだけど、動的にコード書き変えちゃうとか、VMならではの面白い展開を考えると、やっぱりJava関係のソース読んでいく方が展開が楽しそう。
でも、JVM自体はそのほとんどがc++で書かれているわけだし、どうしたってJVMの下のOSについても知りたくなるわけで、そうなるとcのソースも読むことになるので、言語を限定しているわけでもない。
ただ単に、JVMの上(TomcatとかJavaで実装されたアプリケーション)とか、下(JVMが抽象化しているLinuxとかWindows)とか、横(V8エンジンとかの他のVM)とかをぶらつくと面白いソースがいっぱいありそうで、ワクワクするので、JVM周辺をぶらつこうかと。
ということでとりあえずJVM、さらに言語的には、とりあえずど真ん中のJavaで実装された何かをターゲットにぶらついてみたい。
で適当に物色していると、結局ソースをダウンロードとかしてきて、ローカルでビルドしたり、eclipseに取り込んでみたりするわけだが、そこでまずビルドでつまずく、、、。
大体が、mavenのpom.xmlが用意されていたりするので、プロジェクトの構成とかはある程度つかめるんだが、マルチモジュール構成になっていたり、依存関係の解決とかに失敗してビルド失敗する。
mavenは普段の開発でも使っているから、不慣れなワケでもないが、分かっていないことも多い。トラブった時の解決に時間がかかる。
なので、いっその事mavenのソースを一通り、読んでしまって、mavenへの苦手意識を薄めていくことから、始めるとしますか。(ここに来て、ようやく結論。なげーよ。)
オープンソースの世界をぶらり旅
ソース読むのが好きなので、ぶらりとソースコードの世界を旅したり、読むためのテクニックを磨いたり、トリップするためのツールを作ったりする軌跡を描いていくブログにしようと思います。
しばらくは誰も読者もいないだろうから、メモレベルの記載から始めましょうかね。