理系学生日記

おまえはいつまで学生気分なのか

java のクラスパスをワイルドカードで指定する

大量の jar ファイルに依存している Java のバッチとかを走らせるとき、これらの jar ファイルに対するクラスパス(classpath) を通す必要があります。
これ、かつては

for f in $(ls lib/*.{jar,JAR}); do
  CLASSPATH="${CLASSPATH}:$f"
done

java -cp $CLASSPATH hogehoge

みたいに書いてたよね。うん書いてた書いてた。もう必死になって書いてた。そして、ブートストラップのコードです(ドヤァ)みたいな感じで得意気になってた。
これ、何が恐怖かというと、$CLASSPATH の値がクソみたいに長くなって、個々の jar ファイルへのパスの妥当性とかさっぱりわからなくなる。あと ps とかでプロセスみたときの見た目が酷い。とにかく酷い。でも、昔はそれが必要不可避みたいな雰囲気あった。

いまは、2015 年だから、そんなことない。人類は着実に進歩してる。After はこんなかんじです。

java -cp 'lib/*' hogehoge

スッキリしてる。Simple is Best。意図も伝わりやすい。

これ、Java 6 から導入されてて、「クラスパス・ワイルドカード」とかいう。シェルに * を展開させないようにシングルクオートで囲み、java コマンドに直接渡しましょう。
こうやって指定するだけで、「lib 直下にあり、かつ、*.{jar,JAR}」に合致するファイルのパスが指定されたのと同じ効果になる。サブディレクトリは再帰的に走査されない。lib/*.jar と lib/sublib/*.jar を同時に指定するためには

java -cp 'lib/*:lib/sublib/*' hogehoge

といった形で、区切り記号を入れたら良い。


というわけで、時代はいつのまにか進んでいる、という話でした。