7
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

jar ファイルから Class#getResource でファイルを呼び出すと Not Found になってクソほどはまった備忘録

Last updated at Posted at 2017-06-27

問題事象

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 のもの、という構成だったので、自分の設定不備かと思って問題特定に時間がかかった。

7
9
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
7
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?