問題事象
Java の何の変哲も無いプロジェクトで、 resources ディレクトリにバイナリファイルを配置。
FileInputStream stream = new FileInputStream(getClass().getResource("/hoge.bin").getPath());
というような形で呼び出して使うプログラムを書いた。 IDE では問題なく動いているので、 mvn で jar に固めて外部から呼び出すと、 Not Found Exception が発生。
jar を解凍してみると、間違いなく hoge.bin
は直下に入っている。同じディレクトリにある他の properties ファイルなどは読み込めている。。。
解決策
Class#getResource
ではなく、 Class#getResourceAsStream
を使う。
InputStream stream = getClass().getResourceAsStream("/hoge.bin");
InputStream の使い方に応じて、その後のプログラムも修正は必要になることがある。
Why?
ここに回答: https://stackoverflow.com/a/941785
jar で固めたファイルは、個別ファイルとしては扱えず、 Stream の形で参照する必要があるということ。
もうちょっと真面目なドキュメントとか読みたいが、クソほどはまって疲れたのでまた今度。
なんでクソほどはまったか
maven で管理された複数プロジェクト構成になっており、エントリはプロジェクト A だけど、 resouces はプロジェクト B のもの、という構成だったので、自分の設定不備かと思って問題特定に時間がかかった。