LoginSignup
0
0

More than 3 years have passed since last update.

クラスパスやエンコードを何度確認しても問題ないのに「java.lang.NoClassDefFoundError: Could not initialize class java.nio.file.FileSystems$DefaultFileSystemHolder」が発生する

Last updated at Posted at 2020-03-07

ネット上探しても情報がないので共有目的で書きます。

原因

存在しないディレクトリをカレントディレクトリにしていると発生します。

他のファイルシステム全部が同じ仕様かは知りませんが、少なくとも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:そのようなファイルやディレクトリはありません」が起きていたようですが、根本的な発生箇所は追い切れていません。
この記事の情報を元に詳しい人が調べてくれることを期待。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0