Java で開発している最中に以下のようなエラーが発生し始めて、結構ハマったのでメモ。
Exception occurred executing command line.
Cannot run program "C:\Program Files\Java\jre1.8.0_144\bin\javaw.exe" (in directory "C:\Users\ore\myproject"): CreateProcess error=206, The filename or extension is too long
原因
最初見たときはまったく意味が分からなかったが、java コマンド実行時に指定されている classpath の指定の文字列( java -cp "c:\myproject\main;c:\Users\.gradle...."みたなやつ)が長すぎて、Windows の createProcess の引数の上限文字数である 32768 を超えてしまったことが原因のようだ。
対処
ライブラリを減らす
これが選択できるならこれが一番いい。今回は全部必要なライブラリだったので無理だった。
プロジェクトのディレクトリを階層の低いところに移動する
例えば今が c:\Users/ore/nanika/nantoka/are/sore/koko においてあるなら、c:\Users/ore/ に移動するとか。
これが次にお手軽かなと思ってやってみたが、だめだった。理由は次の項目で。
Gradle のホームディレクトリを変更する
エラー発生時の java コマンドに指定されている classpath をよく見ると c:\Users\ore\.gradle\nantoka_library\nantoka.jar みたいなのが非常に多かった。そこで gradle のデフォルトのダウンロード先を c:\Users\ore\.gradle から c:\.gradle に移してみた。
Windows では 「システム」->「システム詳細設定」->「環境変数」-> ユーザー環境変数のところに GRADLE_USER_HOME を作って値を C:\.gradle という手順で指定する。
これで IDE を再起動しいてビルドしなおしたら上手くいった。あまりいい方法ではないけど、ハマっている方は試す価値はあるかもしれない。
そもそもちゃんとした対処はないの?
java コマンドにあまりに長すぎる引数を設定しているのが問題なので、これをやめればよい。
Java 9 の module が使えれば、こんなに大量で長い classpath を指定する必要がなくなるので解決する。ただ Java 9 が普及してかつライブラリが対応するまでには結構時間がかかりそう。