いしぐめも

プログラミングとかしたことを書きます。

mavenのresources pluginでバイナリファイルが壊れてドハマりした件

起こったこと

テストでバイナリファイルを使用しようとして、

InputStream is = ClassLoader.getSystemResourceAsStream("testBar.bar");

というようなことをしていましたが、どうも変な挙動を示し、テストが通らん通らん!となりました。

このbarファイルというもの、zipで固めたアーカイブなんですが、テスト中に展開できないという問題ががが・・・

テストで使用したデータを見てみるとなんだか容量も違うし内容も書き換わっているという事に気が付きました。

maven-resources-plugin

maven.apache.org

何が問題となるのか?

mavenのresources pluginには、filteringという、resourcesの中にある定数を置換してくれる機能があります。

Apache Maven Resources Plugin – Filtering

ビルド時に置換してくれるのでプリプロセッサ的な便利さがあると思います。このオプションは pom.xml 内でリソースを指定する際に filterlingtrue を指定することで有効にできます。

      <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 という拡張子を指定しました)

ドキュメントにもあるように、デフォで jpggif などの拡張子は除外されているので画像データでは今回のような問題は起こらないようです。

まとめ

  • mavenプラグインにはビルド時にいい感じに定数を置換してくれる機能がある
  • 変な拡張子のファイルは要注意!

って感じですかね

終わりに

Personiumのコア部分を触るようになってから充実した日々を送っていますが、だんだんとJavaがわかるようになってきました。