hatenob

プログラムって分からないことだらけ

WildflyでMANIFEST.MFの内容を取る

別にWildfly固有の話ではないと思うけれど、試したのがWildflyだったもので。
エラーの時の情報の一つとして出力するために、jarやwarにMANIFEST.MFを入れて、そこに書かれているバージョンとかをアプリケーション側で参照できるようにしたいなぁと思って調べてみた。

MANIFEST.MFの作成

手で書いてもよいとは思うけど、Mavenプラグインで作るようにする。

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-jar-plugin</artifactId>
  <configuration>
    <archive>
      <manifest>
        <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
        <addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
      </manifest>
    </archive>
  </configuration>
</plugin>

まぁこれではデフォルトが入るだけなので、結局ちゃんと書こうと思ったらどこかしらに手書きをする必要があるわけなので、どこでやるのがよいとも言えないところではある。

jar内からの参照

jar(war/libとかに置かれるようなもの)の場合はjar内のクラスにて下記で取得可能。

getClass().getPackage().getImplementationVersion();
getClass().getPackage().getSpecificationVersion();

war内からの参照

warの場合はjarの時のやり方では取れないっぽい。
jarと同じコードでやるとnullが返ってくる。
理屈は分からないけれどそういうものっぽい。
なのでServletContextからMANIFEST.MFを読み込んで取得する必要があるっぽい。

InputStream is = servletContext.getResourceAsStream("META-INF/MANIFEST.MF"));
Manifest manifest = new Manifest(is);
manifest.getMainAttributes().getValue("Implementation-Version");


ひとまずこれでライブラリのバージョンを取ることはできる。
あとは、war内で参照しているライブラリの一覧とか取れないもんだろうか。。