ソフラボの技術ブログ

仕事で使ったプログラミング、サーバー周りで役に立つこと、Webサービス開発に必要な技術情報、モバイル情報を書いてます。わかりやすく見やすくをモットーにしています。

WildFlyでgetResourceするとパスが異なる事例と対処方法

GlassFishで動作していたSpringBootアプリを、サーバー移管に伴いWildFlyに切り替えました。

動作確認をしていくと、リソースの取得で404が返ってきて困っていました。

いろいろと調査すると、パスの取得方法がアプリケーション・サーバーによって異なることがあるらしく、その場合の対処方法をまとめました。

環境

WildFly 15.0.1 Final
・Spring Boot 1.3.6 RELEASE
CentOS 7
Eclipse 4.8
・アプリはWARでデプロイ

WilfFly上での問題の挙動

GlassFishでは、アプリをWAR形式でデプロイし動作させていました。
WildFlyでも同じようにして動作させていたのですが、Excelを出力する処理で、404が発生し原因を調査することにしました。

GlassFishでは、次のコードで正常に動作していました。

new File(this.getClass().getResource(srcFullPath).getPath());


このコードのままWildFlyで処理を行うと変なパスが返ってきます。
(ローカルでWARデプロイしたとき)

# getResourceで引数に「"."」を指定した場合
/Users/user_name/dev/eclipse/server/wildfly-15/modules/system/layers/base/org/jboss/as/ejb3/main/timers/

# getResourceで引数に「"report"」のパスを指定した場合
/content/Hoge.war/WEB-INF/classes/com/test/report/  

いろいろと調べてみる

解決しないとマズイ問題なのでめちゃくちゃ調べました。

How to put an external file in the classpath |JBoss Developer
java - WildFly - getting resource from WAR - Stack Overflow
How to load a file in war file |JBoss Developer
How to load external property file in JBoss 7 classpath? - JBoss 7 Configurations

基本、英語のサイトしかヒットしないのでGoogle翻訳を駆使したり、コードから読み取ったりしてました。

サイトには、「それは解決できないよ」と絶望的な回答があったり、「この方法はどう?」と試すものの的外れだったりで、困り果ててました。

そんな中、「解決方法はこれ!」というのがあり、試すと問題なく動作するものがありました!!

解決方法

java - How to load resource files in jboss war - wildfly9.xV - Stack Overflow

getResource()でFileを取得するのではなく、getResourceAsStream()でStreamを取得して使えとのこと。

this.getClass().getResourceAsStream(path);

これですんなりExcelを出力できるようになりました。