jarに圧縮してデプロイするタイプのSpringBootアプリケーションで、resourcesフォルダ内のExcelファイルを使用したい
以下のようにPathクラスを使用しても、jarに圧縮するアプリケーションでは取得できず、NoSuchFileExceptionが吐かれます。
Pathクラスで取得するソース.java
// resourceフォルダ内に存在するファイルのパスを変数:pathに代入 <--NoSuchFileExceptionがスローされる
Path path = Paths.get("example/src/main/resources/Excel.xlsx");
// パスのファイルを操作(Excelを操作するWorkbookクラスを使用)
Workbook wb = WorkbookFactory.create(new File(path.toString()));
なぜ例外が発生するのか?
Javaプロジェクト内に存在するresourceフォルダ内のリソースファイルは、jar化するとBOOT-INFフォルダ内に格納されるため、アプリケーションはそのパスを辿ってリソースファイルを取得します。
そのため、src/main/resources~という風にパスを指定しても.jar内にはそのパスは存在しないため例外発生となります。(.jarの拡張子を.zipに変更すると何がjar内に圧縮されているのか見ることができます)
BOOT-INF内に入っているファイルを取得する方法は何個かありそうですが、私は以下の方法を採用しました。
解決方法:URLクラスとInputStreamクラスを使用する
実際のソースコード
URLクラスとInputStreamクラスで取得するソース.java
// ファイルURLからリソースファイルの情報を取得
URL url = resourceLoader.getResource("classpath:" + "Excel.xlsx").getURL();
// URLクラスのインスタンスでストリームを作成する
InputStream fileStream = url.openStream();
// ストリームを使用してWorkbookクラスのインスタンスを作成
Workbook wb = WorkbookFactory.create(fileStream);
以上の方法で、jarに圧縮したSpringBoot(Java)アプリケーション内でもExcelシートやその他の拡張子を持つファイルを扱えます。