Gradleプロジェクトで生成した実行スクリプトがGitBash(MSYS環境)でうまく動かない
   2 min read

GitBash環境でSDKMAN!を使ってJBakeをインストールしたのですが、 jbake コマンドを実行すると次のようなエラーが出てうまく動きませんでした。

エラー: メイン・クラスorg.jbake.launcher.Mainを検出およびロードできませんでした
原因: java.lang.ClassNotFoundException: org.jbake.launcher.Main

実行スクリプトを調べてみると、クラスパス設定時にjarをワイルドカード指定している(参考)のですが、そこで絶対パスの記述方式がMSYSのもの /c/Users/yuki/…​/* のような形になっているため java コマンドに想定通り受け付けられていないようでした。

この jbake スクリプトファイルを見てみたところ、次のようにmsysを判定している処理は入っていました。 が、この msys 変数を以降の処理で全く参照していませんでした。

jbake
# OS specific support (must be 'true' or 'false').
cygwin=false
msys=false
darwin=false
nonstop=false
case "`uname`" in
  CYGWIN* )
    cygwin=true
    ;;
  Darwin* )
    darwin=true
    ;;
  MINGW* )
    msys=true
    ;;
  NONSTOP* )
    nonstop=true
    ;;
esac

Cygwinと同じ分岐に乗せればうまく動きそうに見えたので、そのように修正しようとしたのですが、いくらGitリポジトリを探してもみつからない。つまりバージョン管理対象ではなく自動生成しているようでした。

ファイルをいろいろ見て回った結果、 gradle/application.gradle ファイル内の startScripts がそれっぽく見えたので検索してみたところ、やっとたどり着きました。

Gradleのコア機能だったようです。 これはGradleへの近トリビュートチャンスか?と思いIssuesを見てみたのですが、なんと、最新のバージョンである5.6で修正されていました…

というわけで、JBakeがGitBashで実行できない問題は、gradlewが使用しているGradleのバージョンをアップグレードすれば解消されます。

というわけでIssueを挙げました: