ネット上探しても情報がないので共有目的で書きます。
原因
存在しないディレクトリをカレントディレクトリにしていると発生します。
他のファイルシステム全部が同じ仕様かは知りませんが、少なくともRedHat7では、カレントディレクトリを削除すると存在しないディレクトリに居る状態になります。
[root@******** ~]$ cd hoge
[root@******** hoge]$ rmdir ../hoge
[root@******** hoge]$
この状態でDefaultFileSystemHolder
クラスの初期化処理が実行されると発生します。
java.nio.file.Paths
クラスの中で使われているので、初期化処理が走る機会は結構ありそうです。
僕の環境で起きたこと
あるプログラムを実行すると下記のような例外が発生する、と障害報告が挙がった。
java.lang.NoClassDefFoundError: Could not initialize class java.nio.file.FileSystems$DefaultFileSystemHolder
at java.nio.file.FileSystems.getDefault(FileSystems.java:176)
at java.nio.file.Paths.get(Paths.java:84)
・・・
NoClassDefFoundError
が出ているのでクラスパスやjarを確認するが、何度確認しても問題ない・・・。
ググってみるとこちらのような「file.encoding
がcp037だと発生する」というJDKのバグ報告が見つかるが、そもそもfile.encodingなんて触ってない・・・。
というか障害報告と同じサーバーで同じように実行しても再現しない。
このプログラムはあるディレクトリ内のファイルを外部に送信し、送信し終わったらそのディレクトリを削除する、という処理を行っている。障害報告に上がっていたスクリーンショットを良く見直してみると、削除対象のディレクトリがカレントディレクトリになっている状態で実行していた。
同じことをしてみたら再現、という流れ。
少しデバッグしてみたところ、DefaultFileSystemHolderの初期化処理中に「sun.nio.fs.UnixException:そのようなファイルやディレクトリはありません」が起きていたようですが、根本的な発生箇所は追い切れていません。
この記事の情報を元に詳しい人が調べてくれることを期待。