Java 9 で Package#getImplementationVersion() の動作確認をしたら、マニフェストファイル内の実装バージョンを返却してくれませんでした。
他の Java バージョンでも動作確認をしたので、その内容を記載していきます。
1. 動作確認
1.1. マニフェストファイル
動作確認用のマニフェストファイルは以下の通りです。
MANIFEST.MF
Manifest-Version: 1.0 Implementation-Version: 1.0.0 Build-Jdk-Spec: 1.8 Created-By: Maven JAR Plugin 3.3.0 Main-Class: org.sample.ver.Main
実装バージョンの値は 1.0.0 です。
1.2. 確認結果
メソッドの戻り値は以下の通りでした。
| Java | 戻り値 | JDK ベンダー |
|---|---|---|
| 9 | null | Oracle |
| 8(LTS) | 1.0.0 | Oracle, Amazon |
| 11(LTS) | 1.0.0 | Amazon |
| 17(LTS) | 1.0.0 | Amazon |
※ Java 8 だけ Oracle JDK と Amazon Corretto で検証しました。
2. 動作確認用アプリ
動作確認用のアプリは Java 8 でビルドしました。
2.1. ビルドファイル
Maven のビルドファイルは以下の通りです。
pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.sample</groupId>
<artifactId>impl-ver</artifactId>
<version>1.0.0</version>
<packaging>jar</packaging>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.3.0</version>
<configuration>
<archive>
<manifest>
<mainClass>org.sample.ver.Main</mainClass>
</manifest>
<manifestEntries>
<Implementation-Version>${project.version}</Implementation-Version>
</manifestEntries>
</archive>
</configuration>
</plugin>
</plugins>
</build>
</project>
2.2. プログラム
メソッドの戻り値を出力するコードを作成しました。
src/main/java/org/sample/ver/Main.java
package org.sample.ver; public class Main { public static void main(String[] args) { System.out.println( Main.class.getPackage().getImplementationVersion() ); } }
2.3. ビルドコマンド
以下のコマンドで jar を作成しました。
mvn clean package
2.4. アプリの実行
target フォルダで以下のコマンドを実行しました。
java -jar impl-ver-1.0.0.jar
3. Package クラスの仕様
Package クラスの JavaDoc を見ると、マニフェストファイルの情報を返すとは書かれていませんでした。
4. バージョンの持ち方について
もしかしたら、アプリのソース内やプロパティファイルでバージョンを保持したほうが安全なのかもしれません。
4.1. Tomcat の場合
Tomcat のソースを見たところ、プロパティファイルからバージョンを取得していました。