mavenのresources pluginでバイナリファイルが壊れてドハマりした件
起こったこと
テストでバイナリファイルを使用しようとして、
InputStream is = ClassLoader.getSystemResourceAsStream("testBar.bar");
というようなことをしていましたが、どうも変な挙動を示し、テストが通らん通らん!となりました。
このbarファイルというもの、zipで固めたアーカイブなんですが、テスト中に展開できないという問題ががが・・・
テストで使用したデータを見てみるとなんだか容量も違うし内容も書き換わっているという事に気が付きました。
maven-resources-plugin
何が問題となるのか?
mavenのresources pluginには、filteringという、resourcesの中にある定数を置換してくれる機能があります。
Apache Maven Resources Plugin – Filtering
ビルド時に置換してくれるのでプリプロセッサ的な便利さがあると思います。このオプションは pom.xml
内でリソースを指定する際に filterling
に true
を指定することで有効にできます。
<resource> <directory>src/main/resources</directory> <filtering>true</filtering> </resource>
で、この機能が多分、テキストファイルとしてリソースファイルを開き、置換して出力先に配置するという動きをするので(中身見てないのでわかりませんが)、今回のバイナリファイルがおかしなことになってしまったんじゃないかと予測。
対処法
いやいやでもこんなの画像データとか全部壊れちゃうじゃんそんな話ある????って思いますが、そこはちゃんと対策されています。
Apache Maven Resources Plugin – Binaries Filtering
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-resources-plugin</artifactId> <version>3.2.0</version> <configuration> <nonFilteredFileExtensions> <nonFilteredFileExtension>bar</nonFilteredFileExtension> </nonFilteredFileExtensions> </configuration> </plugin>
として、nonFilteredFileExtension
に除外したい拡張子を書いてあげればよいみたいです。(今回は bar
という拡張子を指定しました)
ドキュメントにもあるように、デフォで jpg
や gif
などの拡張子は除外されているので画像データでは今回のような問題は起こらないようです。
まとめ
って感じですかね
終わりに
Personiumのコア部分を触るようになってから充実した日々を送っていますが、だんだんとJavaがわかるようになってきました。